@fenglimg/fabric-server 1.5.1 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-E3RZ276F.js → chunk-4G6VFG5N.js} +198 -56
- package/dist/{http-BVF4GWIM.js → http-U4S7BUP4.js} +44 -15
- package/dist/index.d.ts +16 -1
- package/dist/index.js +167 -12
- package/dist/static/assets/{index-BRegf31x.js → index-D22ASzsl.js} +7 -7
- package/dist/static/index.html +1 -1
- package/package.json +3 -3
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const n of i)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function a(i){const n={};return i.integrity&&(n.integrity=i.integrity),i.referrerPolicy&&(n.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?n.credentials="include":i.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(i){if(i.ep)return;i.ep=!0;const n=a(i);fetch(i.href,n)}})();var it,L,xa,ne,Xt,Na,Sa,dt,je,Ce,Ca,Lt,vt,_t,Ta,Ze={},ze=[],cr=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,nt=Array.isArray;function K(t,e){for(var a in e)t[a]=e[a];return t}function Pt(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function ur(t,e,a){var r,i,n,o={};for(n in e)n=="key"?r=e[n]:n=="ref"?i=e[n]:o[n]=e[n];if(arguments.length>2&&(o.children=arguments.length>3?it.call(arguments,2):a),typeof t=="function"&&t.defaultProps!=null)for(n in t.defaultProps)o[n]===void 0&&(o[n]=t.defaultProps[n]);return Fe(t,o,r,i,null)}function Fe(t,e,a,r,i){var n={type:t,props:e,key:a,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++xa,__i:-1,__u:0};return i==null&&L.vnode!=null&&L.vnode(n),n}function st(t){return t.children}function Me(t,e){this.props=t,this.context=e}function be(t,e){if(e==null)return t.__?be(t.__,t.__i+1):null;for(var a;e<t.__k.length;e++)if((a=t.__k[e])!=null&&a.__e!=null)return a.__e;return typeof t.type=="function"?be(t):null}function hr(t){if(t.__P&&t.__d){var e=t.__v,a=e.__e,r=[],i=[],n=K({},e);n.__v=e.__v+1,L.vnode&&L.vnode(n),Ot(t.__P,n,e,t.__n,t.__P.namespaceURI,32&e.__u?[a]:null,r,a??be(e),!!(32&e.__u),i),n.__v=e.__v,n.__.__k[n.__i]=n,Ra(r,n,i),e.__e=e.__=null,n.__e!=a&&Aa(n)}}function Aa(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(e){if(e!=null&&e.__e!=null)return t.__e=t.__c.base=e.__e}),Aa(t)}function kt(t){(!t.__d&&(t.__d=!0)&&ne.push(t)&&!Ue.__r++||Xt!=L.debounceRendering)&&((Xt=L.debounceRendering)||Na)(Ue)}function Ue(){try{for(var t,e=1;ne.length;)ne.length>e&&ne.sort(Sa),t=ne.shift(),e=ne.length,hr(t)}finally{ne.length=Ue.__r=0}}function Ea(t,e,a,r,i,n,o,l,c,d,h){var u,g,p,y,C,w,x,_=r&&r.__k||ze,P=e.length;for(c=pr(a,e,_,c,P),u=0;u<P;u++)(p=a.__k[u])!=null&&(g=p.__i!=-1&&_[p.__i]||Ze,p.__i=u,w=Ot(t,p,g,i,n,o,l,c,d,h),y=p.__e,p.ref&&g.ref!=p.ref&&(g.ref&&jt(g.ref,null,p),h.push(p.ref,p.__c||y,p)),C==null&&y!=null&&(C=y),(x=!!(4&p.__u))||g.__k===p.__k?(c=Ia(p,c,t,x),x&&g.__e&&(g.__e=null)):typeof p.type=="function"&&w!==void 0?c=w:y&&(c=y.nextSibling),p.__u&=-7);return a.__e=C,c}function pr(t,e,a,r,i){var n,o,l,c,d,h=a.length,u=h,g=0;for(t.__k=new Array(i),n=0;n<i;n++)(o=e[n])!=null&&typeof o!="boolean"&&typeof o!="function"?(typeof o=="string"||typeof o=="number"||typeof o=="bigint"||o.constructor==String?o=t.__k[n]=Fe(null,o,null,null,null):nt(o)?o=t.__k[n]=Fe(st,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=t.__k[n]=Fe(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):t.__k[n]=o,c=n+g,o.__=t,o.__b=t.__b+1,l=null,(d=o.__i=mr(o,a,c,u))!=-1&&(u--,(l=a[d])&&(l.__u|=2)),l==null||l.__v==null?(d==-1&&(i>h?g--:i<h&&g++),typeof o.type!="function"&&(o.__u|=4)):d!=c&&(d==c-1?g--:d==c+1?g++:(d>c?g--:g++,o.__u|=4))):t.__k[n]=null;if(u)for(n=0;n<h;n++)(l=a[n])!=null&&(2&l.__u)==0&&(l.__e==r&&(r=be(l)),La(l,l));return r}function Ia(t,e,a,r){var i,n;if(typeof t.type=="function"){for(i=t.__k,n=0;i&&n<i.length;n++)i[n]&&(i[n].__=t,e=Ia(i[n],e,a,r));return e}t.__e!=e&&(r&&(e&&t.type&&!e.parentNode&&(e=be(t)),a.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function mr(t,e,a,r){var i,n,o,l=t.key,c=t.type,d=e[a],h=d!=null&&(2&d.__u)==0;if(d===null&&l==null||h&&l==d.key&&c==d.type)return a;if(r>(h?1:0)){for(i=a-1,n=a+1;i>=0||n<e.length;)if((d=e[o=i>=0?i--:n++])!=null&&(2&d.__u)==0&&l==d.key&&c==d.type)return o}return-1}function Yt(t,e,a){e[0]=="-"?t.setProperty(e,a??""):t[e]=a==null?"":typeof a!="number"||cr.test(e)?a:a+"px"}function $e(t,e,a,r,i){var n,o;e:if(e=="style")if(typeof a=="string")t.style.cssText=a;else{if(typeof r=="string"&&(t.style.cssText=r=""),r)for(e in r)a&&e in a||Yt(t.style,e,"");if(a)for(e in a)r&&a[e]==r[e]||Yt(t.style,e,a[e])}else if(e[0]=="o"&&e[1]=="n")n=e!=(e=e.replace(Ca,"$1")),o=e.toLowerCase(),e=o in t||e=="onFocusOut"||e=="onFocusIn"?o.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+n]=a,a?r?a[Ce]=r[Ce]:(a[Ce]=Lt,t.addEventListener(e,n?_t:vt,n)):t.removeEventListener(e,n?_t:vt,n);else{if(i=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=a??"";break e}catch{}typeof a=="function"||(a==null||a===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&a==1?"":a))}}function Jt(t){return function(e){if(this.l){var a=this.l[e.type+t];if(e[je]==null)e[je]=Lt++;else if(e[je]<a[Ce])return;return a(L.event?L.event(e):e)}}}function Ot(t,e,a,r,i,n,o,l,c,d){var h,u,g,p,y,C,w,x,_,P,H,Ne,qt,Re,lt,q=e.type;if(e.constructor!==void 0)return null;128&a.__u&&(c=!!(32&a.__u),n=[l=e.__e=a.__e]),(h=L.__b)&&h(e);e:if(typeof q=="function")try{if(x=e.props,_=q.prototype&&q.prototype.render,P=(h=q.contextType)&&r[h.__c],H=h?P?P.props.value:h.__:r,a.__c?w=(u=e.__c=a.__c).__=u.__E:(_?e.__c=u=new q(x,H):(e.__c=u=new Me(x,H),u.constructor=q,u.render=br),P&&P.sub(u),u.state||(u.state={}),u.__n=r,g=u.__d=!0,u.__h=[],u._sb=[]),_&&u.__s==null&&(u.__s=u.state),_&&q.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=K({},u.__s)),K(u.__s,q.getDerivedStateFromProps(x,u.__s))),p=u.props,y=u.state,u.__v=e,g)_&&q.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),_&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(_&&q.getDerivedStateFromProps==null&&x!==p&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(x,H),e.__v==a.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(x,u.__s,H)===!1){e.__v!=a.__v&&(u.props=x,u.state=u.__s,u.__d=!1),e.__e=a.__e,e.__k=a.__k,e.__k.some(function(me){me&&(me.__=e)}),ze.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&o.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(x,u.__s,H),_&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(p,y,C)})}if(u.context=H,u.props=x,u.__P=t,u.__e=!1,Ne=L.__r,qt=0,_)u.state=u.__s,u.__d=!1,Ne&&Ne(e),h=u.render(u.props,u.state,u.context),ze.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,Ne&&Ne(e),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++qt<25);u.state=u.__s,u.getChildContext!=null&&(r=K(K({},r),u.getChildContext())),_&&!g&&u.getSnapshotBeforeUpdate!=null&&(C=u.getSnapshotBeforeUpdate(p,y)),Re=h!=null&&h.type===st&&h.key==null?$a(h.props.children):h,l=Ea(t,nt(Re)?Re:[Re],e,a,r,i,n,o,l,c,d),u.base=e.__e,e.__u&=-161,u.__h.length&&o.push(u),w&&(u.__E=u.__=null)}catch(me){if(e.__v=null,c||n!=null)if(me.then){for(e.__u|=c?160:128;l&&l.nodeType==8&&l.nextSibling;)l=l.nextSibling;n[n.indexOf(l)]=null,e.__e=l}else{for(lt=n.length;lt--;)Pt(n[lt]);wt(e)}else e.__e=a.__e,e.__k=a.__k,me.then||wt(e);L.__e(me,e,a)}else n==null&&e.__v==a.__v?(e.__k=a.__k,e.__e=a.__e):l=e.__e=fr(a.__e,e,a,r,i,n,o,c,d);return(h=L.diffed)&&h(e),128&e.__u?void 0:l}function wt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(wt))}function Ra(t,e,a){for(var r=0;r<a.length;r++)jt(a[r],a[++r],a[++r]);L.__c&&L.__c(e,t),t.some(function(i){try{t=i.__h,i.__h=[],t.some(function(n){n.call(i)})}catch(n){L.__e(n,i.__v)}})}function $a(t){return typeof t!="object"||t==null||t.__b>0?t:nt(t)?t.map($a):K({},t)}function fr(t,e,a,r,i,n,o,l,c){var d,h,u,g,p,y,C,w=a.props||Ze,x=e.props,_=e.type;if(_=="svg"?i="http://www.w3.org/2000/svg":_=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),n!=null){for(d=0;d<n.length;d++)if((p=n[d])&&"setAttribute"in p==!!_&&(_?p.localName==_:p.nodeType==3)){t=p,n[d]=null;break}}if(t==null){if(_==null)return document.createTextNode(x);t=document.createElementNS(i,_,x.is&&x),l&&(L.__m&&L.__m(e,n),l=!1),n=null}if(_==null)w===x||l&&t.data==x||(t.data=x);else{if(n=n&&it.call(t.childNodes),!l&&n!=null)for(w={},d=0;d<t.attributes.length;d++)w[(p=t.attributes[d]).name]=p.value;for(d in w)p=w[d],d=="dangerouslySetInnerHTML"?u=p:d=="children"||d in x||d=="value"&&"defaultValue"in x||d=="checked"&&"defaultChecked"in x||$e(t,d,null,p,i);for(d in x)p=x[d],d=="children"?g=p:d=="dangerouslySetInnerHTML"?h=p:d=="value"?y=p:d=="checked"?C=p:l&&typeof p!="function"||w[d]===p||$e(t,d,p,w[d],i);if(h)l||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),e.__k=[];else if(u&&(t.innerHTML=""),Ea(e.type=="template"?t.content:t,nt(g)?g:[g],e,a,r,_=="foreignObject"?"http://www.w3.org/1999/xhtml":i,n,o,n?n[0]:a.__k&&be(a,0),l,c),n!=null)for(d=n.length;d--;)Pt(n[d]);l||(d="value",_=="progress"&&y==null?t.removeAttribute("value"):y!=null&&(y!==t[d]||_=="progress"&&!y||_=="option"&&y!=w[d])&&$e(t,d,y,w[d],i),d="checked",C!=null&&C!=t[d]&&$e(t,d,C,w[d],i))}return t}function jt(t,e,a){try{if(typeof t=="function"){var r=typeof t.__u=="function";r&&t.__u(),r&&e==null||(t.__u=t(e))}else t.current=e}catch(i){L.__e(i,a)}}function La(t,e,a){var r,i;if(L.unmount&&L.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||jt(r,null,e)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(n){L.__e(n,e)}r.base=r.__P=null}if(r=t.__k)for(i=0;i<r.length;i++)r[i]&&La(r[i],e,a||typeof t.type!="function");a||Pt(t.__e),t.__c=t.__=t.__e=void 0}function br(t,e,a){return this.constructor(t,a)}function gr(t,e,a){var r,i,n,o;e==document&&(e=document.documentElement),L.__&&L.__(t,e),i=(r=!1)?null:e.__k,n=[],o=[],Ot(e,t=e.__k=ur(st,null,[t]),i||Ze,Ze,e.namespaceURI,i?null:e.firstChild?it.call(e.childNodes):null,n,i?i.__e:e.firstChild,r,o),Ra(n,t,o)}function yr(t){function e(a){var r,i;return this.getChildContext||(r=new Set,(i={})[e.__c]=this,this.getChildContext=function(){return i},this.componentWillUnmount=function(){r=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&r.forEach(function(o){o.__e=!0,kt(o)})},this.sub=function(n){r.add(n);var o=n.componentWillUnmount;n.componentWillUnmount=function(){r&&r.delete(n),o&&o.call(n)}}),a.children}return e.__c="__cC"+Ta++,e.__=t,e.Provider=e.__l=(e.Consumer=function(a,r){return a.children(r)}).contextType=e,e}it=ze.slice,L={__e:function(t,e,a,r){for(var i,n,o;e=e.__;)if((i=e.__c)&&!i.__)try{if((n=i.constructor)&&n.getDerivedStateFromError!=null&&(i.setState(n.getDerivedStateFromError(t)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,r||{}),o=i.__d),o)return i.__E=i}catch(l){t=l}throw t}},xa=0,Me.prototype.setState=function(t,e){var a;a=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=K({},this.state),typeof t=="function"&&(t=t(K({},a),this.props)),t&&K(a,t),t!=null&&this.__v&&(e&&this._sb.push(e),kt(this))},Me.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),kt(this))},Me.prototype.render=st,ne=[],Na=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Sa=function(t,e){return t.__v.__b-e.__v.__b},Ue.__r=0,dt=Math.random().toString(8),je="__d"+dt,Ce="__a"+dt,Ca=/(PointerCapture)$|Capture$/i,Lt=0,vt=Jt(!1),_t=Jt(!0),Ta=0;var vr=0;function s(t,e,a,r,i,n){e||(e={});var o,l,c=e;if("ref"in c)for(l in c={},e)l=="ref"?o=e[l]:c[l]=e[l];var d={type:t,props:c,key:a,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--vr,__i:-1,__u:0,__source:i,__self:n};if(typeof t=="function"&&(o=t.defaultProps))for(l in o)c[l]===void 0&&(c[l]=o[l]);return L.vnode&&L.vnode(d),d}var ge,j,ct,Gt,He=0,Pa=[],F=L,Kt=F.__b,Qt=F.__r,ea=F.diffed,ta=F.__c,aa=F.unmount,ra=F.__;function ot(t,e){F.__h&&F.__h(j,t,He||e),He=0;var a=j.__H||(j.__H={__:[],__h:[]});return t>=a.__.length&&a.__.push({}),a.__[t]}function R(t){return He=1,_r(ja,t)}function _r(t,e,a){var r=ot(ge++,2);if(r.t=t,!r.__c&&(r.__=[ja(void 0,e),function(l){var c=r.__N?r.__N[0]:r.__[0],d=r.t(c,l);c!==d&&(r.__N=[d,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.__f)){var i=function(l,c,d){if(!r.__c.__H)return!0;var h=r.__c.__H.__.filter(function(g){return g.__c});if(h.every(function(g){return!g.__N}))return!n||n.call(this,l,c,d);var u=r.__c.props!==l;return h.some(function(g){if(g.__N){var p=g.__[0];g.__=g.__N,g.__N=void 0,p!==g.__[0]&&(u=!0)}}),n&&n.call(this,l,c,d)||u};j.__f=!0;var n=j.shouldComponentUpdate,o=j.componentWillUpdate;j.componentWillUpdate=function(l,c,d){if(this.__e){var h=n;n=void 0,i(l,c,d),n=h}o&&o.call(this,l,c,d)},j.shouldComponentUpdate=i}return r.__N||r.__}function Z(t,e){var a=ot(ge++,3);!F.__s&&Oa(a.__H,e)&&(a.__=t,a.u=e,j.__H.__h.push(a))}function Le(t){return He=5,Y(function(){return{current:t}},[])}function Y(t,e){var a=ot(ge++,7);return Oa(a.__H,e)&&(a.__=t(),a.__H=e,a.__h=t),a.__}function kr(t){var e=j.context[t.__c],a=ot(ge++,9);return a.c=t,e?(a.__==null&&(a.__=!0,e.sub(j)),e.props.value):t.__}function wr(){for(var t;t=Pa.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(De),e.__h.some(xt),e.__h=[]}catch(a){e.__h=[],F.__e(a,t.__v)}}}F.__b=function(t){j=null,Kt&&Kt(t)},F.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),ra&&ra(t,e)},F.__r=function(t){Qt&&Qt(t),ge=0;var e=(j=t.__c).__H;e&&(ct===j?(e.__h=[],j.__h=[],e.__.some(function(a){a.__N&&(a.__=a.__N),a.u=a.__N=void 0})):(e.__h.some(De),e.__h.some(xt),e.__h=[],ge=0)),ct=j},F.diffed=function(t){ea&&ea(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(Pa.push(e)!==1&&Gt===F.requestAnimationFrame||((Gt=F.requestAnimationFrame)||xr)(wr)),e.__H.__.some(function(a){a.u&&(a.__H=a.u),a.u=void 0})),ct=j=null},F.__c=function(t,e){e.some(function(a){try{a.__h.some(De),a.__h=a.__h.filter(function(r){return!r.__||xt(r)})}catch(r){e.some(function(i){i.__h&&(i.__h=[])}),e=[],F.__e(r,a.__v)}}),ta&&ta(t,e)},F.unmount=function(t){aa&&aa(t);var e,a=t.__c;a&&a.__H&&(a.__H.__.some(function(r){try{De(r)}catch(i){e=i}}),a.__H=void 0,e&&F.__e(e,a.__v))};var ia=typeof requestAnimationFrame=="function";function xr(t){var e,a=function(){clearTimeout(r),ia&&cancelAnimationFrame(e),setTimeout(t)},r=setTimeout(a,35);ia&&(e=requestAnimationFrame(a))}function De(t){var e=j,a=t.__c;typeof a=="function"&&(t.__c=void 0,a()),j=e}function xt(t){var e=j;t.__c=t.__(),j=e}function Oa(t,e){return!t||t.length!==e.length||e.some(function(a,r){return a!==t[r]})}function ja(t,e){return typeof e=="function"?e(t):e}var Nr=Symbol.for("preact-signals");function Ft(){if(ce>1)ce--;else{var t,e=!1;for((function(){var i=Be;for(Be=void 0;i!==void 0;)i.S.v===i.v&&(i.S.i=i.i),i=i.o})();Te!==void 0;){var a=Te;for(Te=void 0,Ve++;a!==void 0;){var r=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&Da(a))try{a.c()}catch(i){e||(t=i,e=!0)}a=r}}if(Ve=0,ce--,e)throw t}}var $=void 0;function Fa(t){var e=$;$=void 0;try{return t()}finally{$=e}}var Te=void 0,ce=0,Ve=0,na=0,Be=void 0,We=0;function Ma(t){if($!==void 0){var e=t.n;if(e===void 0||e.t!==$)return e={i:0,S:t,p:$.s,n:void 0,t:$,e:void 0,x:void 0,r:e},$.s!==void 0&&($.s.n=e),$.s=e,t.n=e,32&$.f&&t.S(e),e;if(e.i===-1)return e.i=0,e.n!==void 0&&(e.n.p=e.p,e.p!==void 0&&(e.p.n=e.n),e.p=$.s,e.n=void 0,$.s.n=e,$.s=e),e}}function U(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}U.prototype.brand=Nr;U.prototype.h=function(){return!0};U.prototype.S=function(t){var e=this,a=this.t;a!==t&&t.e===void 0&&(t.x=a,this.t=t,a!==void 0?a.e=t:Fa(function(){var r;(r=e.W)==null||r.call(e)}))};U.prototype.U=function(t){var e=this;if(this.t!==void 0){var a=t.e,r=t.x;a!==void 0&&(a.x=r,t.e=void 0),r!==void 0&&(r.e=a,t.x=void 0),t===this.t&&(this.t=r,r===void 0&&Fa(function(){var i;(i=e.Z)==null||i.call(e)}))}};U.prototype.subscribe=function(t){var e=this;return Cr(function(){var a=e.value,r=$;$=void 0;try{t(a)}finally{$=r}},{name:"sub"})};U.prototype.valueOf=function(){return this.value};U.prototype.toString=function(){return this.value+""};U.prototype.toJSON=function(){return this.value};U.prototype.peek=function(){var t=$;$=void 0;try{return this.value}finally{$=t}};Object.defineProperty(U.prototype,"value",{get:function(){var t=Ma(this);return t!==void 0&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(Ve>100)throw new Error("Cycle detected");(function(a){ce!==0&&Ve===0&&a.l!==na&&(a.l=na,Be={S:a,v:a.v,i:a.i,o:Be})})(this),this.v=t,this.i++,We++,ce++;try{for(var e=this.t;e!==void 0;e=e.x)e.t.N()}finally{Ft()}}}});function Mt(t,e){return new U(t,e)}function Da(t){for(var e=t.s;e!==void 0;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function Za(t){for(var e=t.s;e!==void 0;e=e.n){var a=e.S.n;if(a!==void 0&&(e.r=a),e.S.n=e,e.i=-1,e.n===void 0){t.s=e;break}}}function za(t){for(var e=t.s,a=void 0;e!==void 0;){var r=e.p;e.i===-1?(e.S.U(e),r!==void 0&&(r.n=e.n),e.n!==void 0&&(e.n.p=r)):a=e,e.S.n=e.r,e.r!==void 0&&(e.r=void 0),e=r}t.s=a}function _e(t,e){U.call(this,void 0),this.x=t,this.s=void 0,this.g=We-1,this.f=4,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}_e.prototype=new U;_e.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===We))return!0;if(this.g=We,this.f|=1,this.i>0&&!Da(this))return this.f&=-2,!0;var t=$;try{Za(this),$=this;var e=this.x();(16&this.f||this.v!==e||this.i===0)&&(this.v=e,this.f&=-17,this.i++)}catch(a){this.v=a,this.f|=16,this.i++}return $=t,za(this),this.f&=-2,!0};_e.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(var e=this.s;e!==void 0;e=e.n)e.S.S(e)}U.prototype.S.call(this,t)};_e.prototype.U=function(t){if(this.t!==void 0&&(U.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(var e=this.s;e!==void 0;e=e.n)e.S.U(e)}};_e.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;t!==void 0;t=t.x)t.t.N()}};Object.defineProperty(_e.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=Ma(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function Ua(t){var e=t.m;if(t.m=void 0,typeof e=="function"){ce++;var a=$;$=void 0;try{e()}catch(r){throw t.f&=-2,t.f|=8,Dt(t),r}finally{$=a,Ft()}}}function Dt(t){for(var e=t.s;e!==void 0;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,Ua(t)}function Sr(t){if($!==this)throw new Error("Out-of-order effect");za(this),$=t,this.f&=-2,8&this.f&&Dt(this),Ft()}function ke(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=e?.name}ke.prototype.c=function(){var t=this.S();try{if(8&this.f||this.x===void 0)return;var e=this.x();typeof e=="function"&&(this.m=e)}finally{t()}};ke.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,Ua(this),Za(this),ce++;var t=$;return $=this,Sr.bind(this,t)};ke.prototype.N=function(){2&this.f||(this.f|=2,this.u=Te,Te=this)};ke.prototype.d=function(){this.f|=8,1&this.f||Dt(this)};ke.prototype.dispose=function(){this.d()};function Cr(t,e){var a=new ke(t,e);try{a.c()}catch(i){throw a.d(),i}var r=a.d.bind(a);return r[Symbol.dispose]=r,r}async function Ha(){return await we("/api/rules")}async function Tr(t){const e=new URLSearchParams;return e.set("path",t),await we(Zt("/api/rules/context",e))}async function Va(t={}){const e=new URLSearchParams;return t.source!==void 0&&e.set("source",t.source),t.since!==void 0&&e.set("since",String(t.since)),await we(Zt("/api/ledger",e))}async function Ar(){return await we("/api/doctor")}async function Ba(){return await we("/api/human-lock")}async function Er(t){return await Wa("/api/human-lock/approve",t)}async function Ir(t){return await Wa("/api/intent/annotate",t)}async function Rr(t){const e=new URLSearchParams;return t.ledgerId!==void 0&&e.set("ledger_id",t.ledgerId),t.ts!==void 0&&e.set("ts",String(t.ts)),await we(Zt("/api/history/state",e))}let ie;function $r(t,e,a,r,i){let n=!1;const o=new AbortController;let l=!1;const c=zt({Accept:"text/event-stream"});return e!==null&&e.length>0&&(c["Last-Event-ID"]=e),(async()=>{try{const h=await fetch(t,{headers:c,signal:o.signal});if(!h.ok||h.body===null){d(()=>{i()});return}r();const u=h.body.getReader(),g=new TextDecoder;let p="";for(;!n;){const{done:y,value:C}=await u.read();if(y)break;p+=g.decode(C,{stream:!0}),p=p.replace(/\r\n/g,`
|
|
1
|
+
(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const n of i)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function a(i){const n={};return i.integrity&&(n.integrity=i.integrity),i.referrerPolicy&&(n.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?n.credentials="include":i.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(i){if(i.ep)return;i.ep=!0;const n=a(i);fetch(i.href,n)}})();var it,L,Na,ne,Yt,Sa,Ca,dt,je,Ce,Ta,Lt,vt,_t,Aa,Ze={},ze=[],hr=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,nt=Array.isArray;function K(t,e){for(var a in e)t[a]=e[a];return t}function Ot(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function pr(t,e,a){var r,i,n,o={};for(n in e)n=="key"?r=e[n]:n=="ref"?i=e[n]:o[n]=e[n];if(arguments.length>2&&(o.children=arguments.length>3?it.call(arguments,2):a),typeof t=="function"&&t.defaultProps!=null)for(n in t.defaultProps)o[n]===void 0&&(o[n]=t.defaultProps[n]);return Fe(t,o,r,i,null)}function Fe(t,e,a,r,i){var n={type:t,props:e,key:a,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++Na,__i:-1,__u:0};return i==null&&L.vnode!=null&&L.vnode(n),n}function st(t){return t.children}function Me(t,e){this.props=t,this.context=e}function be(t,e){if(e==null)return t.__?be(t.__,t.__i+1):null;for(var a;e<t.__k.length;e++)if((a=t.__k[e])!=null&&a.__e!=null)return a.__e;return typeof t.type=="function"?be(t):null}function mr(t){if(t.__P&&t.__d){var e=t.__v,a=e.__e,r=[],i=[],n=K({},e);n.__v=e.__v+1,L.vnode&&L.vnode(n),Pt(t.__P,n,e,t.__n,t.__P.namespaceURI,32&e.__u?[a]:null,r,a??be(e),!!(32&e.__u),i),n.__v=e.__v,n.__.__k[n.__i]=n,$a(r,n,i),e.__e=e.__=null,n.__e!=a&&Ea(n)}}function Ea(t){if((t=t.__)!=null&&t.__c!=null)return t.__e=t.__c.base=null,t.__k.some(function(e){if(e!=null&&e.__e!=null)return t.__e=t.__c.base=e.__e}),Ea(t)}function kt(t){(!t.__d&&(t.__d=!0)&&ne.push(t)&&!Ue.__r++||Yt!=L.debounceRendering)&&((Yt=L.debounceRendering)||Sa)(Ue)}function Ue(){try{for(var t,e=1;ne.length;)ne.length>e&&ne.sort(Ca),t=ne.shift(),e=ne.length,mr(t)}finally{ne.length=Ue.__r=0}}function Ia(t,e,a,r,i,n,o,l,c,d,h){var u,g,p,y,C,w,x,_=r&&r.__k||ze,O=e.length;for(c=fr(a,e,_,c,O),u=0;u<O;u++)(p=a.__k[u])!=null&&(g=p.__i!=-1&&_[p.__i]||Ze,p.__i=u,w=Pt(t,p,g,i,n,o,l,c,d,h),y=p.__e,p.ref&&g.ref!=p.ref&&(g.ref&&jt(g.ref,null,p),h.push(p.ref,p.__c||y,p)),C==null&&y!=null&&(C=y),(x=!!(4&p.__u))||g.__k===p.__k?(c=Ra(p,c,t,x),x&&g.__e&&(g.__e=null)):typeof p.type=="function"&&w!==void 0?c=w:y&&(c=y.nextSibling),p.__u&=-7);return a.__e=C,c}function fr(t,e,a,r,i){var n,o,l,c,d,h=a.length,u=h,g=0;for(t.__k=new Array(i),n=0;n<i;n++)(o=e[n])!=null&&typeof o!="boolean"&&typeof o!="function"?(typeof o=="string"||typeof o=="number"||typeof o=="bigint"||o.constructor==String?o=t.__k[n]=Fe(null,o,null,null,null):nt(o)?o=t.__k[n]=Fe(st,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=t.__k[n]=Fe(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):t.__k[n]=o,c=n+g,o.__=t,o.__b=t.__b+1,l=null,(d=o.__i=br(o,a,c,u))!=-1&&(u--,(l=a[d])&&(l.__u|=2)),l==null||l.__v==null?(d==-1&&(i>h?g--:i<h&&g++),typeof o.type!="function"&&(o.__u|=4)):d!=c&&(d==c-1?g--:d==c+1?g++:(d>c?g--:g++,o.__u|=4))):t.__k[n]=null;if(u)for(n=0;n<h;n++)(l=a[n])!=null&&(2&l.__u)==0&&(l.__e==r&&(r=be(l)),Oa(l,l));return r}function Ra(t,e,a,r){var i,n;if(typeof t.type=="function"){for(i=t.__k,n=0;i&&n<i.length;n++)i[n]&&(i[n].__=t,e=Ra(i[n],e,a,r));return e}t.__e!=e&&(r&&(e&&t.type&&!e.parentNode&&(e=be(t)),a.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function br(t,e,a,r){var i,n,o,l=t.key,c=t.type,d=e[a],h=d!=null&&(2&d.__u)==0;if(d===null&&l==null||h&&l==d.key&&c==d.type)return a;if(r>(h?1:0)){for(i=a-1,n=a+1;i>=0||n<e.length;)if((d=e[o=i>=0?i--:n++])!=null&&(2&d.__u)==0&&l==d.key&&c==d.type)return o}return-1}function Gt(t,e,a){e[0]=="-"?t.setProperty(e,a??""):t[e]=a==null?"":typeof a!="number"||hr.test(e)?a:a+"px"}function $e(t,e,a,r,i){var n,o;e:if(e=="style")if(typeof a=="string")t.style.cssText=a;else{if(typeof r=="string"&&(t.style.cssText=r=""),r)for(e in r)a&&e in a||Gt(t.style,e,"");if(a)for(e in a)r&&a[e]==r[e]||Gt(t.style,e,a[e])}else if(e[0]=="o"&&e[1]=="n")n=e!=(e=e.replace(Ta,"$1")),o=e.toLowerCase(),e=o in t||e=="onFocusOut"||e=="onFocusIn"?o.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+n]=a,a?r?a[Ce]=r[Ce]:(a[Ce]=Lt,t.addEventListener(e,n?_t:vt,n)):t.removeEventListener(e,n?_t:vt,n);else{if(i=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=a??"";break e}catch{}typeof a=="function"||(a==null||a===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&a==1?"":a))}}function Jt(t){return function(e){if(this.l){var a=this.l[e.type+t];if(e[je]==null)e[je]=Lt++;else if(e[je]<a[Ce])return;return a(L.event?L.event(e):e)}}}function Pt(t,e,a,r,i,n,o,l,c,d){var h,u,g,p,y,C,w,x,_,O,H,Ne,Xt,Re,lt,q=e.type;if(e.constructor!==void 0)return null;128&a.__u&&(c=!!(32&a.__u),n=[l=e.__e=a.__e]),(h=L.__b)&&h(e);e:if(typeof q=="function")try{if(x=e.props,_=q.prototype&&q.prototype.render,O=(h=q.contextType)&&r[h.__c],H=h?O?O.props.value:h.__:r,a.__c?w=(u=e.__c=a.__c).__=u.__E:(_?e.__c=u=new q(x,H):(e.__c=u=new Me(x,H),u.constructor=q,u.render=yr),O&&O.sub(u),u.state||(u.state={}),u.__n=r,g=u.__d=!0,u.__h=[],u._sb=[]),_&&u.__s==null&&(u.__s=u.state),_&&q.getDerivedStateFromProps!=null&&(u.__s==u.state&&(u.__s=K({},u.__s)),K(u.__s,q.getDerivedStateFromProps(x,u.__s))),p=u.props,y=u.state,u.__v=e,g)_&&q.getDerivedStateFromProps==null&&u.componentWillMount!=null&&u.componentWillMount(),_&&u.componentDidMount!=null&&u.__h.push(u.componentDidMount);else{if(_&&q.getDerivedStateFromProps==null&&x!==p&&u.componentWillReceiveProps!=null&&u.componentWillReceiveProps(x,H),e.__v==a.__v||!u.__e&&u.shouldComponentUpdate!=null&&u.shouldComponentUpdate(x,u.__s,H)===!1){e.__v!=a.__v&&(u.props=x,u.state=u.__s,u.__d=!1),e.__e=a.__e,e.__k=a.__k,e.__k.some(function(me){me&&(me.__=e)}),ze.push.apply(u.__h,u._sb),u._sb=[],u.__h.length&&o.push(u);break e}u.componentWillUpdate!=null&&u.componentWillUpdate(x,u.__s,H),_&&u.componentDidUpdate!=null&&u.__h.push(function(){u.componentDidUpdate(p,y,C)})}if(u.context=H,u.props=x,u.__P=t,u.__e=!1,Ne=L.__r,Xt=0,_)u.state=u.__s,u.__d=!1,Ne&&Ne(e),h=u.render(u.props,u.state,u.context),ze.push.apply(u.__h,u._sb),u._sb=[];else do u.__d=!1,Ne&&Ne(e),h=u.render(u.props,u.state,u.context),u.state=u.__s;while(u.__d&&++Xt<25);u.state=u.__s,u.getChildContext!=null&&(r=K(K({},r),u.getChildContext())),_&&!g&&u.getSnapshotBeforeUpdate!=null&&(C=u.getSnapshotBeforeUpdate(p,y)),Re=h!=null&&h.type===st&&h.key==null?La(h.props.children):h,l=Ia(t,nt(Re)?Re:[Re],e,a,r,i,n,o,l,c,d),u.base=e.__e,e.__u&=-161,u.__h.length&&o.push(u),w&&(u.__E=u.__=null)}catch(me){if(e.__v=null,c||n!=null)if(me.then){for(e.__u|=c?160:128;l&&l.nodeType==8&&l.nextSibling;)l=l.nextSibling;n[n.indexOf(l)]=null,e.__e=l}else{for(lt=n.length;lt--;)Ot(n[lt]);wt(e)}else e.__e=a.__e,e.__k=a.__k,me.then||wt(e);L.__e(me,e,a)}else n==null&&e.__v==a.__v?(e.__k=a.__k,e.__e=a.__e):l=e.__e=gr(a.__e,e,a,r,i,n,o,c,d);return(h=L.diffed)&&h(e),128&e.__u?void 0:l}function wt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(wt))}function $a(t,e,a){for(var r=0;r<a.length;r++)jt(a[r],a[++r],a[++r]);L.__c&&L.__c(e,t),t.some(function(i){try{t=i.__h,i.__h=[],t.some(function(n){n.call(i)})}catch(n){L.__e(n,i.__v)}})}function La(t){return typeof t!="object"||t==null||t.__b>0?t:nt(t)?t.map(La):K({},t)}function gr(t,e,a,r,i,n,o,l,c){var d,h,u,g,p,y,C,w=a.props||Ze,x=e.props,_=e.type;if(_=="svg"?i="http://www.w3.org/2000/svg":_=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),n!=null){for(d=0;d<n.length;d++)if((p=n[d])&&"setAttribute"in p==!!_&&(_?p.localName==_:p.nodeType==3)){t=p,n[d]=null;break}}if(t==null){if(_==null)return document.createTextNode(x);t=document.createElementNS(i,_,x.is&&x),l&&(L.__m&&L.__m(e,n),l=!1),n=null}if(_==null)w===x||l&&t.data==x||(t.data=x);else{if(n=n&&it.call(t.childNodes),!l&&n!=null)for(w={},d=0;d<t.attributes.length;d++)w[(p=t.attributes[d]).name]=p.value;for(d in w)p=w[d],d=="dangerouslySetInnerHTML"?u=p:d=="children"||d in x||d=="value"&&"defaultValue"in x||d=="checked"&&"defaultChecked"in x||$e(t,d,null,p,i);for(d in x)p=x[d],d=="children"?g=p:d=="dangerouslySetInnerHTML"?h=p:d=="value"?y=p:d=="checked"?C=p:l&&typeof p!="function"||w[d]===p||$e(t,d,p,w[d],i);if(h)l||u&&(h.__html==u.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),e.__k=[];else if(u&&(t.innerHTML=""),Ia(e.type=="template"?t.content:t,nt(g)?g:[g],e,a,r,_=="foreignObject"?"http://www.w3.org/1999/xhtml":i,n,o,n?n[0]:a.__k&&be(a,0),l,c),n!=null)for(d=n.length;d--;)Ot(n[d]);l||(d="value",_=="progress"&&y==null?t.removeAttribute("value"):y!=null&&(y!==t[d]||_=="progress"&&!y||_=="option"&&y!=w[d])&&$e(t,d,y,w[d],i),d="checked",C!=null&&C!=t[d]&&$e(t,d,C,w[d],i))}return t}function jt(t,e,a){try{if(typeof t=="function"){var r=typeof t.__u=="function";r&&t.__u(),r&&e==null||(t.__u=t(e))}else t.current=e}catch(i){L.__e(i,a)}}function Oa(t,e,a){var r,i;if(L.unmount&&L.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||jt(r,null,e)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(n){L.__e(n,e)}r.base=r.__P=null}if(r=t.__k)for(i=0;i<r.length;i++)r[i]&&Oa(r[i],e,a||typeof t.type!="function");a||Ot(t.__e),t.__c=t.__=t.__e=void 0}function yr(t,e,a){return this.constructor(t,a)}function vr(t,e,a){var r,i,n,o;e==document&&(e=document.documentElement),L.__&&L.__(t,e),i=(r=!1)?null:e.__k,n=[],o=[],Pt(e,t=e.__k=pr(st,null,[t]),i||Ze,Ze,e.namespaceURI,i?null:e.firstChild?it.call(e.childNodes):null,n,i?i.__e:e.firstChild,r,o),$a(n,t,o)}function _r(t){function e(a){var r,i;return this.getChildContext||(r=new Set,(i={})[e.__c]=this,this.getChildContext=function(){return i},this.componentWillUnmount=function(){r=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&r.forEach(function(o){o.__e=!0,kt(o)})},this.sub=function(n){r.add(n);var o=n.componentWillUnmount;n.componentWillUnmount=function(){r&&r.delete(n),o&&o.call(n)}}),a.children}return e.__c="__cC"+Aa++,e.__=t,e.Provider=e.__l=(e.Consumer=function(a,r){return a.children(r)}).contextType=e,e}it=ze.slice,L={__e:function(t,e,a,r){for(var i,n,o;e=e.__;)if((i=e.__c)&&!i.__)try{if((n=i.constructor)&&n.getDerivedStateFromError!=null&&(i.setState(n.getDerivedStateFromError(t)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,r||{}),o=i.__d),o)return i.__E=i}catch(l){t=l}throw t}},Na=0,Me.prototype.setState=function(t,e){var a;a=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=K({},this.state),typeof t=="function"&&(t=t(K({},a),this.props)),t&&K(a,t),t!=null&&this.__v&&(e&&this._sb.push(e),kt(this))},Me.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),kt(this))},Me.prototype.render=st,ne=[],Sa=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ca=function(t,e){return t.__v.__b-e.__v.__b},Ue.__r=0,dt=Math.random().toString(8),je="__d"+dt,Ce="__a"+dt,Ta=/(PointerCapture)$|Capture$/i,Lt=0,vt=Jt(!1),_t=Jt(!0),Aa=0;var kr=0;function s(t,e,a,r,i,n){e||(e={});var o,l,c=e;if("ref"in c)for(l in c={},e)l=="ref"?o=e[l]:c[l]=e[l];var d={type:t,props:c,key:a,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--kr,__i:-1,__u:0,__source:i,__self:n};if(typeof t=="function"&&(o=t.defaultProps))for(l in o)c[l]===void 0&&(c[l]=o[l]);return L.vnode&&L.vnode(d),d}var ge,j,ct,Kt,He=0,Pa=[],F=L,Qt=F.__b,ea=F.__r,ta=F.diffed,aa=F.__c,ra=F.unmount,ia=F.__;function ot(t,e){F.__h&&F.__h(j,t,He||e),He=0;var a=j.__H||(j.__H={__:[],__h:[]});return t>=a.__.length&&a.__.push({}),a.__[t]}function R(t){return He=1,wr(Fa,t)}function wr(t,e,a){var r=ot(ge++,2);if(r.t=t,!r.__c&&(r.__=[Fa(void 0,e),function(l){var c=r.__N?r.__N[0]:r.__[0],d=r.t(c,l);c!==d&&(r.__N=[d,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.__f)){var i=function(l,c,d){if(!r.__c.__H)return!0;var h=r.__c.__H.__.filter(function(g){return g.__c});if(h.every(function(g){return!g.__N}))return!n||n.call(this,l,c,d);var u=r.__c.props!==l;return h.some(function(g){if(g.__N){var p=g.__[0];g.__=g.__N,g.__N=void 0,p!==g.__[0]&&(u=!0)}}),n&&n.call(this,l,c,d)||u};j.__f=!0;var n=j.shouldComponentUpdate,o=j.componentWillUpdate;j.componentWillUpdate=function(l,c,d){if(this.__e){var h=n;n=void 0,i(l,c,d),n=h}o&&o.call(this,l,c,d)},j.shouldComponentUpdate=i}return r.__N||r.__}function Z(t,e){var a=ot(ge++,3);!F.__s&&ja(a.__H,e)&&(a.__=t,a.u=e,j.__H.__h.push(a))}function Le(t){return He=5,Y(function(){return{current:t}},[])}function Y(t,e){var a=ot(ge++,7);return ja(a.__H,e)&&(a.__=t(),a.__H=e,a.__h=t),a.__}function xr(t){var e=j.context[t.__c],a=ot(ge++,9);return a.c=t,e?(a.__==null&&(a.__=!0,e.sub(j)),e.props.value):t.__}function Nr(){for(var t;t=Pa.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(De),e.__h.some(xt),e.__h=[]}catch(a){e.__h=[],F.__e(a,t.__v)}}}F.__b=function(t){j=null,Qt&&Qt(t)},F.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),ia&&ia(t,e)},F.__r=function(t){ea&&ea(t),ge=0;var e=(j=t.__c).__H;e&&(ct===j?(e.__h=[],j.__h=[],e.__.some(function(a){a.__N&&(a.__=a.__N),a.u=a.__N=void 0})):(e.__h.some(De),e.__h.some(xt),e.__h=[],ge=0)),ct=j},F.diffed=function(t){ta&&ta(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(Pa.push(e)!==1&&Kt===F.requestAnimationFrame||((Kt=F.requestAnimationFrame)||Sr)(Nr)),e.__H.__.some(function(a){a.u&&(a.__H=a.u),a.u=void 0})),ct=j=null},F.__c=function(t,e){e.some(function(a){try{a.__h.some(De),a.__h=a.__h.filter(function(r){return!r.__||xt(r)})}catch(r){e.some(function(i){i.__h&&(i.__h=[])}),e=[],F.__e(r,a.__v)}}),aa&&aa(t,e)},F.unmount=function(t){ra&&ra(t);var e,a=t.__c;a&&a.__H&&(a.__H.__.some(function(r){try{De(r)}catch(i){e=i}}),a.__H=void 0,e&&F.__e(e,a.__v))};var na=typeof requestAnimationFrame=="function";function Sr(t){var e,a=function(){clearTimeout(r),na&&cancelAnimationFrame(e),setTimeout(t)},r=setTimeout(a,35);na&&(e=requestAnimationFrame(a))}function De(t){var e=j,a=t.__c;typeof a=="function"&&(t.__c=void 0,a()),j=e}function xt(t){var e=j;t.__c=t.__(),j=e}function ja(t,e){return!t||t.length!==e.length||e.some(function(a,r){return a!==t[r]})}function Fa(t,e){return typeof e=="function"?e(t):e}var Cr=Symbol.for("preact-signals");function Ft(){if(ce>1)ce--;else{var t,e=!1;for((function(){var i=Be;for(Be=void 0;i!==void 0;)i.S.v===i.v&&(i.S.i=i.i),i=i.o})();Te!==void 0;){var a=Te;for(Te=void 0,Ve++;a!==void 0;){var r=a.u;if(a.u=void 0,a.f&=-3,!(8&a.f)&&Za(a))try{a.c()}catch(i){e||(t=i,e=!0)}a=r}}if(Ve=0,ce--,e)throw t}}var $=void 0;function Ma(t){var e=$;$=void 0;try{return t()}finally{$=e}}var Te=void 0,ce=0,Ve=0,sa=0,Be=void 0,We=0;function Da(t){if($!==void 0){var e=t.n;if(e===void 0||e.t!==$)return e={i:0,S:t,p:$.s,n:void 0,t:$,e:void 0,x:void 0,r:e},$.s!==void 0&&($.s.n=e),$.s=e,t.n=e,32&$.f&&t.S(e),e;if(e.i===-1)return e.i=0,e.n!==void 0&&(e.n.p=e.p,e.p!==void 0&&(e.p.n=e.n),e.p=$.s,e.n=void 0,$.s.n=e,$.s=e),e}}function U(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}U.prototype.brand=Cr;U.prototype.h=function(){return!0};U.prototype.S=function(t){var e=this,a=this.t;a!==t&&t.e===void 0&&(t.x=a,this.t=t,a!==void 0?a.e=t:Ma(function(){var r;(r=e.W)==null||r.call(e)}))};U.prototype.U=function(t){var e=this;if(this.t!==void 0){var a=t.e,r=t.x;a!==void 0&&(a.x=r,t.e=void 0),r!==void 0&&(r.e=a,t.x=void 0),t===this.t&&(this.t=r,r===void 0&&Ma(function(){var i;(i=e.Z)==null||i.call(e)}))}};U.prototype.subscribe=function(t){var e=this;return Ar(function(){var a=e.value,r=$;$=void 0;try{t(a)}finally{$=r}},{name:"sub"})};U.prototype.valueOf=function(){return this.value};U.prototype.toString=function(){return this.value+""};U.prototype.toJSON=function(){return this.value};U.prototype.peek=function(){var t=$;$=void 0;try{return this.value}finally{$=t}};Object.defineProperty(U.prototype,"value",{get:function(){var t=Da(this);return t!==void 0&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(Ve>100)throw new Error("Cycle detected");(function(a){ce!==0&&Ve===0&&a.l!==sa&&(a.l=sa,Be={S:a,v:a.v,i:a.i,o:Be})})(this),this.v=t,this.i++,We++,ce++;try{for(var e=this.t;e!==void 0;e=e.x)e.t.N()}finally{Ft()}}}});function Mt(t,e){return new U(t,e)}function Za(t){for(var e=t.s;e!==void 0;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function za(t){for(var e=t.s;e!==void 0;e=e.n){var a=e.S.n;if(a!==void 0&&(e.r=a),e.S.n=e,e.i=-1,e.n===void 0){t.s=e;break}}}function Ua(t){for(var e=t.s,a=void 0;e!==void 0;){var r=e.p;e.i===-1?(e.S.U(e),r!==void 0&&(r.n=e.n),e.n!==void 0&&(e.n.p=r)):a=e,e.S.n=e.r,e.r!==void 0&&(e.r=void 0),e=r}t.s=a}function _e(t,e){U.call(this,void 0),this.x=t,this.s=void 0,this.g=We-1,this.f=4,this.W=e?.watched,this.Z=e?.unwatched,this.name=e?.name}_e.prototype=new U;_e.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if((36&this.f)==32||(this.f&=-5,this.g===We))return!0;if(this.g=We,this.f|=1,this.i>0&&!Za(this))return this.f&=-2,!0;var t=$;try{za(this),$=this;var e=this.x();(16&this.f||this.v!==e||this.i===0)&&(this.v=e,this.f&=-17,this.i++)}catch(a){this.v=a,this.f|=16,this.i++}return $=t,Ua(this),this.f&=-2,!0};_e.prototype.S=function(t){if(this.t===void 0){this.f|=36;for(var e=this.s;e!==void 0;e=e.n)e.S.S(e)}U.prototype.S.call(this,t)};_e.prototype.U=function(t){if(this.t!==void 0&&(U.prototype.U.call(this,t),this.t===void 0)){this.f&=-33;for(var e=this.s;e!==void 0;e=e.n)e.S.U(e)}};_e.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;t!==void 0;t=t.x)t.t.N()}};Object.defineProperty(_e.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=Da(this);if(this.h(),t!==void 0&&(t.i=this.i),16&this.f)throw this.v;return this.v}});function Ha(t){var e=t.m;if(t.m=void 0,typeof e=="function"){ce++;var a=$;$=void 0;try{e()}catch(r){throw t.f&=-2,t.f|=8,Dt(t),r}finally{$=a,Ft()}}}function Dt(t){for(var e=t.s;e!==void 0;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,Ha(t)}function Tr(t){if($!==this)throw new Error("Out-of-order effect");Ua(this),$=t,this.f&=-2,8&this.f&&Dt(this),Ft()}function ke(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=e?.name}ke.prototype.c=function(){var t=this.S();try{if(8&this.f||this.x===void 0)return;var e=this.x();typeof e=="function"&&(this.m=e)}finally{t()}};ke.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,Ha(this),za(this),ce++;var t=$;return $=this,Tr.bind(this,t)};ke.prototype.N=function(){2&this.f||(this.f|=2,this.u=Te,Te=this)};ke.prototype.d=function(){this.f|=8,1&this.f||Dt(this)};ke.prototype.dispose=function(){this.d()};function Ar(t,e){var a=new ke(t,e);try{a.c()}catch(i){throw a.d(),i}var r=a.d.bind(a);return r[Symbol.dispose]=r,r}async function Va(){return await we("/api/rules")}async function Er(t){const e=new URLSearchParams;return e.set("path",t),await we(Zt("/api/rules/context",e))}async function Ba(t={}){const e=new URLSearchParams;return t.source!==void 0&&e.set("source",t.source),t.since!==void 0&&e.set("since",String(t.since)),await we(Zt("/api/ledger",e))}async function Ir(){return await we("/api/doctor")}async function Wa(){return await we("/api/human-lock")}async function Rr(t){return await qa("/api/human-lock/approve",t)}async function $r(t){return await qa("/api/intent/annotate",t)}async function Lr(t){const e=new URLSearchParams;return t.ledgerId!==void 0&&e.set("ledger_id",t.ledgerId),t.ts!==void 0&&e.set("ts",String(t.ts)),await we(Zt("/api/history/state",e))}let ie;function Or(t,e,a,r,i){let n=!1;const o=new AbortController;let l=!1;const c=zt({Accept:"text/event-stream"});return e!==null&&e.length>0&&(c["Last-Event-ID"]=e),(async()=>{try{const h=await fetch(t,{headers:c,signal:o.signal});if(!h.ok||h.body===null){d(()=>{i()});return}r();const u=h.body.getReader(),g=new TextDecoder;let p="";for(;!n;){const{done:y,value:C}=await u.read();if(y)break;p+=g.decode(C,{stream:!0}),p=p.replace(/\r\n/g,`
|
|
2
2
|
`);let w;for(;(w=p.indexOf(`
|
|
3
3
|
|
|
4
|
-
`))>=0;){const x=p.slice(0,w);p=p.slice(w+2),
|
|
4
|
+
`))>=0;){const x=p.slice(0,w);p=p.slice(w+2),Pr(x,a)}}}catch{}finally{n||d(()=>{i()})}})(),{close(){n=!0,o.abort()}};function d(h){l||(l=!0,h())}}function Pr(t,e){let a="message",r="",i="";for(const n of t.split(`
|
|
5
5
|
`))n.startsWith("event:")?a=n.slice(6).trim():n.startsWith("data:")?r=r.length>0?`${r}
|
|
6
|
-
${n.slice(5).trim()}`:n.slice(5).trim():n.startsWith("id:")&&(i=n.slice(3).trim());r.length>0&&e(a,r,i)}function Pr(){if(ie!==void 0)return ie;const e=window.__FABRIC_AUTH_TOKEN__;if(typeof e=="string"&&e.length>0)return ie=e,ie;const a=new URL(window.location.href),r=a.searchParams,i=r.get("token");if(i!==null&&i.length>0){r.delete("token");const n=r.toString(),o=`${a.pathname}${n.length>0?`?${n}`:""}${a.hash}`;return window.history.replaceState({},document.title,o),ie=i,ie}return ie=null,ie}function Or(t){try{const e=JSON.parse(t);return typeof e.type=="string"&&"payload"in e?e:null}catch{return null}}async function we(t){const e=await fetch(t,{headers:zt({Accept:"application/json"})});return await qa(e)}async function Wa(t,e){const a=await fetch(t,{method:"POST",headers:zt({Accept:"application/json","Content-Type":"application/json"}),body:JSON.stringify(e)});return await qa(a)}async function qa(t){const e=await t.text(),a=e.length>0?JSON.parse(e):void 0;if(!t.ok)throw new Error(jr(a,t.status));return a}function jr(t,e){return t&&typeof t=="object"&&"error"in t&&typeof t.error?.message=="string"?t.error.message:`Fabric API request failed with HTTP ${e}.`}function Zt(t,e){const a=e.toString();return a.length>0?`${t}?${a}`:t}function zt(t){const e=Pr();return e===null?t:{...t,Authorization:`Bearer ${e}`}}const Fr=["meta:updated","lock:drift","lock:approved","ledger:appended","drift:detected"],Mr=new Set(Fr),ut=Mt([]),ht=Mt(!1),pt=Mt(0),sa=1e3,Dr=3e4,Zr=2;function zr(){const[t,e]=R({connected:ht.value,lastEvent:ut.value[0]??null,version:pt.value}),a=Le(null),r=Le(sa),i=Le(void 0),n=Le(!0);return Z(()=>{n.current=!0;const o=h=>{ht.value=h,e(u=>({...u,connected:h}))},l=(h,u,g)=>{if(!Mr.has(h))return;g.length>0&&(a.current=g);const p=Or(u);p!==null&&(ut.value=[p,...ut.value].slice(0,50),pt.value+=1,e({connected:ht.value,lastEvent:p,version:pt.value}))};let c=null;const d=()=>{n.current&&(c=$r("/events",a.current,l,()=>{n.current&&(r.current=sa,o(!0))},()=>{if(!n.current)return;o(!1);const h=r.current;r.current=Math.min(r.current*Zr,Dr),i.current=setTimeout(d,h)}))};return d(),()=>{n.current=!1,clearTimeout(i.current),c?.close(),o(!1)}},[]),t}var Ur={"cli.main.description":"Fabric CLI - AI agent collaboration framework","cli.shared.created":"Created","cli.shared.skipped":"Skipped","cli.shared.next":"Next","cli.shared.reason":"Reason","cli.shared.updated":"Updated","cli.shared.missing":"missing","cli.shared.present":"present","cli.shared.absent":"missing","cli.shared.yes":"yes","cli.shared.no":"no","cli.shared.none":"none","cli.shared.loading":"loading","cli.shared.refresh":"Refresh","cli.shared.target-invalid":"Target must be an existing directory: {target}","cli.shared.template-not-found":"Template not found: {path}","cli.shared.invalid-host-empty":"Invalid host: <empty>","cli.shared.invalid-port":"Invalid port: {value}","cli.approve.description":"Approve drifted human-lock entries from the command line.","cli.approve.args.all.description":"Approve all drifted human-lock entries without prompting.","cli.approve.args.interactive.description":"Prompt before approving each drifted human-lock entry.","cli.approve.args.target.description":"Target project path, default is the current working directory.","cli.approve.no-drift":"No drift entries found.","cli.approve.prompt":"Approve this entry? [y/N] ","cli.approve.approved-one":"Approved {location}","cli.approve.skipped-one":"Skipped {location}","cli.approve.summary":"Approved {approved}/{total} drift entries. Skipped {skipped}.","cli.approve.table.expected":"Expected","cli.approve.table.current":"Current","cli.bootstrap.description":"Install Fabric bootstrap prompts for supported AI clients.","cli.bootstrap.install.description":"Copy Fabric bootstrap templates into native client locations.","cli.bootstrap.install.args.clients.description":"Optional comma-separated client filter, for example claude,cursor,codex.","cli.bootstrap.install.no-targets":"No bootstrap targets detected. Pass --clients claude,cursor,windsurf,roo,gemini,codex to install explicitly.","cli.bootstrap.install.installed":"Installed {path}","cli.bootstrap.install.skipped-header":"Skipped {path}: Fabric Bootstrap header already present.","cli.bootstrap.install.prepended":"Prepended {path}","cli.bootstrap.errors.unknown-client":'Unknown client "{client}". Use a comma-separated list such as claude,cursor,codex.',"cli.config.description":"Manage Fabric MCP client configuration.","cli.config.clients.claude":"Claude Code CLI","cli.config.install.description":"Install Fabric MCP server entries into detected client configs.","cli.config.install.args.clients.description":"Optional comma-separated client filter, for example cursor,codex,gemini.","cli.config.install.args.dry-run.description":"Preview detected write operations without modifying files.","cli.config.errors.unknown-client":'Unknown client "{client}". Use a comma-separated list such as cursor,codex,gemini.',"cli.config.errors.expected-object":"Expected object in {path}","cli.config.install.no-configs":"No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.","cli.config.install.no-config-path":"Skipping {client}: no config path detected.","cli.config.install.dry-run":"[dry-run] {client}: would write {path}","cli.config.install.wrote":"{client}: wrote {path}","cli.doctor.description":"Run Fabric doctor checks and optional compliance audit reporting.","cli.doctor.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.doctor.args.audit.description":"Print fab_get_rules compliance violations for AI edit intents.","cli.doctor.args.window-minutes.description":"Audit lookback window in minutes for matching fab_get_rules calls. Default 5.","cli.doctor.errors.invalid-window":"Invalid audit window: {value}","cli.doctor.audit.preview-only":"auditMode is off in fabric.config.json; running fab doctor --audit as a manual preview only.","cli.doctor.audit.none":"No AI edit intents recorded yet for compliance audit.","cli.doctor.audit.clean":"All {count} audited edit paths have a preceding fab_get_rules call within {window}.","cli.doctor.audit.violations":"{count} audited edit paths are missing a preceding fab_get_rules call within {window}.","cli.doctor.audit.table.path":"Path","cli.doctor.audit.table.edit":"Edit time","cli.doctor.audit.table.rules":"Last rules","cli.doctor.audit.table.intent":"Intent","cli.hooks.description":"Manage Fabric Git hook templates.","cli.hooks.install.description":"Install the Fabric Husky pre-commit hook template.","cli.hooks.install.args.target.description":"Target project path, default is the current working directory.","cli.hooks.errors.package-json-required":"package.json is required to install hooks: {path}","cli.hooks.install.hook-skipped":"Fabric hook already present in {path}, skipped.","cli.hooks.install.hook-appended":"Appended Fabric hook to existing {path}","cli.hooks.install.hook-created":"Created {path}","cli.hooks.install.prepare-left":"Left existing prepare script unchanged in {path}","cli.hooks.install.prepare-added":"Added prepare script to {path}","cli.human-lint.description":"Validate locked human-edit regions.","cli.human-lint.args.target.description":"Target project path, default is the current working directory.","cli.human-lint.drift-detected":"Human-locked content drift detected. Revert the edit or update approved hashes before committing.","cli.human-lint.table.location":"Location","cli.human-lint.table.expected":"Expected","cli.human-lint.table.got":"Got","cli.init.description":"Initialize Fabric in the target project.","cli.init.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.init.args.debug.description":"Print target resolution details to stderr.","cli.init.args.force.description":"Overwrite existing files (bypass non-destructive guard)","cli.init.args.yes.description":"Accept the current init plan and run without the TTY wizard","cli.init.args.plan.description":"Print the init plan without writing files or running follow-up stages","cli.init.args.reapply.description":"Reapply Fabric-managed files and stage installers over an existing setup","cli.init.args.no-bootstrap.description":"Compatibility flag: remove bootstrap from the init plan","cli.init.args.no-mcp.description":"Compatibility flag: remove MCP configuration from the init plan","cli.init.args.no-hooks.description":"Compatibility flag: remove git hooks from the init plan","cli.init.args.interactive.description":"Compatibility flag: disable the TTY wizard and use direct execution","cli.init.mcp.install.global":"Using globally-installed @fenglimg/fabric-server","cli.init.mcp.install.local":"Installing @fenglimg/fabric-server to project devDependencies","cli.init.mcp.install.prompt":"MCP server install scope (global|local)","cli.init.mcp.install.invalid":'Invalid --mcp-install value "{value}" — falling back to global',"cli.init.mcp.local.installing":"Running {manager} add -D @fenglimg/fabric-server...","cli.init.mcp.local.installed":"Installed to devDependencies","cli.init.created-path":"{label} {path}","cli.init.skipped-existing-path":"{label} {path}: already exists.","cli.init.force.overwritten":"Overwritten","cli.init.force.warning":"--force will overwrite existing Fabric artifacts in {path}","cli.init.stages.bootstrap":"Installing bootstrap templates...","cli.init.stages.mcp":"Configuring MCP clients...","cli.init.stages.hooks":"Installing git hooks...","cli.init.stages.skipped":"skipped","cli.init.stages.completed":"completed","cli.init.stages.failed":"failed","cli.init.stages.summary.ran":"ran","cli.init.stages.summary.skipped":"skipped","cli.init.stages.summary.failed":"failed","cli.init.next-step":"{label} {message}","cli.init.reason-message":"{label} {message}","cli.init.plan.title":"Fabric init plan","cli.init.plan.mode-banner.default":"[mode: apply] Standard init execution","cli.init.plan.mode-banner.plan":"[mode: plan] Dry run only, no files will be written","cli.init.plan.mode-banner.reapply":"[mode: reapply] Force reapplying Fabric-managed assets","cli.init.plan.mode-banner.plan-reapply":"[mode: plan+reapply] Previewing a forced reapply without writing files","cli.init.plan.target":"Target: {target}","cli.init.plan.actions":"Plan: bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}","cli.init.plan.detected":"Detected clients: {clients}","cli.init.plan.writes":"Core writes:","cli.init.plan.preview-title":"Fabric init dry run","cli.init.plan.preview-result":"Mode={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}","cli.init.mode.default":"default","cli.init.mode.reapply":"reapply","cli.init.mode.badge.default":"APPLY","cli.init.mode.badge.plan":"PLAN","cli.init.mode.badge.reapply":"REAPPLY","cli.init.mode.badge.plan-reapply":"PLAN + REAPPLY","cli.init.compat.plan":"Using standard --plan mode: no files will be written.","cli.init.compat.interactive":"Compatibility: --interactive=false disables the TTY wizard.","cli.init.compat.legacy-stage-flags":"Compatibility: legacy --no-* flags are being mapped into the init plan.","cli.init.wizard.title":"Fabric init wizard","cli.init.wizard.intro":"Fabric init","cli.init.wizard.overview.title":"Install overview","cli.init.wizard.overview.body":`Target: {target}
|
|
6
|
+
${n.slice(5).trim()}`:n.slice(5).trim():n.startsWith("id:")&&(i=n.slice(3).trim());r.length>0&&e(a,r,i)}function jr(){if(ie!==void 0)return ie;const e=window.__FABRIC_AUTH_TOKEN__;if(typeof e=="string"&&e.length>0)return ie=e,ie;const a=new URL(window.location.href),r=a.searchParams,i=r.get("token");if(i!==null&&i.length>0){r.delete("token");const n=r.toString(),o=`${a.pathname}${n.length>0?`?${n}`:""}${a.hash}`;return window.history.replaceState({},document.title,o),ie=i,ie}return ie=null,ie}function Fr(t){try{const e=JSON.parse(t);return typeof e.type=="string"&&"payload"in e?e:null}catch{return null}}async function we(t){const e=await fetch(t,{headers:zt({Accept:"application/json"})});return await Xa(e)}async function qa(t,e){const a=await fetch(t,{method:"POST",headers:zt({Accept:"application/json","Content-Type":"application/json"}),body:JSON.stringify(e)});return await Xa(a)}async function Xa(t){const e=await t.text(),a=e.length>0?JSON.parse(e):void 0;if(!t.ok)throw new Error(Mr(a,t.status));return a}function Mr(t,e){return t&&typeof t=="object"&&"error"in t&&typeof t.error?.message=="string"?t.error.message:`Fabric API request failed with HTTP ${e}.`}function Zt(t,e){const a=e.toString();return a.length>0?`${t}?${a}`:t}function zt(t){const e=jr();return e===null?t:{...t,Authorization:`Bearer ${e}`}}const Dr=["meta:updated","lock:drift","lock:approved","ledger:appended","drift:detected"],Zr=new Set(Dr),ut=Mt([]),ht=Mt(!1),pt=Mt(0),oa=1e3,zr=3e4,Ur=2;function Hr(){const[t,e]=R({connected:ht.value,lastEvent:ut.value[0]??null,version:pt.value}),a=Le(null),r=Le(oa),i=Le(void 0),n=Le(!0);return Z(()=>{n.current=!0;const o=h=>{ht.value=h,e(u=>({...u,connected:h}))},l=(h,u,g)=>{if(!Zr.has(h))return;g.length>0&&(a.current=g);const p=Fr(u);p!==null&&(ut.value=[p,...ut.value].slice(0,50),pt.value+=1,e({connected:ht.value,lastEvent:p,version:pt.value}))};let c=null;const d=()=>{n.current&&(c=Or("/events",a.current,l,()=>{n.current&&(r.current=oa,o(!0))},()=>{if(!n.current)return;o(!1);const h=r.current;r.current=Math.min(r.current*Ur,zr),i.current=setTimeout(d,h)}))};return d(),()=>{n.current=!1,clearTimeout(i.current),c?.close(),o(!1)}},[]),t}var Vr={"cli.main.description":"Fabric CLI - AI agent collaboration framework","cli.shared.created":"Created","cli.shared.skipped":"Skipped","cli.shared.next":"Next","cli.shared.reason":"Reason","cli.shared.updated":"Updated","cli.shared.missing":"missing","cli.shared.present":"present","cli.shared.absent":"missing","cli.shared.yes":"yes","cli.shared.no":"no","cli.shared.none":"none","cli.shared.loading":"loading","cli.shared.refresh":"Refresh","cli.shared.target-invalid":"Target must be an existing directory: {target}","cli.shared.template-not-found":"Template not found: {path}","cli.shared.invalid-host-empty":"Invalid host: <empty>","cli.shared.invalid-port":"Invalid port: {value}","cli.approve.description":"Approve drifted human-lock entries from the command line.","cli.approve.args.all.description":"Approve all drifted human-lock entries without prompting.","cli.approve.args.interactive.description":"Prompt before approving each drifted human-lock entry.","cli.approve.args.target.description":"Target project path, default is the current working directory.","cli.approve.no-drift":"No drift entries found.","cli.approve.prompt":"Approve this entry? [y/N] ","cli.approve.approved-one":"Approved {location}","cli.approve.skipped-one":"Skipped {location}","cli.approve.summary":"Approved {approved}/{total} drift entries. Skipped {skipped}.","cli.approve.table.expected":"Expected","cli.approve.table.current":"Current","cli.bootstrap.description":"Install Fabric bootstrap prompts for supported AI clients.","cli.bootstrap.install.description":"Copy Fabric bootstrap templates into native client locations.","cli.bootstrap.install.args.clients.description":"Optional comma-separated client filter, for example claude,cursor,codex.","cli.bootstrap.install.no-targets":"No bootstrap targets detected. Pass --clients claude,cursor,windsurf,roo,gemini,codex to install explicitly.","cli.bootstrap.install.installed":"Installed {path}","cli.bootstrap.install.skipped-header":"Skipped {path}: Fabric Bootstrap header already present.","cli.bootstrap.install.prepended":"Prepended {path}","cli.bootstrap.errors.unknown-client":'Unknown client "{client}". Use a comma-separated list such as claude,cursor,codex.',"cli.config.description":"Manage Fabric MCP client configuration.","cli.config.clients.claude":"Claude Code CLI","cli.config.install.description":"Install Fabric MCP server entries into detected client configs.","cli.config.install.args.clients.description":"Optional comma-separated client filter, for example cursor,codex,gemini.","cli.config.install.args.dry-run.description":"Preview detected write operations without modifying files.","cli.config.errors.unknown-client":'Unknown client "{client}". Use a comma-separated list such as cursor,codex,gemini.',"cli.config.errors.expected-object":"Expected object in {path}","cli.config.install.no-configs":"No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.","cli.config.install.no-config-path":"Skipping {client}: no config path detected.","cli.config.install.dry-run":"[dry-run] {client}: would write {path}","cli.config.install.wrote":"{client}: wrote {path}","cli.doctor.description":"Run Fabric doctor checks and optional compliance audit reporting.","cli.doctor.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.doctor.args.audit.description":"Print fab_get_rules compliance violations for AI edit intents.","cli.doctor.args.fix.description":"Migrate the legacy root ledger into .fabric/.intent-ledger.jsonl when needed.","cli.doctor.args.window-minutes.description":"Audit lookback window in minutes for matching fab_get_rules calls. Default 5.","cli.doctor.errors.invalid-window":"Invalid audit window: {value}","cli.doctor.audit.preview-only":"auditMode is off in fabric.config.json; running fab doctor --audit as a manual preview only.","cli.doctor.audit.none":"No AI edit intents recorded yet for compliance audit.","cli.doctor.audit.clean":"All {count} audited edit paths have a preceding fab_get_rules call within {window}.","cli.doctor.audit.violations":"{count} audited edit paths are missing a preceding fab_get_rules call within {window}.","cli.doctor.audit.table.path":"Path","cli.doctor.audit.table.edit":"Edit time","cli.doctor.audit.table.rules":"Last rules","cli.doctor.audit.table.intent":"Intent","cli.hooks.description":"Manage Fabric Git hook templates.","cli.hooks.install.description":"Install the Fabric Husky pre-commit hook template.","cli.hooks.install.args.target.description":"Target project path, default is the current working directory.","cli.hooks.errors.package-json-required":"package.json is required to install hooks: {path}","cli.hooks.install.hook-skipped":"Fabric hook already present in {path}, skipped.","cli.hooks.install.hook-appended":"Appended Fabric hook to existing {path}","cli.hooks.install.hook-created":"Created {path}","cli.hooks.install.prepare-left":"Left existing prepare script unchanged in {path}","cli.hooks.install.prepare-added":"Added prepare script to {path}","cli.human-lint.description":"Validate locked human-edit regions.","cli.human-lint.args.target.description":"Target project path, default is the current working directory.","cli.human-lint.drift-detected":"Human-locked content drift detected. Revert the edit or update approved hashes before committing.","cli.human-lint.table.location":"Location","cli.human-lint.table.expected":"Expected","cli.human-lint.table.got":"Got","cli.init.description":"Initialize Fabric in the target project.","cli.init.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.init.args.debug.description":"Print target resolution details to stderr.","cli.init.args.force.description":"Overwrite existing files (bypass non-destructive guard)","cli.init.args.yes.description":"Accept the current init plan and run without the TTY wizard","cli.init.args.plan.description":"Print the init plan without writing files or running follow-up stages","cli.init.args.reapply.description":"Reapply Fabric-managed files and stage installers over an existing setup","cli.init.args.no-bootstrap.description":"Compatibility flag: remove bootstrap from the init plan","cli.init.args.no-mcp.description":"Compatibility flag: remove MCP configuration from the init plan","cli.init.args.no-hooks.description":"Compatibility flag: remove git hooks from the init plan","cli.init.args.interactive.description":"Compatibility flag: disable the TTY wizard and use direct execution","cli.init.mcp.install.global":"Using globally-installed @fenglimg/fabric-server","cli.init.mcp.install.local":"Installing @fenglimg/fabric-server to project devDependencies","cli.init.mcp.install.prompt":"MCP server install scope (global|local)","cli.init.mcp.install.invalid":'Invalid --mcp-install value "{value}" — falling back to global',"cli.init.mcp.local.installing":"Running {manager} add -D @fenglimg/fabric-server...","cli.init.mcp.local.installed":"Installed to devDependencies","cli.init.created-path":"{label} {path}","cli.init.skipped-existing-path":"{label} {path}: already exists.","cli.init.force.overwritten":"Overwritten","cli.init.force.warning":"--force will overwrite existing Fabric artifacts in {path}","cli.init.stages.bootstrap":"Installing bootstrap templates...","cli.init.stages.mcp":"Configuring MCP clients...","cli.init.stages.hooks":"Installing git hooks...","cli.init.stages.skipped":"skipped","cli.init.stages.completed":"completed","cli.init.stages.failed":"failed","cli.init.stages.summary.ran":"ran","cli.init.stages.summary.skipped":"skipped","cli.init.stages.summary.failed":"failed","cli.init.next-step":"{label} {message}","cli.init.reason-message":"{label} {message}","cli.init.plan.title":"Fabric init plan","cli.init.plan.mode-banner.default":"[mode: apply] Standard init execution","cli.init.plan.mode-banner.plan":"[mode: plan] Dry run only, no files will be written","cli.init.plan.mode-banner.reapply":"[mode: reapply] Force reapplying Fabric-managed assets","cli.init.plan.mode-banner.plan-reapply":"[mode: plan+reapply] Previewing a forced reapply without writing files","cli.init.plan.target":"Target: {target}","cli.init.plan.actions":"Plan: bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}","cli.init.plan.detected":"Detected clients: {clients}","cli.init.plan.writes":"Core writes:","cli.init.plan.preview-title":"Fabric init dry run","cli.init.plan.preview-result":"Mode={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}","cli.init.mode.default":"default","cli.init.mode.reapply":"reapply","cli.init.mode.badge.default":"APPLY","cli.init.mode.badge.plan":"PLAN","cli.init.mode.badge.reapply":"REAPPLY","cli.init.mode.badge.plan-reapply":"PLAN + REAPPLY","cli.init.compat.plan":"Using standard --plan mode: no files will be written.","cli.init.compat.interactive":"Compatibility: --interactive=false disables the TTY wizard.","cli.init.compat.legacy-stage-flags":"Compatibility: legacy --no-* flags are being mapped into the init plan.","cli.init.wizard.title":"Fabric init wizard","cli.init.wizard.intro":"Fabric init","cli.init.wizard.overview.title":"Install overview","cli.init.wizard.overview.body":`Target: {target}
|
|
7
7
|
Mode: {mode}
|
|
8
|
-
This wizard only reshapes the init plan; execution still runs through the existing Fabric init stages.`,"cli.init.wizard.step.target":"Confirm target","cli.init.wizard.step.plan":"Shape init plan","cli.init.wizard.step.review":"Review final plan","cli.init.wizard.target.confirm":"Continue initializing Fabric in {target}? [Y/n]","cli.init.wizard.stage.bootstrap":"Install bootstrap templates? [{defaultValue}]","cli.init.wizard.stage.mcp":"Configure MCP clients? [{defaultValue}]","cli.init.wizard.stage.hooks":"Install git hooks? [{defaultValue}]","cli.init.wizard.mcp-install":"MCP server install scope (global/local) [{defaultValue}]","cli.init.wizard.execute.confirm":"Execute this init plan now? [Y/n]","cli.init.wizard.outro":"Init plan accepted. Running Fabric init...","cli.init.wizard.invalid-yes-no":"Please answer yes or no.","cli.init.wizard.invalid-select":"Invalid value. Use one of: {options}.","cli.init.wizard.cancelled":"Fabric init cancelled before execution.","cli.init.capabilities.title":"Client capability summary","cli.init.capabilities.none":"No supported client was detected for bootstrap or MCP follow-up.","cli.init.capabilities.header.client":"Client","cli.init.capabilities.header.bootstrap":"Bootstrap","cli.init.capabilities.header.mcp":"MCP","cli.init.capabilities.header.hook":"Hook","cli.init.capabilities.header.skill":"Skill","cli.init.capabilities.header.follow-up":"Follow-up","cli.init.capabilities.status.ready":"ready","cli.init.capabilities.status.installed":"installed","cli.init.capabilities.status.supported":"supported","cli.init.capabilities.status.manual":"manual","cli.init.capabilities.status.skipped":"skipped","cli.init.capabilities.status.failed":"failed","cli.init.capabilities.status.na":"n/a","cli.init.capabilities.follow-up.ready":"continue in client","cli.init.capabilities.follow-up.install":"install client assets","cli.init.capabilities.follow-up.manual":"manual step required","cli.init.next-step.message":"run fab hooks install to add the Day 4 pre-commit pipeline.","cli.init.reason-message.claude-body":".fabric/forensic.json is ready; use the agents-md-init skill to finish internal Fabric initialization.","cli.init.reason-message.codex-body":".fabric/forensic.json is ready; continue with the repo skill at .agents/skills/fabric-init/SKILL.md and enable features.codex_hooks = true for Codex hooks.","cli.init.reason-message.multi-body":".fabric/forensic.json is ready; continue in your installed client flow: Claude can use agents-md-init, and Codex can use .agents/skills/fabric-init/SKILL.md with features.codex_hooks = true.","cli.init.reason-message.installable-body":".fabric/forensic.json is ready; some detected clients support Fabric follow-up but still need client assets installed.","cli.init.reason-message.manual-body":".fabric/forensic.json is ready; some detected clients still need manual follow-up because no Fabric skill is installed for them yet.","cli.init.codex-hooks.created":"{label} {path} with Codex hooks config (requires features.codex_hooks = true).","cli.init.codex-hooks.updated":"{label} {path} with Codex hooks config (requires features.codex_hooks = true).","cli.init.codex-hooks.skipped":"{label} {path}: Codex hooks config already present.","cli.init.claude-settings.created":"{label} {path} with Claude Stop hook.","cli.init.claude-settings.updated":"{label} {path} with Claude Stop hook.","cli.init.claude-settings.skipped":"{label} {path}: Claude Stop hook already present.","cli.init.claude-settings.skipped-invalid":"{label} {path}: unable to merge Claude Stop hook.","cli.init.claude-settings.invalid-object":"{label} {path}: expected a JSON object.","cli.init.claude-settings.invalid-json":"{label} {path}: invalid JSON ({reason}).","cli.init.claude-settings.invalid-hooks":'{label} {path}: "hooks" must be a JSON object.',"cli.init.claude-settings.invalid-stop-array":'{label} {path}: "hooks.Stop" must be an array.',"cli.init.errors.abort-existing":"ABORT: {path} already exists. fab init is non-destructive.","cli.ledger-append.description":"Append an entry to the Fabric intent ledger.","cli.ledger-append.args.target.description":"Target project path, default is the current working directory.","cli.ledger-append.args.staged.description":"Derive the entry from staged changes (used during pre-commit).","cli.ledger-append.requires-staged":"requires --staged in pre-commit context","cli.ledger-append.intent.auto":"auto: {head}{suffix}","cli.ledger-append.intent.auto-more":" +{count} more","cli.pre-commit.description":"Composite pre-commit hook: runs sync-meta --check-only, human-lint, and ledger-append --staged in one Node process.","cli.pre-commit.args.target.description":"Project root directory, defaults to cwd or EXTERNAL_FIXTURE_PATH.","cli.pre-commit.run-failed":"fabric pre-commit: {name} failed - {message}","cli.scan.description":"Scan the project to detect Fabric bootstrap candidates.","cli.scan.args.target.description":"Target absolute path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.scan.args.debug.description":"Print detection evidence in formatted output.","cli.scan.args.json.description":"Print the diagnostic report as JSON.","cli.scan.report.title":"Fabric scan report","cli.scan.report.target":"Target","cli.scan.report.framework":"Framework","cli.scan.report.evidence":"Evidence","cli.scan.report.readme-quality":"README quality","cli.scan.report.contributing":"CONTRIBUTING.md","cli.scan.report.files-counted":"Files counted","cli.scan.report.ignored-entries":"Ignored entries","cli.scan.report.existing-fabric":"Existing Fabric files","cli.scan.report.recommendations":"Recommendations:","cli.scan.readme-quality.ok":"ok","cli.scan.readme-quality.stub":"stub","cli.scan.recommendation.init":"L0: Run fab init to scaffold .fabric/bootstrap/README.md with TODO markers.","cli.scan.recommendation.readme":"L0: Expand README.md before promoting project facts into Fabric references.","cli.scan.recommendation.contributing":"L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.","cli.scan.recommendation.unknown-framework":"L1: Add tech-stack TODOs manually because no framework marker was detected.","cli.scan.recommendation.framework-dirs":"L1: Review {framework} directories for future scoped Fabric rule files.","cli.serve.description":"Start the local Fabric MCP HTTP service. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.","cli.serve.args.port.description":"Listen port, default 7373.","cli.serve.args.host.description":"Listen host, default 127.0.0.1. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.","cli.serve.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.serve.args.debug.description":"Print target resolution details to stderr.","cli.serve.ready.title":"Fabric Dashboard","cli.serve.warning.host-fallback":"--host {host} requires FABRIC_AUTH_TOKEN; falling back to 127.0.0.1 for safety","cli.serve.error.port-in-use":"Port {port} in use - try --port {nextPort}","cli.update.description":"Refresh MCP host configuration and git hooks without re-creating Fabric files.","cli.update.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.update.args.no-mcp.description":"Skip re-configuring MCP clients","cli.update.args.no-hooks.description":"Skip re-installing git hooks","cli.sync-meta.description":"Sync Fabric metadata from internal rule files.","cli.sync-meta.args.target.description":"Target project path, default is the current working directory.","cli.sync-meta.args.check-only.description":"Exit with code 1 when .fabric/agents.meta.json is out of date.","cli.sync-meta.drift-detected":"Fabric metadata drift detected. Run fab sync-meta to update.","cli.sync-meta.updated":"{label} {path}","dashboard.app.nav.aria-label":"Dashboard views","dashboard.app.nav.module-a.label":"Rule Topology","dashboard.app.nav.module-a.label-bilingual":"规则命中 Rule Topology","dashboard.app.nav.module-a.subtitle":"coverage + hit reasons","dashboard.app.nav.module-b.label":"Cognitive Forensic","dashboard.app.nav.module-b.label-bilingual":"认知扫描 Cognitive Forensic","dashboard.app.nav.module-b.subtitle":"placeholder","dashboard.app.nav.module-c.label":"Semantic Timeline","dashboard.app.nav.module-c.label-bilingual":"语义时间线 Semantic Timeline","dashboard.app.nav.module-c.subtitle":"placeholder","dashboard.app.nav.module-d.label":"Historical Ledger","dashboard.app.nav.module-d.label-bilingual":"历史记录 Historical Ledger","dashboard.app.nav.module-d.subtitle":"placeholder","dashboard.app.nav.rules.label":"Rules Tree","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"rule structure","dashboard.app.nav.locks.label":"Human Lock","dashboard.app.nav.locks.label-bilingual":"人工保护 Human Lock","dashboard.app.nav.locks.subtitle":"protected regions","dashboard.app.nav.timeline.label":"Intent Timeline","dashboard.app.nav.timeline.label-bilingual":"意图时间线 Intent Timeline","dashboard.app.nav.timeline.subtitle":"change log","dashboard.app.nav.history.label":"History Replay","dashboard.app.nav.history.label-bilingual":"历史回放 History Replay","dashboard.app.nav.history.subtitle":"time travel","dashboard.app.nav.doctor.label":"Doctor","dashboard.app.nav.doctor.label-bilingual":"诊断台 Doctor","dashboard.app.nav.doctor.subtitle":"health checks","dashboard.app.nav.section.modules-status":"Module Status","dashboard.app.nav.section.diagnostics":"Diagnostics","dashboard.app.nav.drift-check":"Drift Check","dashboard.app.nav.modules.read-only":"read-only dashboard","dashboard.app.header.connected":"CONNECTED","dashboard.app.header.connecting":"CONNECTING","dashboard.app.live-region.received":"Received {type}","dashboard.app.breadcrumb.topology":"rule-topology","dashboard.app.breadcrumb.forensic":"cognitive-forensic","dashboard.app.breadcrumb.semantic":"semantic-timeline","dashboard.app.breadcrumb.ledger":"historical-ledger","dashboard.app.breadcrumb.rules":"rules-tree","dashboard.app.breadcrumb.locks":"human-lock","dashboard.app.breadcrumb.timeline":"intent-timeline","dashboard.app.breadcrumb.history":"history-replay","dashboard.app.breadcrumb.doctor":"doctor","dashboard.rule-topology.title":"Rule Topology","dashboard.rule-topology.subtitle":"See which rules match the current path and why","dashboard.rule-topology.path.placeholder":"Sample path for rules context","dashboard.rule-topology.path.aria-label":"Rules context sample path","dashboard.rule-topology.status.sample":"current path {path}","dashboard.rule-topology.status.hits":"{count} hits","dashboard.rule-topology.status.revision":"version {revision}","dashboard.rule-topology.heatmap.title":"Coverage Heatmap","dashboard.rule-topology.heatmap.subtitle":"Heuristic directory coverage derived from scope_glob patterns","dashboard.rule-topology.heatmap.aria-label":"Directory coverage heatmap","dashboard.rule-topology.heatmap.count":"{count} directories","dashboard.rule-topology.heatmap.rules":"{count} rules","dashboard.rule-topology.heatmap.uncovered":"no matching scope","dashboard.rule-topology.heatmap.empty":"No rule directories available.","dashboard.rule-topology.heatmap.density.full":"covered","dashboard.rule-topology.heatmap.density.partial":"partial","dashboard.rule-topology.heatmap.density.none":"uncovered","dashboard.rule-topology.hit-reason.title":"Hit Reasons","dashboard.rule-topology.hit-reason.subtitle":"Why each rule was loaded for the current sample path","dashboard.rule-topology.hit-reason.aria-label":"Rule hit reasons","dashboard.rule-topology.hit-reason.count":"{count} reasons","dashboard.rule-topology.hit-reason.empty":"No rules loaded for this sample path.","dashboard.rule-topology.hit-reason.global":"Global","dashboard.rule-topology.hit-reason.tier.always":"Always-on","dashboard.rule-topology.hit-reason.tier.path":"Glob","dashboard.rule-topology.hit-reason.tier.description":"Description","dashboard.module-placeholder.coming-soon":"Reserved","dashboard.module-placeholder.read-only":"Reserved for future read-only dashboard capabilities.","dashboard.module-placeholder.forensic.title":"Cognitive Forensic","dashboard.module-placeholder.forensic.subtitle":"Coming later","dashboard.module-placeholder.semantic.title":"Semantic Timeline","dashboard.module-placeholder.semantic.subtitle":"Coming later","dashboard.module-placeholder.ledger.title":"Historical Ledger","dashboard.module-placeholder.ledger.subtitle":"Coming later","dashboard.rules-tree.title":"Rules Tree","dashboard.rules-tree.subtitle":"Browse the rule structure, hierarchy, and sync state from .fabric/agents.meta.json","dashboard.rules-tree.filter.placeholder":"Filter by file, glob, priority, hash...","dashboard.rules-tree.filter.aria-label":"Filter rules tree","dashboard.rules-tree.status.loading":"loading rules","dashboard.rules-tree.status.nodes":"{count} nodes · version {revision}","dashboard.rules-tree.status.locks":"{count} protected regions","dashboard.rules-tree.empty":"No matching rules found.","dashboard.rules-tree.tree.aria-label":"Fabric rules tree","dashboard.rules-tree.detail.title":"Node Detail","dashboard.rules-tree.detail.empty":"Select a rule node to inspect scope, dependencies, priority and hash.","dashboard.rules-tree.detail.file":"file","dashboard.rules-tree.detail.scope":"scope","dashboard.rules-tree.detail.priority":"priority","dashboard.rules-tree.detail.hash":"hash","dashboard.rules-tree.detail.no-deps":"no deps","dashboard.human-lock.title":"Human Protection","dashboard.human-lock.subtitle":"Review protected regions that require human confirmation","dashboard.human-lock.filters.aria-label":"Human lock filters","dashboard.human-lock.filters.all":"all","dashboard.human-lock.filters.drift":"drift","dashboard.human-lock.filters.approved":"approved","dashboard.human-lock.summary":"{drift} drift · {approved} confirmed","dashboard.human-lock.empty":"No human lock entries for this filter.","dashboard.intent-timeline.title":"Intent Timeline","dashboard.intent-timeline.subtitle":"Review AI and human change records in reverse chronological order","dashboard.intent-timeline.filter.label":"Source","dashboard.intent-timeline.filter.all":"All","dashboard.intent-timeline.summary":"AI {aiCount} · Human {humanCount}","dashboard.intent-timeline.columns.ai.title":"AI","dashboard.intent-timeline.columns.ai.entries":"{count} entries","dashboard.intent-timeline.columns.human.title":"Human","dashboard.intent-timeline.columns.human.entries":"{count} entries","dashboard.intent-timeline.empty":"No ledger entries found.","dashboard.intent-timeline.annotate.missing-id":"Cannot annotate a ledger entry without an id.","dashboard.history-replay.title":"History Replay","dashboard.history-replay.subtitle":"Review the rules tree state at any recorded point in history","dashboard.history-replay.toolbar.scrub":"Scrub","dashboard.history-replay.toolbar.latest":"Latest","dashboard.history-replay.selected.none":"No historical entry selected","dashboard.history-replay.status.replay-points":"{count} replay points","dashboard.history-replay.status.entries-applied":"{count} entries applied","dashboard.history-replay.empty.entries":"No ledger entries found for replay.","dashboard.history-replay.state.title":"Viewing state as of {label}","dashboard.history-replay.state.meta":"record {ledgerId} · commit {commit} · {mode}","dashboard.history-replay.status.loading":"loading snapshot","dashboard.history-replay.status.nodes":"{count} nodes","dashboard.history-replay.status.unknown-revision":"unknown version","dashboard.history-replay.tree.aria-label":"Historical Fabric rules tree","dashboard.history-replay.empty.loading":"Loading historical snapshot...","dashboard.history-replay.empty.select":"Select a timeline entry to replay its state.","dashboard.history-replay.meta.not-available":"unavailable","dashboard.history-replay.meta.pending":"pending","dashboard.history-replay.meta.na":"n/a","dashboard.doctor.title":"Doctor Console","dashboard.doctor.subtitle":"Check framework, entry points, version drift, and protected paths","dashboard.doctor.toolbar.overall":"Overall","dashboard.doctor.toolbar.no-summary":"No summary yet","dashboard.doctor.toolbar.entry-points-summary":"{framework} · {count} entry points","dashboard.doctor.toolbar.entry-point-summary":"{framework} · {count} entry point","dashboard.doctor.empty.loading":"Loading doctor report...","dashboard.doctor.summary.framework":"Framework","dashboard.doctor.summary.protected-paths":"Protected paths","dashboard.doctor.summary.intent-ledger":"Intent ledger","dashboard.doctor.summary.no-meta-revision":"No metadata version yet","dashboard.doctor.summary.tracked-paths.none":"No tracked paths","dashboard.doctor.summary.tracked-paths.some":"{count} tracked","dashboard.doctor.summary.hashes-intact":"All approved hashes intact","dashboard.doctor.summary.drifted":"{count} drifted","dashboard.doctor.summary.no-ledger-entries":"No ledger entries yet","dashboard.doctor.card.entry-points":"Entry points","dashboard.doctor.card.checks":"Checks","dashboard.doctor.empty.entry-points":"No current entry points detected.","dashboard.doctor.framework.unknown":"unknown","dashboard.doctor.age.none":"No entries","dashboard.doctor.age.seconds":"{count}s ago","dashboard.doctor.age.minutes":"{count}m ago","dashboard.doctor.age.hours":"{count}h ago","dashboard.doctor.age.days":"{count}d ago","dashboard.doctor.age.weeks":"{count}w ago","dashboard.shared.refresh":"Refresh","dashboard.shared.loading":"loading","dashboard.shared.status.ok":"ok","dashboard.shared.status.warn":"warn","dashboard.shared.status.error":"error","dashboard.shared.status.confirmed":"confirmed","dashboard.shared.status.hash-drift":"hash drift","dashboard.shared.status.stale":"stale","dashboard.shared.status.orphan":"orphan","dashboard.shared.status.attention":"attention","dashboard.source.ai":"AI","dashboard.source.human":"Human","dashboard.timeline-entry.aria-label":"{source} intent {intent}","dashboard.timeline-entry.working-tree":"working tree","dashboard.timeline-entry.parent":"parent {parent}","dashboard.timeline-entry.paths":"paths","dashboard.timeline-entry.annotate":"Annotate","dashboard.timeline-entry.annotation-label":"Human annotation","dashboard.timeline-entry.annotation-placeholder":"Explain review outcome or approval context...","dashboard.timeline-entry.annotation-save":"Save annotation","dashboard.tree-node.locked":"locked","dashboard.tree-node.stale.hash-mismatch":"hash mismatch","dashboard.tree-node.stale.orphan":"orphan","dashboard.lock-card.aria-label":"{file} {lineRange} {status}","dashboard.lock-card.status.drift":"hash drift","dashboard.lock-card.status.confirmed":"confirmed","dashboard.lock-card.hash.locked":"locked hash","dashboard.lock-card.hash.current":"current hash","dashboard.lock-card.hash.diff":"diff","dashboard.lock-card.preview.drift":"DRIFT","dashboard.lock-card.preview.sync":"SYNC","dashboard.lock-card.preview.drift-detail":"Hash differs from protected region.","dashboard.lock-card.preview.sync-detail":"Protected region is in sync.","dashboard.lock-card.footer.region":"protected region · {count} lines","dashboard.lock-card.button.approve":"Approve new hash","dashboard.lock-card.button.confirmed":"Confirmed","dashboard.lock-card.diff.hash-mismatch":"hash mismatch","dashboard.lock-card.diff.no-changes":"no changes","dashboard.lock-card.diff.with-bytes":"+{added} / -{removed} · {bytes} bytes","dashboard.lock-card.diff.without-bytes":"+{added} / -{removed}","dashboard.approve-button.retry":"Retry"},Hr={"cli.main.description":"Fabric CLI - AI 智能体协作框架","cli.shared.created":"已创建","cli.shared.skipped":"已跳过","cli.shared.next":"下一步","cli.shared.reason":"原因","cli.shared.updated":"已更新","cli.shared.missing":"缺失","cli.shared.present":"存在","cli.shared.absent":"缺失","cli.shared.yes":"是","cli.shared.no":"否","cli.shared.none":"无","cli.shared.loading":"加载中","cli.shared.refresh":"刷新","cli.shared.target-invalid":"目标必须是已存在的目录:{target}","cli.shared.template-not-found":"未找到模板:{path}","cli.shared.invalid-host-empty":"无效 host:<empty>","cli.shared.invalid-port":"无效端口:{value}","cli.approve.description":"从命令行批准已漂移的 human-lock 记录。","cli.approve.args.all.description":"不提示,批准所有已漂移的 human-lock 记录。","cli.approve.args.interactive.description":"逐条提示后批准已漂移的 human-lock 记录。","cli.approve.args.target.description":"目标项目路径,默认为当前工作目录。","cli.approve.no-drift":"未发现漂移记录。","cli.approve.prompt":"批准此记录?[y/N] ","cli.approve.approved-one":"已批准 {location}","cli.approve.skipped-one":"已跳过 {location}","cli.approve.summary":"已批准 {approved}/{total} 条漂移记录。已跳过 {skipped} 条。","cli.approve.table.expected":"预期","cli.approve.table.current":"当前","cli.bootstrap.description":"为支持的 AI 客户端安装 Fabric 引导提示模板。","cli.bootstrap.install.description":"将 Fabric 引导模板复制到各客户端的原生位置。","cli.bootstrap.install.args.clients.description":"可选的逗号分隔客户端过滤器,例如 claude,cursor,codex。","cli.bootstrap.install.no-targets":"未检测到可安装的 bootstrap 目标。可显式传入 --clients claude,cursor,windsurf,roo,gemini,codex。","cli.bootstrap.install.installed":"已安装 {path}","cli.bootstrap.install.skipped-header":"已跳过 {path}:Fabric Bootstrap 头部已存在。","cli.bootstrap.install.prepended":"已前置写入 {path}","cli.bootstrap.errors.unknown-client":"未知客户端“{client}”。请使用逗号分隔列表,例如 claude,cursor,codex。","cli.config.description":"管理 Fabric MCP 客户端配置。","cli.config.clients.claude":"Claude Code CLI","cli.config.install.description":"将 Fabric MCP 服务端条目安装到检测到的客户端配置中。","cli.config.install.args.clients.description":"可选的逗号分隔客户端过滤器,例如 cursor,codex,gemini。","cli.config.install.args.dry-run.description":"仅预览将要发生的写入操作,不修改文件。","cli.config.errors.unknown-client":"未知客户端“{client}”。请使用逗号分隔列表,例如 cursor,codex,gemini。","cli.config.errors.expected-object":"{path} 中应为对象。","cli.config.install.no-configs":"未检测到 Fabric MCP 客户端配置。请创建客户端目录,或在 fabric.config.json 中设置 clientPaths。","cli.config.install.no-config-path":"跳过 {client}:未检测到配置路径。","cli.config.install.dry-run":"[dry-run] {client}:将写入 {path}","cli.config.install.wrote":"{client}:已写入 {path}","cli.doctor.description":"运行 Fabric doctor 检查,并可选输出合规审计报告。","cli.doctor.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.doctor.args.audit.description":"输出 AI 编辑意图缺少 fab_get_rules 前置调用的违规项。","cli.doctor.args.window-minutes.description":"匹配 fab_get_rules 调用的回看时间窗口,单位为分钟。默认 5 分钟。","cli.doctor.errors.invalid-window":"无效的审计时间窗口:{value}","cli.doctor.audit.preview-only":"fabric.config.json 中 auditMode 为 off;当前 fab doctor --audit 仅执行手动预览,不会改变退出码。","cli.doctor.audit.none":"当前还没有可用于合规审计的 AI 编辑意图记录。","cli.doctor.audit.clean":"已审计的 {count} 个编辑路径都在 {window} 内存在前置 fab_get_rules 调用。","cli.doctor.audit.violations":"有 {count} 个已审计编辑路径在 {window} 内缺少前置 fab_get_rules 调用。","cli.doctor.audit.table.path":"路径","cli.doctor.audit.table.edit":"编辑时间","cli.doctor.audit.table.rules":"最近规则调用","cli.doctor.audit.table.intent":"意图","cli.hooks.description":"管理 Fabric Git 钩子模板。","cli.hooks.install.description":"安装 Fabric Husky pre-commit 钩子模板。","cli.hooks.install.args.target.description":"目标项目路径,默认为当前工作目录。","cli.hooks.errors.package-json-required":"安装 hooks 需要 package.json:{path}","cli.hooks.install.hook-skipped":"{path} 中已存在 Fabric hook,已跳过。","cli.hooks.install.hook-appended":"已向现有 {path} 追加 Fabric hook","cli.hooks.install.hook-created":"已创建 {path}","cli.hooks.install.prepare-left":"保留 {path} 中原有的 prepare 脚本不变","cli.hooks.install.prepare-added":"已向 {path} 添加 prepare 脚本","cli.human-lint.description":"验证锁定的人工编辑区块。","cli.human-lint.args.target.description":"目标项目路径,默认为当前工作目录。","cli.human-lint.drift-detected":"检测到 human-lock 内容漂移。请回退编辑,或在提交前更新已批准的哈希。","cli.human-lint.table.location":"位置","cli.human-lint.table.expected":"预期","cli.human-lint.table.got":"实际","cli.init.description":"在目标项目中初始化 Fabric。","cli.init.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.init.args.debug.description":"将目标解析细节输出到 stderr。","cli.init.args.force.description":"覆盖现有文件(绕过非破坏性保护)","cli.init.args.yes.description":"接受当前初始化计划并跳过 TTY 向导直接执行","cli.init.args.plan.description":"仅输出初始化计划,不写文件也不执行后续阶段","cli.init.args.reapply.description":"在已有 setup 上重新应用 Fabric 管理的文件和阶段安装器","cli.init.args.no-bootstrap.description":"兼容标志:从初始化计划中移除 bootstrap","cli.init.args.no-mcp.description":"兼容标志:从初始化计划中移除 MCP 配置","cli.init.args.no-hooks.description":"兼容标志:从初始化计划中移除 git hooks","cli.init.args.interactive.description":"兼容标志:禁用 TTY 向导并直接执行","cli.init.mcp.install.global":"使用全局安装的 @fenglimg/fabric-server","cli.init.mcp.install.local":"将 @fenglimg/fabric-server 安装到项目 devDependencies","cli.init.mcp.install.prompt":"MCP 服务端安装范围(global|local)","cli.init.mcp.install.invalid":"无效的 --mcp-install 值“{value}”,将回退到 global","cli.init.mcp.local.installing":"正在运行 {manager} add -D @fenglimg/fabric-server...","cli.init.mcp.local.installed":"已安装到 devDependencies","cli.init.created-path":"{label} {path}","cli.init.skipped-existing-path":"{label} {path}:已存在。","cli.init.force.overwritten":"已覆盖","cli.init.force.warning":"--force 将覆盖 {path} 中现有的 Fabric 产物","cli.init.stages.bootstrap":"正在安装 bootstrap 模板...","cli.init.stages.mcp":"正在配置 MCP 客户端...","cli.init.stages.hooks":"正在安装 git hooks...","cli.init.stages.skipped":"已跳过","cli.init.stages.completed":"已完成","cli.init.stages.failed":"失败","cli.init.stages.summary.ran":"已执行","cli.init.stages.summary.skipped":"已跳过","cli.init.stages.summary.failed":"失败","cli.init.next-step":"{label} {message}","cli.init.reason-message":"{label} {message}","cli.init.plan.title":"Fabric 初始化计划","cli.init.plan.mode-banner.default":"[mode: apply] 标准初始化执行","cli.init.plan.mode-banner.plan":"[mode: plan] 仅预览,不会写入文件","cli.init.plan.mode-banner.reapply":"[mode: reapply] 将强制重新应用 Fabric 管理资产","cli.init.plan.mode-banner.plan-reapply":"[mode: plan+reapply] 正在预览一次强制 reapply,不会写入文件","cli.init.plan.target":"目标:{target}","cli.init.plan.actions":"计划:bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}","cli.init.plan.detected":"检测到的客户端:{clients}","cli.init.plan.writes":"核心写入:","cli.init.plan.preview-title":"Fabric 初始化 dry run","cli.init.plan.preview-result":"模式={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}","cli.init.mode.default":"default","cli.init.mode.reapply":"reapply","cli.init.mode.badge.default":"APPLY","cli.init.mode.badge.plan":"PLAN","cli.init.mode.badge.reapply":"REAPPLY","cli.init.mode.badge.plan-reapply":"PLAN + REAPPLY","cli.init.compat.plan":"已启用标准 --plan 模式:不会写入任何文件。","cli.init.compat.interactive":"兼容提示:--interactive=false 会禁用 TTY 向导。","cli.init.compat.legacy-stage-flags":"兼容提示:旧的 --no-* 标志正在映射到初始化计划中。","cli.init.wizard.title":"Fabric 初始化向导","cli.init.wizard.intro":"Fabric init","cli.init.wizard.overview.title":"安装概览","cli.init.wizard.overview.body":`目标:{target}
|
|
8
|
+
This wizard only reshapes the init plan; execution still runs through the existing Fabric init stages.`,"cli.init.wizard.step.target":"Confirm target","cli.init.wizard.step.plan":"Shape init plan","cli.init.wizard.step.review":"Review final plan","cli.init.wizard.target.confirm":"Continue initializing Fabric in {target}? [Y/n]","cli.init.wizard.stage.bootstrap":"Install bootstrap templates? [{defaultValue}]","cli.init.wizard.stage.mcp":"Configure MCP clients? [{defaultValue}]","cli.init.wizard.stage.hooks":"Install git hooks? [{defaultValue}]","cli.init.wizard.mcp-install":"MCP server install scope (global/local) [{defaultValue}]","cli.init.wizard.execute.confirm":"Execute this init plan now? [Y/n]","cli.init.wizard.outro":"Init plan accepted. Running Fabric init...","cli.init.wizard.invalid-yes-no":"Please answer yes or no.","cli.init.wizard.invalid-select":"Invalid value. Use one of: {options}.","cli.init.wizard.cancelled":"Fabric init cancelled before execution.","cli.init.capabilities.title":"Client capability summary","cli.init.capabilities.none":"No supported client was detected for bootstrap or MCP follow-up.","cli.init.capabilities.header.client":"Client","cli.init.capabilities.header.bootstrap":"Bootstrap","cli.init.capabilities.header.mcp":"MCP","cli.init.capabilities.header.hook":"Hook","cli.init.capabilities.header.skill":"Skill","cli.init.capabilities.header.follow-up":"Follow-up","cli.init.capabilities.status.ready":"ready","cli.init.capabilities.status.installed":"installed","cli.init.capabilities.status.supported":"supported","cli.init.capabilities.status.manual":"manual","cli.init.capabilities.status.skipped":"skipped","cli.init.capabilities.status.failed":"failed","cli.init.capabilities.status.na":"n/a","cli.init.capabilities.follow-up.ready":"continue in client","cli.init.capabilities.follow-up.install":"install client assets","cli.init.capabilities.follow-up.manual":"manual step required","cli.init.next-step.message":"run fab hooks install to add the Day 4 pre-commit pipeline.","cli.init.reason-message.claude-body":".fabric/forensic.json is ready; use the agents-md-init skill to finish internal Fabric initialization.","cli.init.reason-message.codex-body":".fabric/forensic.json is ready; continue with the repo skill at .agents/skills/fabric-init/SKILL.md and enable features.codex_hooks = true for Codex hooks.","cli.init.reason-message.multi-body":".fabric/forensic.json is ready; continue in your installed client flow: Claude can use agents-md-init, and Codex can use .agents/skills/fabric-init/SKILL.md with features.codex_hooks = true.","cli.init.reason-message.installable-body":".fabric/forensic.json is ready; some detected clients support Fabric follow-up but still need client assets installed.","cli.init.reason-message.manual-body":".fabric/forensic.json is ready; some detected clients still need manual follow-up because no Fabric skill is installed for them yet.","cli.init.codex-hooks.created":"{label} {path} with Codex hooks config (requires features.codex_hooks = true).","cli.init.codex-hooks.updated":"{label} {path} with Codex hooks config (requires features.codex_hooks = true).","cli.init.codex-hooks.skipped":"{label} {path}: Codex hooks config already present.","cli.init.claude-settings.created":"{label} {path} with Claude Stop hook.","cli.init.claude-settings.updated":"{label} {path} with Claude Stop hook.","cli.init.claude-settings.skipped":"{label} {path}: Claude Stop hook already present.","cli.init.claude-settings.skipped-invalid":"{label} {path}: unable to merge Claude Stop hook.","cli.init.claude-settings.invalid-object":"{label} {path}: expected a JSON object.","cli.init.claude-settings.invalid-json":"{label} {path}: invalid JSON ({reason}).","cli.init.claude-settings.invalid-hooks":'{label} {path}: "hooks" must be a JSON object.',"cli.init.claude-settings.invalid-stop-array":'{label} {path}: "hooks.Stop" must be an array.',"cli.init.errors.abort-existing":"ABORT: {path} already exists. fab init is non-destructive.","cli.ledger-append.description":"Append an entry to the Fabric intent ledger.","cli.ledger-append.args.target.description":"Target project path, default is the current working directory.","cli.ledger-append.args.staged.description":"Derive the entry from staged changes (used during pre-commit).","cli.ledger-append.requires-staged":"requires --staged in pre-commit context","cli.ledger-append.intent.auto":"auto: {head}{suffix}","cli.ledger-append.intent.auto-more":" +{count} more","cli.pre-commit.description":"Composite pre-commit hook: runs sync-meta --check-only, human-lint, and ledger-append --staged in one Node process.","cli.pre-commit.args.target.description":"Project root directory, defaults to cwd or EXTERNAL_FIXTURE_PATH.","cli.pre-commit.run-failed":"fabric pre-commit: {name} failed - {message}","cli.scan.description":"Scan the project to detect Fabric bootstrap candidates.","cli.scan.args.target.description":"Target absolute path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.scan.args.debug.description":"Print detection evidence in formatted output.","cli.scan.args.json.description":"Print the diagnostic report as JSON.","cli.scan.report.title":"Fabric scan report","cli.scan.report.target":"Target","cli.scan.report.framework":"Framework","cli.scan.report.evidence":"Evidence","cli.scan.report.readme-quality":"README quality","cli.scan.report.contributing":"CONTRIBUTING.md","cli.scan.report.files-counted":"Files counted","cli.scan.report.ignored-entries":"Ignored entries","cli.scan.report.existing-fabric":"Existing Fabric files","cli.scan.report.recommendations":"Recommendations:","cli.scan.readme-quality.ok":"ok","cli.scan.readme-quality.stub":"stub","cli.scan.recommendation.init":"L0: Run fab init to scaffold .fabric/bootstrap/README.md with TODO markers.","cli.scan.recommendation.readme":"L0: Expand README.md before promoting project facts into Fabric references.","cli.scan.recommendation.contributing":"L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.","cli.scan.recommendation.unknown-framework":"L1: Add tech-stack TODOs manually because no framework marker was detected.","cli.scan.recommendation.framework-dirs":"L1: Review {framework} directories for future scoped Fabric rule files.","cli.serve.description":"Start the local Fabric MCP HTTP service. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.","cli.serve.args.port.description":"Listen port, default 7373.","cli.serve.args.host.description":"Listen host, default 127.0.0.1. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.","cli.serve.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.serve.args.debug.description":"Print target resolution details to stderr.","cli.serve.ready.title":"Fabric Dashboard","cli.serve.warning.host-fallback":"--host {host} requires FABRIC_AUTH_TOKEN; falling back to 127.0.0.1 for safety","cli.serve.error.port-in-use":"Port {port} in use - try --port {nextPort}","cli.update.description":"Refresh MCP host configuration and git hooks without re-creating Fabric files.","cli.update.args.target.description":"Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.","cli.update.args.no-mcp.description":"Skip re-configuring MCP clients","cli.update.args.no-hooks.description":"Skip re-installing git hooks","cli.sync-meta.description":"Sync Fabric metadata from internal rule files.","cli.sync-meta.args.target.description":"Target project path, default is the current working directory.","cli.sync-meta.args.check-only.description":"Exit with code 1 when .fabric/agents.meta.json is out of date.","cli.sync-meta.drift-detected":"Fabric metadata drift detected. Run fab sync-meta to update.","cli.sync-meta.updated":"{label} {path}","dashboard.app.nav.aria-label":"Dashboard views","dashboard.app.nav.module-a.label":"Rule Topology","dashboard.app.nav.module-a.label-bilingual":"规则命中 Rule Topology","dashboard.app.nav.module-a.subtitle":"coverage + hit reasons","dashboard.app.nav.module-b.label":"Cognitive Forensic","dashboard.app.nav.module-b.label-bilingual":"认知扫描 Cognitive Forensic","dashboard.app.nav.module-b.subtitle":"placeholder","dashboard.app.nav.module-c.label":"Semantic Timeline","dashboard.app.nav.module-c.label-bilingual":"语义时间线 Semantic Timeline","dashboard.app.nav.module-c.subtitle":"placeholder","dashboard.app.nav.module-d.label":"Historical Ledger","dashboard.app.nav.module-d.label-bilingual":"历史记录 Historical Ledger","dashboard.app.nav.module-d.subtitle":"placeholder","dashboard.app.nav.rules.label":"Rules Tree","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"rule structure","dashboard.app.nav.locks.label":"Human Lock","dashboard.app.nav.locks.label-bilingual":"人工保护 Human Lock","dashboard.app.nav.locks.subtitle":"protected regions","dashboard.app.nav.timeline.label":"Intent Timeline","dashboard.app.nav.timeline.label-bilingual":"意图时间线 Intent Timeline","dashboard.app.nav.timeline.subtitle":"change log","dashboard.app.nav.history.label":"History Replay","dashboard.app.nav.history.label-bilingual":"历史回放 History Replay","dashboard.app.nav.history.subtitle":"time travel","dashboard.app.nav.doctor.label":"Doctor","dashboard.app.nav.doctor.label-bilingual":"诊断台 Doctor","dashboard.app.nav.doctor.subtitle":"health checks","dashboard.app.nav.section.modules-status":"Module Status","dashboard.app.nav.section.diagnostics":"Diagnostics","dashboard.app.nav.drift-check":"Drift Check","dashboard.app.nav.modules.read-only":"read-only dashboard","dashboard.app.header.connected":"CONNECTED","dashboard.app.header.connecting":"CONNECTING","dashboard.app.live-region.received":"Received {type}","dashboard.app.breadcrumb.topology":"rule-topology","dashboard.app.breadcrumb.forensic":"cognitive-forensic","dashboard.app.breadcrumb.semantic":"semantic-timeline","dashboard.app.breadcrumb.ledger":"historical-ledger","dashboard.app.breadcrumb.rules":"rules-tree","dashboard.app.breadcrumb.locks":"human-lock","dashboard.app.breadcrumb.timeline":"intent-timeline","dashboard.app.breadcrumb.history":"history-replay","dashboard.app.breadcrumb.doctor":"doctor","dashboard.rule-topology.title":"Rule Topology","dashboard.rule-topology.subtitle":"See which rules match the current path and why","dashboard.rule-topology.path.placeholder":"Sample path for rules context","dashboard.rule-topology.path.aria-label":"Rules context sample path","dashboard.rule-topology.status.sample":"current path {path}","dashboard.rule-topology.status.hits":"{count} hits","dashboard.rule-topology.status.revision":"version {revision}","dashboard.rule-topology.heatmap.title":"Coverage Heatmap","dashboard.rule-topology.heatmap.subtitle":"Heuristic directory coverage derived from scope_glob patterns","dashboard.rule-topology.heatmap.aria-label":"Directory coverage heatmap","dashboard.rule-topology.heatmap.count":"{count} directories","dashboard.rule-topology.heatmap.rules":"{count} rules","dashboard.rule-topology.heatmap.uncovered":"no matching scope","dashboard.rule-topology.heatmap.empty":"No rule directories available.","dashboard.rule-topology.heatmap.density.full":"covered","dashboard.rule-topology.heatmap.density.partial":"partial","dashboard.rule-topology.heatmap.density.none":"uncovered","dashboard.rule-topology.hit-reason.title":"Hit Reasons","dashboard.rule-topology.hit-reason.subtitle":"Why each rule was loaded for the current sample path","dashboard.rule-topology.hit-reason.aria-label":"Rule hit reasons","dashboard.rule-topology.hit-reason.count":"{count} reasons","dashboard.rule-topology.hit-reason.empty":"No rules loaded for this sample path.","dashboard.rule-topology.hit-reason.global":"Global","dashboard.rule-topology.hit-reason.tier.always":"Always-on","dashboard.rule-topology.hit-reason.tier.path":"Glob","dashboard.rule-topology.hit-reason.tier.description":"Description","dashboard.module-placeholder.coming-soon":"Reserved","dashboard.module-placeholder.read-only":"Reserved for future read-only dashboard capabilities.","dashboard.module-placeholder.forensic.title":"Cognitive Forensic","dashboard.module-placeholder.forensic.subtitle":"Coming later","dashboard.module-placeholder.semantic.title":"Semantic Timeline","dashboard.module-placeholder.semantic.subtitle":"Coming later","dashboard.module-placeholder.ledger.title":"Historical Ledger","dashboard.module-placeholder.ledger.subtitle":"Coming later","dashboard.rules-tree.title":"Rules Tree","dashboard.rules-tree.subtitle":"Browse the rule structure, hierarchy, and sync state from .fabric/agents.meta.json","dashboard.rules-tree.filter.placeholder":"Filter by file, glob, priority, hash...","dashboard.rules-tree.filter.aria-label":"Filter rules tree","dashboard.rules-tree.status.loading":"loading rules","dashboard.rules-tree.status.nodes":"{count} nodes · version {revision}","dashboard.rules-tree.status.locks":"{count} protected regions","dashboard.rules-tree.empty":"No matching rules found.","dashboard.rules-tree.tree.aria-label":"Fabric rules tree","dashboard.rules-tree.detail.title":"Node Detail","dashboard.rules-tree.detail.empty":"Select a rule node to inspect scope, dependencies, priority and hash.","dashboard.rules-tree.detail.file":"file","dashboard.rules-tree.detail.scope":"scope","dashboard.rules-tree.detail.priority":"priority","dashboard.rules-tree.detail.hash":"hash","dashboard.rules-tree.detail.no-deps":"no deps","dashboard.human-lock.title":"Human Protection","dashboard.human-lock.subtitle":"Review protected regions that require human confirmation","dashboard.human-lock.filters.aria-label":"Human lock filters","dashboard.human-lock.filters.all":"all","dashboard.human-lock.filters.drift":"drift","dashboard.human-lock.filters.approved":"approved","dashboard.human-lock.summary":"{drift} drift · {approved} confirmed","dashboard.human-lock.empty":"No human lock entries for this filter.","dashboard.intent-timeline.title":"Intent Timeline","dashboard.intent-timeline.subtitle":"Review AI and human change records in reverse chronological order","dashboard.intent-timeline.filter.label":"Source","dashboard.intent-timeline.filter.all":"All","dashboard.intent-timeline.summary":"AI {aiCount} · Human {humanCount}","dashboard.intent-timeline.columns.ai.title":"AI","dashboard.intent-timeline.columns.ai.entries":"{count} entries","dashboard.intent-timeline.columns.human.title":"Human","dashboard.intent-timeline.columns.human.entries":"{count} entries","dashboard.intent-timeline.empty":"No ledger entries found.","dashboard.intent-timeline.annotate.missing-id":"Cannot annotate a ledger entry without an id.","dashboard.history-replay.title":"History Replay","dashboard.history-replay.subtitle":"Review the rules tree state at any recorded point in history","dashboard.history-replay.toolbar.scrub":"Scrub","dashboard.history-replay.toolbar.latest":"Latest","dashboard.history-replay.selected.none":"No historical entry selected","dashboard.history-replay.status.replay-points":"{count} replay points","dashboard.history-replay.status.entries-applied":"{count} entries applied","dashboard.history-replay.empty.entries":"No ledger entries found for replay.","dashboard.history-replay.state.title":"Viewing state as of {label}","dashboard.history-replay.state.meta":"record {ledgerId} · commit {commit} · {mode}","dashboard.history-replay.status.loading":"loading snapshot","dashboard.history-replay.status.nodes":"{count} nodes","dashboard.history-replay.status.unknown-revision":"unknown version","dashboard.history-replay.tree.aria-label":"Historical Fabric rules tree","dashboard.history-replay.empty.loading":"Loading historical snapshot...","dashboard.history-replay.empty.select":"Select a timeline entry to replay its state.","dashboard.history-replay.meta.not-available":"unavailable","dashboard.history-replay.meta.pending":"pending","dashboard.history-replay.meta.na":"n/a","dashboard.doctor.title":"Doctor Console","dashboard.doctor.subtitle":"Check framework, entry points, version drift, and protected paths","dashboard.doctor.toolbar.overall":"Overall","dashboard.doctor.toolbar.no-summary":"No summary yet","dashboard.doctor.toolbar.entry-points-summary":"{framework} · {count} entry points","dashboard.doctor.toolbar.entry-point-summary":"{framework} · {count} entry point","dashboard.doctor.empty.loading":"Loading doctor report...","dashboard.doctor.summary.framework":"Framework","dashboard.doctor.summary.protected-paths":"Protected paths","dashboard.doctor.summary.intent-ledger":"Intent ledger","dashboard.doctor.summary.no-meta-revision":"No metadata version yet","dashboard.doctor.summary.tracked-paths.none":"No tracked paths","dashboard.doctor.summary.tracked-paths.some":"{count} tracked","dashboard.doctor.summary.hashes-intact":"All approved hashes intact","dashboard.doctor.summary.drifted":"{count} drifted","dashboard.doctor.summary.no-ledger-entries":"No ledger entries yet","dashboard.doctor.card.entry-points":"Entry points","dashboard.doctor.card.checks":"Checks","dashboard.doctor.empty.entry-points":"No current entry points detected.","dashboard.doctor.framework.unknown":"unknown","dashboard.doctor.age.none":"No entries","dashboard.doctor.age.seconds":"{count}s ago","dashboard.doctor.age.minutes":"{count}m ago","dashboard.doctor.age.hours":"{count}h ago","dashboard.doctor.age.days":"{count}d ago","dashboard.doctor.age.weeks":"{count}w ago","dashboard.shared.refresh":"Refresh","dashboard.shared.loading":"loading","dashboard.shared.status.ok":"ok","dashboard.shared.status.warn":"warn","dashboard.shared.status.error":"error","dashboard.shared.status.confirmed":"confirmed","dashboard.shared.status.hash-drift":"hash drift","dashboard.shared.status.stale":"stale","dashboard.shared.status.orphan":"orphan","dashboard.shared.status.attention":"attention","dashboard.source.ai":"AI","dashboard.source.human":"Human","dashboard.timeline-entry.aria-label":"{source} intent {intent}","dashboard.timeline-entry.working-tree":"working tree","dashboard.timeline-entry.parent":"parent {parent}","dashboard.timeline-entry.paths":"paths","dashboard.timeline-entry.annotate":"Annotate","dashboard.timeline-entry.annotation-label":"Human annotation","dashboard.timeline-entry.annotation-placeholder":"Explain review outcome or approval context...","dashboard.timeline-entry.annotation-save":"Save annotation","dashboard.tree-node.locked":"locked","dashboard.tree-node.stale.hash-mismatch":"hash mismatch","dashboard.tree-node.stale.orphan":"orphan","dashboard.lock-card.aria-label":"{file} {lineRange} {status}","dashboard.lock-card.status.drift":"hash drift","dashboard.lock-card.status.confirmed":"confirmed","dashboard.lock-card.hash.locked":"locked hash","dashboard.lock-card.hash.current":"current hash","dashboard.lock-card.hash.diff":"diff","dashboard.lock-card.preview.drift":"DRIFT","dashboard.lock-card.preview.sync":"SYNC","dashboard.lock-card.preview.drift-detail":"Hash differs from protected region.","dashboard.lock-card.preview.sync-detail":"Protected region is in sync.","dashboard.lock-card.footer.region":"protected region · {count} lines","dashboard.lock-card.button.approve":"Approve new hash","dashboard.lock-card.button.confirmed":"Confirmed","dashboard.lock-card.diff.hash-mismatch":"hash mismatch","dashboard.lock-card.diff.no-changes":"no changes","dashboard.lock-card.diff.with-bytes":"+{added} / -{removed} · {bytes} bytes","dashboard.lock-card.diff.without-bytes":"+{added} / -{removed}","dashboard.approve-button.retry":"Retry"},Br={"cli.main.description":"Fabric CLI - AI 智能体协作框架","cli.shared.created":"已创建","cli.shared.skipped":"已跳过","cli.shared.next":"下一步","cli.shared.reason":"原因","cli.shared.updated":"已更新","cli.shared.missing":"缺失","cli.shared.present":"存在","cli.shared.absent":"缺失","cli.shared.yes":"是","cli.shared.no":"否","cli.shared.none":"无","cli.shared.loading":"加载中","cli.shared.refresh":"刷新","cli.shared.target-invalid":"目标必须是已存在的目录:{target}","cli.shared.template-not-found":"未找到模板:{path}","cli.shared.invalid-host-empty":"无效 host:<empty>","cli.shared.invalid-port":"无效端口:{value}","cli.approve.description":"从命令行批准已漂移的 human-lock 记录。","cli.approve.args.all.description":"不提示,批准所有已漂移的 human-lock 记录。","cli.approve.args.interactive.description":"逐条提示后批准已漂移的 human-lock 记录。","cli.approve.args.target.description":"目标项目路径,默认为当前工作目录。","cli.approve.no-drift":"未发现漂移记录。","cli.approve.prompt":"批准此记录?[y/N] ","cli.approve.approved-one":"已批准 {location}","cli.approve.skipped-one":"已跳过 {location}","cli.approve.summary":"已批准 {approved}/{total} 条漂移记录。已跳过 {skipped} 条。","cli.approve.table.expected":"预期","cli.approve.table.current":"当前","cli.bootstrap.description":"为支持的 AI 客户端安装 Fabric 引导提示模板。","cli.bootstrap.install.description":"将 Fabric 引导模板复制到各客户端的原生位置。","cli.bootstrap.install.args.clients.description":"可选的逗号分隔客户端过滤器,例如 claude,cursor,codex。","cli.bootstrap.install.no-targets":"未检测到可安装的 bootstrap 目标。可显式传入 --clients claude,cursor,windsurf,roo,gemini,codex。","cli.bootstrap.install.installed":"已安装 {path}","cli.bootstrap.install.skipped-header":"已跳过 {path}:Fabric Bootstrap 头部已存在。","cli.bootstrap.install.prepended":"已前置写入 {path}","cli.bootstrap.errors.unknown-client":"未知客户端“{client}”。请使用逗号分隔列表,例如 claude,cursor,codex。","cli.config.description":"管理 Fabric MCP 客户端配置。","cli.config.clients.claude":"Claude Code CLI","cli.config.install.description":"将 Fabric MCP 服务端条目安装到检测到的客户端配置中。","cli.config.install.args.clients.description":"可选的逗号分隔客户端过滤器,例如 cursor,codex,gemini。","cli.config.install.args.dry-run.description":"仅预览将要发生的写入操作,不修改文件。","cli.config.errors.unknown-client":"未知客户端“{client}”。请使用逗号分隔列表,例如 cursor,codex,gemini。","cli.config.errors.expected-object":"{path} 中应为对象。","cli.config.install.no-configs":"未检测到 Fabric MCP 客户端配置。请创建客户端目录,或在 fabric.config.json 中设置 clientPaths。","cli.config.install.no-config-path":"跳过 {client}:未检测到配置路径。","cli.config.install.dry-run":"[dry-run] {client}:将写入 {path}","cli.config.install.wrote":"{client}:已写入 {path}","cli.doctor.description":"运行 Fabric doctor 检查,并可选输出合规审计报告。","cli.doctor.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.doctor.args.audit.description":"输出 AI 编辑意图缺少 fab_get_rules 前置调用的违规项。","cli.doctor.args.fix.description":"需要时将旧的根目录 ledger 迁移到 .fabric/.intent-ledger.jsonl。","cli.doctor.args.window-minutes.description":"匹配 fab_get_rules 调用的回看时间窗口,单位为分钟。默认 5 分钟。","cli.doctor.errors.invalid-window":"无效的审计时间窗口:{value}","cli.doctor.audit.preview-only":"fabric.config.json 中 auditMode 为 off;当前 fab doctor --audit 仅执行手动预览,不会改变退出码。","cli.doctor.audit.none":"当前还没有可用于合规审计的 AI 编辑意图记录。","cli.doctor.audit.clean":"已审计的 {count} 个编辑路径都在 {window} 内存在前置 fab_get_rules 调用。","cli.doctor.audit.violations":"有 {count} 个已审计编辑路径在 {window} 内缺少前置 fab_get_rules 调用。","cli.doctor.audit.table.path":"路径","cli.doctor.audit.table.edit":"编辑时间","cli.doctor.audit.table.rules":"最近规则调用","cli.doctor.audit.table.intent":"意图","cli.hooks.description":"管理 Fabric Git 钩子模板。","cli.hooks.install.description":"安装 Fabric Husky pre-commit 钩子模板。","cli.hooks.install.args.target.description":"目标项目路径,默认为当前工作目录。","cli.hooks.errors.package-json-required":"安装 hooks 需要 package.json:{path}","cli.hooks.install.hook-skipped":"{path} 中已存在 Fabric hook,已跳过。","cli.hooks.install.hook-appended":"已向现有 {path} 追加 Fabric hook","cli.hooks.install.hook-created":"已创建 {path}","cli.hooks.install.prepare-left":"保留 {path} 中原有的 prepare 脚本不变","cli.hooks.install.prepare-added":"已向 {path} 添加 prepare 脚本","cli.human-lint.description":"验证锁定的人工编辑区块。","cli.human-lint.args.target.description":"目标项目路径,默认为当前工作目录。","cli.human-lint.drift-detected":"检测到 human-lock 内容漂移。请回退编辑,或在提交前更新已批准的哈希。","cli.human-lint.table.location":"位置","cli.human-lint.table.expected":"预期","cli.human-lint.table.got":"实际","cli.init.description":"在目标项目中初始化 Fabric。","cli.init.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.init.args.debug.description":"将目标解析细节输出到 stderr。","cli.init.args.force.description":"覆盖现有文件(绕过非破坏性保护)","cli.init.args.yes.description":"接受当前初始化计划并跳过 TTY 向导直接执行","cli.init.args.plan.description":"仅输出初始化计划,不写文件也不执行后续阶段","cli.init.args.reapply.description":"在已有 setup 上重新应用 Fabric 管理的文件和阶段安装器","cli.init.args.no-bootstrap.description":"兼容标志:从初始化计划中移除 bootstrap","cli.init.args.no-mcp.description":"兼容标志:从初始化计划中移除 MCP 配置","cli.init.args.no-hooks.description":"兼容标志:从初始化计划中移除 git hooks","cli.init.args.interactive.description":"兼容标志:禁用 TTY 向导并直接执行","cli.init.mcp.install.global":"使用全局安装的 @fenglimg/fabric-server","cli.init.mcp.install.local":"将 @fenglimg/fabric-server 安装到项目 devDependencies","cli.init.mcp.install.prompt":"MCP 服务端安装范围(global|local)","cli.init.mcp.install.invalid":"无效的 --mcp-install 值“{value}”,将回退到 global","cli.init.mcp.local.installing":"正在运行 {manager} add -D @fenglimg/fabric-server...","cli.init.mcp.local.installed":"已安装到 devDependencies","cli.init.created-path":"{label} {path}","cli.init.skipped-existing-path":"{label} {path}:已存在。","cli.init.force.overwritten":"已覆盖","cli.init.force.warning":"--force 将覆盖 {path} 中现有的 Fabric 产物","cli.init.stages.bootstrap":"正在安装 bootstrap 模板...","cli.init.stages.mcp":"正在配置 MCP 客户端...","cli.init.stages.hooks":"正在安装 git hooks...","cli.init.stages.skipped":"已跳过","cli.init.stages.completed":"已完成","cli.init.stages.failed":"失败","cli.init.stages.summary.ran":"已执行","cli.init.stages.summary.skipped":"已跳过","cli.init.stages.summary.failed":"失败","cli.init.next-step":"{label} {message}","cli.init.reason-message":"{label} {message}","cli.init.plan.title":"Fabric 初始化计划","cli.init.plan.mode-banner.default":"[mode: apply] 标准初始化执行","cli.init.plan.mode-banner.plan":"[mode: plan] 仅预览,不会写入文件","cli.init.plan.mode-banner.reapply":"[mode: reapply] 将强制重新应用 Fabric 管理资产","cli.init.plan.mode-banner.plan-reapply":"[mode: plan+reapply] 正在预览一次强制 reapply,不会写入文件","cli.init.plan.target":"目标:{target}","cli.init.plan.actions":"计划:bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}","cli.init.plan.detected":"检测到的客户端:{clients}","cli.init.plan.writes":"核心写入:","cli.init.plan.preview-title":"Fabric 初始化 dry run","cli.init.plan.preview-result":"模式={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}","cli.init.mode.default":"default","cli.init.mode.reapply":"reapply","cli.init.mode.badge.default":"APPLY","cli.init.mode.badge.plan":"PLAN","cli.init.mode.badge.reapply":"REAPPLY","cli.init.mode.badge.plan-reapply":"PLAN + REAPPLY","cli.init.compat.plan":"已启用标准 --plan 模式:不会写入任何文件。","cli.init.compat.interactive":"兼容提示:--interactive=false 会禁用 TTY 向导。","cli.init.compat.legacy-stage-flags":"兼容提示:旧的 --no-* 标志正在映射到初始化计划中。","cli.init.wizard.title":"Fabric 初始化向导","cli.init.wizard.intro":"Fabric init","cli.init.wizard.overview.title":"安装概览","cli.init.wizard.overview.body":`目标:{target}
|
|
9
9
|
模式:{mode}
|
|
10
|
-
这个向导只负责调整初始化计划;真正执行仍然走现有的 Fabric init 阶段。`,"cli.init.wizard.step.target":"确认目标","cli.init.wizard.step.plan":"配置初始化计划","cli.init.wizard.step.review":"复核最终计划","cli.init.wizard.target.confirm":"确认在 {target} 中继续初始化 Fabric?[Y/n]","cli.init.wizard.stage.bootstrap":"是否安装 bootstrap 模板?[{defaultValue}]","cli.init.wizard.stage.mcp":"是否配置 MCP 客户端?[{defaultValue}]","cli.init.wizard.stage.hooks":"是否安装 git hooks?[{defaultValue}]","cli.init.wizard.mcp-install":"MCP 服务端安装范围(global/local)[{defaultValue}]","cli.init.wizard.execute.confirm":"现在执行该初始化计划?[Y/n]","cli.init.wizard.outro":"初始化计划已确认,开始执行 Fabric init...","cli.init.wizard.invalid-yes-no":"请输入 yes 或 no。","cli.init.wizard.invalid-select":"无效输入。可选值:{options}。","cli.init.wizard.cancelled":"Fabric 初始化已在执行前取消。","cli.init.capabilities.title":"客户端能力摘要","cli.init.capabilities.none":"没有检测到可用于 bootstrap 或 MCP 后续接力的受支持客户端。","cli.init.capabilities.header.client":"客户端","cli.init.capabilities.header.bootstrap":"Bootstrap","cli.init.capabilities.header.mcp":"MCP","cli.init.capabilities.header.hook":"Hook","cli.init.capabilities.header.skill":"Skill","cli.init.capabilities.header.follow-up":"后续动作","cli.init.capabilities.status.ready":"已就绪","cli.init.capabilities.status.installed":"已安装","cli.init.capabilities.status.supported":"已支持","cli.init.capabilities.status.manual":"手动处理","cli.init.capabilities.status.skipped":"已跳过","cli.init.capabilities.status.failed":"失败","cli.init.capabilities.status.na":"不适用","cli.init.capabilities.follow-up.ready":"可在客户端继续","cli.init.capabilities.follow-up.install":"安装客户端资产","cli.init.capabilities.follow-up.manual":"需要手动后续处理","cli.init.next-step.message":"运行 fab hooks install 以添加第 4 天的 pre-commit 流水线。","cli.init.reason-message.claude-body":".fabric/forensic.json 已就绪;请使用 agents-md-init skill 完成 Fabric 内部初始化。","cli.init.reason-message.codex-body":".fabric/forensic.json 已就绪;请继续使用仓库内的 .agents/skills/fabric-init/SKILL.md,并为 Codex hooks 启用 features.codex_hooks = true。","cli.init.reason-message.multi-body":".fabric/forensic.json 已就绪;请按已安装客户端继续后续流程:Claude 使用 agents-md-init,Codex 使用 .agents/skills/fabric-init/SKILL.md,并启用 features.codex_hooks = true。","cli.init.reason-message.installable-body":".fabric/forensic.json 已就绪;部分已检测到的客户端已支持 Fabric 后续接力,但仍需安装客户端资产。","cli.init.reason-message.manual-body":".fabric/forensic.json 已就绪;部分已检测到的客户端尚未安装 Fabric skill,需要手动完成后续初始化。","cli.init.codex-hooks.created":"{label} {path},并写入 Codex hooks 配置(需启用 features.codex_hooks = true)。","cli.init.codex-hooks.updated":"{label} {path},并写入 Codex hooks 配置(需启用 features.codex_hooks = true)。","cli.init.codex-hooks.skipped":"{label} {path}:Codex hooks 配置已存在。","cli.init.claude-settings.created":"{label} {path},并写入 Claude Stop hook。","cli.init.claude-settings.updated":"{label} {path},并写入 Claude Stop hook。","cli.init.claude-settings.skipped":"{label} {path}:Claude Stop hook 已存在。","cli.init.claude-settings.skipped-invalid":"{label} {path}:无法合并 Claude Stop hook。","cli.init.claude-settings.invalid-object":"{label} {path}:预期为 JSON 对象。","cli.init.claude-settings.invalid-json":"{label} {path}:JSON 无效({reason})。","cli.init.claude-settings.invalid-hooks":'{label} {path}:"hooks" 必须是 JSON 对象。',"cli.init.claude-settings.invalid-stop-array":'{label} {path}:"hooks.Stop" 必须是数组。',"cli.init.errors.abort-existing":"中止:{path} 已存在。fab init 是非破坏性的。","cli.ledger-append.description":"向 Fabric 意图日志追加一条记录。","cli.ledger-append.args.target.description":"目标项目路径,默认为当前工作目录。","cli.ledger-append.args.staged.description":"从暂存变更推导记录(用于 pre-commit 阶段)。","cli.ledger-append.requires-staged":"pre-commit 场景下必须传入 --staged","cli.ledger-append.intent.auto":"自动:{head}{suffix}","cli.ledger-append.intent.auto-more":" 等 {count} 项","cli.pre-commit.description":"复合 pre-commit 钩子:在单个 Node 进程中依次执行 sync-meta --check-only、human-lint、ledger-append --staged。","cli.pre-commit.args.target.description":"项目根目录,默认取当前目录或 EXTERNAL_FIXTURE_PATH。","cli.pre-commit.run-failed":"fabric pre-commit:{name} 失败 - {message}","cli.scan.description":"扫描项目以检测 Fabric 引导候选模块。","cli.scan.args.target.description":"目标绝对路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.scan.args.debug.description":"以格式化输出打印检测证据。","cli.scan.args.json.description":"以 JSON 格式输出诊断报告。","cli.scan.report.title":"Fabric 扫描报告","cli.scan.report.target":"目标","cli.scan.report.framework":"框架","cli.scan.report.evidence":"证据","cli.scan.report.readme-quality":"README 质量","cli.scan.report.contributing":"CONTRIBUTING.md","cli.scan.report.files-counted":"文件数","cli.scan.report.ignored-entries":"忽略项","cli.scan.report.existing-fabric":"现有 Fabric 文件","cli.scan.report.recommendations":"建议:","cli.scan.readme-quality.ok":"良好","cli.scan.readme-quality.stub":"草稿","cli.scan.recommendation.init":"L0:运行 fab init,在 .fabric/bootstrap/README.md 生成带 TODO 标记的初始说明。","cli.scan.recommendation.readme":"L0:先补充 README.md,再把项目事实整理到 Fabric 参考文件中。","cli.scan.recommendation.contributing":"L0:添加 CONTRIBUTING.md,或在 bootstrap 中留下贡献流程的 TODO 说明。","cli.scan.recommendation.unknown-framework":"L1:当前未检测到框架标记,需要手动补充技术栈说明。","cli.scan.recommendation.framework-dirs":"L1:检查 {framework} 目录,后续为其补充对应作用域的 Fabric 规则文件。","cli.serve.description":"启动本地 Fabric MCP HTTP 服务。若需绑定到非 localhost,请设置 FABRIC_AUTH_TOKEN 以启用 Bearer 鉴权。","cli.serve.args.port.description":"监听端口,默认 7373。","cli.serve.args.host.description":"监听主机,默认 127.0.0.1。若需绑定到非 localhost,请设置 FABRIC_AUTH_TOKEN 以启用 Bearer 鉴权。","cli.serve.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.serve.args.debug.description":"将目标解析细节输出到 stderr。","cli.serve.ready.title":"Fabric 仪表盘","cli.serve.warning.host-fallback":"--host {host} 需要 FABRIC_AUTH_TOKEN;为安全起见已回退到 127.0.0.1","cli.serve.error.port-in-use":"端口 {port} 已被占用,可尝试 --port {nextPort}","cli.update.description":"刷新 MCP 主机配置和 git hooks,不重新创建 Fabric 文件。","cli.update.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.update.args.no-mcp.description":"跳过重新配置 MCP 客户端","cli.update.args.no-hooks.description":"跳过重新安装 git hooks","cli.sync-meta.description":"从内部规则文件同步 Fabric 元数据。","cli.sync-meta.args.target.description":"目标项目路径,默认为当前工作目录。","cli.sync-meta.args.check-only.description":"如果 .fabric/agents.meta.json 已过期,则以代码 1 退出。","cli.sync-meta.drift-detected":"检测到 Fabric 元数据漂移。请运行 fab sync-meta 进行更新。","cli.sync-meta.updated":"{label} {path}","dashboard.app.nav.aria-label":"仪表盘视图导航","dashboard.app.nav.module-a.label":"规则拓扑","dashboard.app.nav.module-a.label-bilingual":"规则命中 Rule Topology","dashboard.app.nav.module-a.subtitle":"覆盖热力图 + 命中原因","dashboard.app.nav.module-b.label":"认知扫描","dashboard.app.nav.module-b.label-bilingual":"认知扫描 Cognitive Forensic","dashboard.app.nav.module-b.subtitle":"占位","dashboard.app.nav.module-c.label":"语义时间线","dashboard.app.nav.module-c.label-bilingual":"语义时间线 Semantic Timeline","dashboard.app.nav.module-c.subtitle":"占位","dashboard.app.nav.module-d.label":"历史记录","dashboard.app.nav.module-d.label-bilingual":"历史记录 Historical Ledger","dashboard.app.nav.module-d.subtitle":"占位","dashboard.app.nav.rules.label":"规则树","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"规则结构","dashboard.app.nav.locks.label":"人工保护","dashboard.app.nav.locks.label-bilingual":"人工保护 Human Lock","dashboard.app.nav.locks.subtitle":"受保护区域","dashboard.app.nav.timeline.label":"意图时间线","dashboard.app.nav.timeline.label-bilingual":"意图时间线 Intent Timeline","dashboard.app.nav.timeline.subtitle":"变更记录","dashboard.app.nav.history.label":"历史回放","dashboard.app.nav.history.label-bilingual":"历史回放 History Replay","dashboard.app.nav.history.subtitle":"时间回溯","dashboard.app.nav.doctor.label":"诊断台","dashboard.app.nav.doctor.label-bilingual":"诊断台 Doctor","dashboard.app.nav.doctor.subtitle":"状态检查","dashboard.app.nav.section.modules-status":"模块状态","dashboard.app.nav.section.diagnostics":"诊断","dashboard.app.nav.drift-check":"漂移检查","dashboard.app.nav.modules.read-only":"只读仪表盘","dashboard.app.header.connected":"已连接","dashboard.app.header.connecting":"连接中","dashboard.app.live-region.received":"已收到 {type}","dashboard.app.breadcrumb.topology":"rule-topology","dashboard.app.breadcrumb.forensic":"cognitive-forensic","dashboard.app.breadcrumb.semantic":"semantic-timeline","dashboard.app.breadcrumb.ledger":"historical-ledger","dashboard.app.breadcrumb.rules":"rules-tree","dashboard.app.breadcrumb.locks":"human-lock","dashboard.app.breadcrumb.timeline":"intent-timeline","dashboard.app.breadcrumb.history":"history-replay","dashboard.app.breadcrumb.doctor":"doctor","dashboard.rule-topology.title":"规则命中","dashboard.rule-topology.subtitle":"查看当前路径会命中哪些规则,以及为什么会命中","dashboard.rule-topology.path.placeholder":"用于规则上下文的样本路径","dashboard.rule-topology.path.aria-label":"规则上下文样本路径","dashboard.rule-topology.status.sample":"当前路径 {path}","dashboard.rule-topology.status.hits":"{count} 条命中","dashboard.rule-topology.status.revision":"版本 {revision}","dashboard.rule-topology.heatmap.title":"覆盖热力图","dashboard.rule-topology.heatmap.subtitle":"基于 scope_glob 模式推导的目录覆盖情况","dashboard.rule-topology.heatmap.aria-label":"目录覆盖热力图","dashboard.rule-topology.heatmap.count":"{count} 个目录","dashboard.rule-topology.heatmap.rules":"{count} 条规则","dashboard.rule-topology.heatmap.uncovered":"没有匹配作用域","dashboard.rule-topology.heatmap.empty":"当前没有可显示的规则目录。","dashboard.rule-topology.heatmap.density.full":"已覆盖","dashboard.rule-topology.heatmap.density.partial":"部分覆盖","dashboard.rule-topology.heatmap.density.none":"未覆盖","dashboard.rule-topology.hit-reason.title":"命中原因","dashboard.rule-topology.hit-reason.subtitle":"显示当前样本路径为何命中这些规则","dashboard.rule-topology.hit-reason.aria-label":"规则命中原因","dashboard.rule-topology.hit-reason.count":"{count} 条原因","dashboard.rule-topology.hit-reason.empty":"当前样本路径没有加载到规则。","dashboard.rule-topology.hit-reason.global":"全局","dashboard.rule-topology.hit-reason.tier.always":"常驻","dashboard.rule-topology.hit-reason.tier.path":"Glob","dashboard.rule-topology.hit-reason.tier.description":"描述","dashboard.module-placeholder.coming-soon":"功能预留","dashboard.module-placeholder.read-only":"为后续只读仪表盘能力预留。","dashboard.module-placeholder.forensic.title":"认知扫描","dashboard.module-placeholder.forensic.subtitle":"后续补充","dashboard.module-placeholder.semantic.title":"语义时间线","dashboard.module-placeholder.semantic.subtitle":"后续补充","dashboard.module-placeholder.ledger.title":"历史记录","dashboard.module-placeholder.ledger.subtitle":"后续补充","dashboard.rules-tree.title":"规则树","dashboard.rules-tree.subtitle":"查看 .fabric/agents.meta.json 中的规则结构、层级和同步状态","dashboard.rules-tree.filter.placeholder":"按文件、作用域、优先级、哈希过滤...","dashboard.rules-tree.filter.aria-label":"过滤规则树","dashboard.rules-tree.status.loading":"规则加载中","dashboard.rules-tree.status.nodes":"{count} 个节点 · 版本 {revision}","dashboard.rules-tree.status.locks":"{count} 个受保护区域","dashboard.rules-tree.empty":"没有匹配的规则。","dashboard.rules-tree.tree.aria-label":"Fabric 规则树","dashboard.rules-tree.detail.title":"节点详情","dashboard.rules-tree.detail.empty":"选择一个规则节点以查看作用域、依赖、优先级和哈希。","dashboard.rules-tree.detail.file":"文件","dashboard.rules-tree.detail.scope":"作用域","dashboard.rules-tree.detail.priority":"优先级","dashboard.rules-tree.detail.hash":"哈希","dashboard.rules-tree.detail.no-deps":"无依赖","dashboard.human-lock.title":"人工保护","dashboard.human-lock.subtitle":"查看需要人工确认的受保护区域","dashboard.human-lock.filters.aria-label":"人工保护过滤器","dashboard.human-lock.filters.all":"全部","dashboard.human-lock.filters.drift":"漂移","dashboard.human-lock.filters.approved":"已批准","dashboard.human-lock.summary":"{drift} 处漂移 · {approved} 项已确认","dashboard.human-lock.empty":"当前过滤条件下没有受保护记录。","dashboard.intent-timeline.title":"意图时间线","dashboard.intent-timeline.subtitle":"查看 AI 与人工留下的变更记录,按时间倒序排列","dashboard.intent-timeline.filter.label":"来源","dashboard.intent-timeline.filter.all":"全部","dashboard.intent-timeline.summary":"AI {aiCount} · Human {humanCount}","dashboard.intent-timeline.columns.ai.title":"AI","dashboard.intent-timeline.columns.ai.entries":"{count} 条记录","dashboard.intent-timeline.columns.human.title":"人工","dashboard.intent-timeline.columns.human.entries":"{count} 条记录","dashboard.intent-timeline.empty":"没有找到日志记录。","dashboard.intent-timeline.annotate.missing-id":"缺少 id,无法为这条日志添加注释。","dashboard.history-replay.title":"历史回放","dashboard.history-replay.subtitle":"按历史记录回看当时的规则树状态","dashboard.history-replay.toolbar.scrub":"拖动","dashboard.history-replay.toolbar.latest":"最新","dashboard.history-replay.selected.none":"尚未选择历史记录","dashboard.history-replay.status.replay-points":"{count} 个回放点","dashboard.history-replay.status.entries-applied":"已应用 {count} 条记录","dashboard.history-replay.empty.entries":"没有可用于回放的日志记录。","dashboard.history-replay.state.title":"查看 {label} 时刻的状态","dashboard.history-replay.state.meta":"记录 {ledgerId} · 提交 {commit} · {mode}","dashboard.history-replay.status.loading":"快照加载中","dashboard.history-replay.status.nodes":"{count} 个节点","dashboard.history-replay.status.unknown-revision":"未知版本","dashboard.history-replay.tree.aria-label":"历史 Fabric 规则树","dashboard.history-replay.empty.loading":"正在加载历史快照...","dashboard.history-replay.empty.select":"请选择一条时间线记录以回放其状态。","dashboard.history-replay.meta.not-available":"不可用","dashboard.history-replay.meta.pending":"等待中","dashboard.history-replay.meta.na":"无","dashboard.doctor.title":"诊断控制台","dashboard.doctor.subtitle":"查看框架、入口点、版本漂移和受保护路径的状态","dashboard.doctor.toolbar.overall":"整体状态","dashboard.doctor.toolbar.no-summary":"暂无摘要","dashboard.doctor.toolbar.entry-points-summary":"{framework} · {count} 个入口点","dashboard.doctor.toolbar.entry-point-summary":"{framework} · {count} 个入口点","dashboard.doctor.empty.loading":"正在加载 doctor 报告...","dashboard.doctor.summary.framework":"框架","dashboard.doctor.summary.protected-paths":"受保护路径","dashboard.doctor.summary.intent-ledger":"意图日志","dashboard.doctor.summary.no-meta-revision":"暂无元数据版本","dashboard.doctor.summary.tracked-paths.none":"没有跟踪路径","dashboard.doctor.summary.tracked-paths.some":"已跟踪 {count} 项","dashboard.doctor.summary.hashes-intact":"所有已批准哈希均完好","dashboard.doctor.summary.drifted":"{count} 项发生漂移","dashboard.doctor.summary.no-ledger-entries":"暂无日志记录","dashboard.doctor.card.entry-points":"入口点","dashboard.doctor.card.checks":"检查项","dashboard.doctor.empty.entry-points":"当前未检测到入口点。","dashboard.doctor.framework.unknown":"未知","dashboard.doctor.age.none":"暂无记录","dashboard.doctor.age.seconds":"{count} 秒前","dashboard.doctor.age.minutes":"{count} 分钟前","dashboard.doctor.age.hours":"{count} 小时前","dashboard.doctor.age.days":"{count} 天前","dashboard.doctor.age.weeks":"{count} 周前","dashboard.shared.refresh":"刷新","dashboard.shared.loading":"加载中","dashboard.shared.status.ok":"正常","dashboard.shared.status.warn":"警告","dashboard.shared.status.error":"错误","dashboard.shared.status.confirmed":"已确认","dashboard.shared.status.hash-drift":"哈希漂移","dashboard.shared.status.stale":"过期","dashboard.shared.status.orphan":"孤立","dashboard.shared.status.attention":"注意","dashboard.source.ai":"AI","dashboard.source.human":"人工","dashboard.timeline-entry.aria-label":"{source} 意图 {intent}","dashboard.timeline-entry.working-tree":"工作区","dashboard.timeline-entry.parent":"父提交 {parent}","dashboard.timeline-entry.paths":"路径","dashboard.timeline-entry.annotate":"添加注释","dashboard.timeline-entry.annotation-label":"人工注释","dashboard.timeline-entry.annotation-placeholder":"说明审核结论或批准背景...","dashboard.timeline-entry.annotation-save":"保存注释","dashboard.tree-node.locked":"已锁定","dashboard.tree-node.stale.hash-mismatch":"哈希不匹配","dashboard.tree-node.stale.orphan":"孤立","dashboard.lock-card.aria-label":"{file} {lineRange} {status}","dashboard.lock-card.status.drift":"哈希漂移","dashboard.lock-card.status.confirmed":"已确认","dashboard.lock-card.hash.locked":"锁定哈希","dashboard.lock-card.hash.current":"当前哈希","dashboard.lock-card.hash.diff":"差异","dashboard.lock-card.preview.drift":"漂移","dashboard.lock-card.preview.sync":"同步","dashboard.lock-card.preview.drift-detail":"哈希与受保护区域不一致。","dashboard.lock-card.preview.sync-detail":"受保护区域当前保持同步。","dashboard.lock-card.footer.region":"受保护区域 · {count} 行","dashboard.lock-card.button.approve":"批准新哈希","dashboard.lock-card.button.confirmed":"已确认","dashboard.lock-card.diff.hash-mismatch":"哈希不一致","dashboard.lock-card.diff.no-changes":"无变更","dashboard.lock-card.diff.with-bytes":"+{added} / -{removed} · {bytes} 字节","dashboard.lock-card.diff.without-bytes":"+{added} / -{removed}","dashboard.approve-button.retry":"重试"},Vr={en:Ur,"zh-CN":Hr};function Br(t,e=Vr){const a=e[t]??e.en,r=e.en;return(i,n)=>{const o=a[i]??r[i]??i;return n===void 0?o:Object.entries(n).reduce((l,[c,d])=>l.replaceAll(`{${c}}`,d),o)}}function Wr(t){if(typeof t!="string")return"en";const e=t.trim().toLowerCase().replace(/\..*$/,"").replace(/_/g,"-");return e.length===0?"en":e==="zh"||e.startsWith("zh-")?"zh-CN":"en"}function qr(){return typeof navigator<"u"&&typeof navigator.language=="string"?Wr(navigator.language):"en"}function Xr(t=qr()){return{locale:t,t:Br(t)}}const Xa=yr(null);function Yr({children:t}){const e=Y(()=>Xr(),[]);return s(Xa.Provider,{value:e,children:t})}function D(){const t=kr(Xa);if(t===null)throw new Error("useI18n must be used within an I18nProvider.");return t}function Ya({variant:t,state:e="idle",size:a="md",onClick:r,children:i,ariaLabel:n}){const{t:o}=D(),[l,c]=R(e),d=e==="idle"?l:e,h=d==="busy",u=async()=>{if(!h){c("busy");try{await r(),c("success"),window.setTimeout(()=>c("idle"),900)}catch{c("error"),window.setTimeout(()=>c("idle"),1400)}}};return s("button",{type:"button",className:`action-button action-${t} action-${a} action-${d}`,"aria-label":n,"aria-busy":h,"aria-disabled":h,onClick:u,children:[h?s("span",{className:"spinner","aria-hidden":"true"}):null,d==="success"?s("span",{"aria-hidden":"true",children:"✓"}):null,d==="error"?o("dashboard.approve-button.retry"):i]})}function Jr({nodes:t}){const{t:e}=D(),a=Gr(t);return s("section",{className:"topology-card",children:[s("div",{className:"topology-card-head",children:[s("div",{children:[s("h3",{children:e("dashboard.rule-topology.heatmap.title")}),s("p",{className:"muted",children:e("dashboard.rule-topology.heatmap.subtitle")})]}),s("span",{className:"badge badge-level",children:e("dashboard.rule-topology.heatmap.count",{count:String(a.length)})})]}),a.length===0?s("div",{className:"empty-card",children:e("dashboard.rule-topology.heatmap.empty")}):s("div",{className:"coverage-grid",role:"list","aria-label":e("dashboard.rule-topology.heatmap.aria-label"),children:a.map(r=>s("article",{className:`coverage-row coverage-${r.density}`,role:"listitem",children:[s("div",{className:"coverage-row-main",children:[s("span",{className:"coverage-path",children:r.path}),s("span",{className:`badge coverage-chip coverage-chip-${r.density}`,children:e(`dashboard.rule-topology.heatmap.density.${r.density}`)})]}),s("div",{className:"coverage-row-meta",children:[s("span",{children:e("dashboard.rule-topology.heatmap.rules",{count:String(r.directRuleCount)})}),s("span",{children:r.matchingGlobs.slice(0,2).join(" · ")||e("dashboard.rule-topology.heatmap.uncovered")})]})]},r.path))})]})}function Gr(t){return Kr(t).map(r=>{const i=t.filter(o=>ei(r,qe(o.scope_glob))),n=i.some(o=>Qr(r,qe(o.scope_glob)));return{path:r,density:n?"full":i.length>0?"partial":"none",matchingGlobs:i.map(o=>o.scope_glob),directRuleCount:i.length}}).sort((r,i)=>r.path.localeCompare(i.path))}function Kr(t){const e=new Set;for(const a of t){for(const i of oa(a.file))e.add(i);const r=Ut(a.scope_glob);if(r.length>0)for(const i of oa(r))e.add(i)}return Array.from(e)}function oa(t){const a=qe(t).split("/").filter(Boolean);if(a.length===0)return[];const i=(a.at(-1)??"").includes(".")?a.length-1:a.length,n=[];for(let o=1;o<=i;o+=1)n.push(a.slice(0,o).join("/"));return n}function Ut(t){const e=qe(t).split("/").filter(Boolean),a=[];for(const r of e){if(r==="**"||/[*?[\]{}()!]/.test(r))break;a.push(r)}return a.join("/")}function Qr(t,e){const a=Ut(e);return a.length===0?!1:a===t&&(e===t||e.startsWith(`${t}/**`)||e.startsWith(`${t}/*`))}function ei(t,e){const a=Ut(e);return a.length===0?!0:a===t||a.startsWith(`${t}/`)||t.startsWith(`${a}/`)}function qe(t){return t.replaceAll("\\","/").replace(/^\.?\//,"").replace(/\/+$/,"")}const ti={ok:"dashboard.shared.status.confirmed",drift:"dashboard.shared.status.hash-drift",stale:"dashboard.shared.status.stale",orphan:"dashboard.shared.status.orphan",locked:"dashboard.shared.status.attention"};function te({kind:t,severity:e,message:a,diffStats:r}){const{t:i}=D();if(e==="ok"&&t==="dot")return null;const n=a??i(ti[e]),o=r===void 0?"":` +${r.added} / -${r.removed}`,l=`drift-indicator drift-${t} drift-${e}`;return t==="dot"?s("span",{className:l,"aria-label":n}):t==="banner"?s("div",{className:l,role:"status",children:[s("span",{"aria-hidden":"true",children:"!"}),s("span",{children:[n,o]})]}):s("span",{className:l,children:[s("span",{"aria-hidden":"true",children:e==="ok"?"✓":"!"}),s("span",{children:[n,o]})]})}function ai({meta:t,rulesContext:e}){const{t:a}=D(),r=ri(t,e);return s("section",{className:"topology-card",children:[s("div",{className:"topology-card-head",children:[s("div",{children:[s("h3",{children:a("dashboard.rule-topology.hit-reason.title")}),s("p",{className:"muted",children:a("dashboard.rule-topology.hit-reason.subtitle")})]}),s("span",{className:"badge badge-level",children:a("dashboard.rule-topology.hit-reason.count",{count:String(r.length)})})]}),r.length===0?s("div",{className:"empty-card",children:a("dashboard.rule-topology.hit-reason.empty")}):s("div",{className:"reason-list",role:"list","aria-label":a("dashboard.rule-topology.hit-reason.aria-label"),children:r.map(i=>s("article",{className:"reason-card",role:"listitem",children:[s("div",{className:"reason-card-head",children:[s("strong",{children:i.file}),s("span",{className:`badge reason-tier reason-tier-${i.tier}`,children:a(`dashboard.rule-topology.hit-reason.tier.${i.tier}`)})]}),s("div",{className:"reason-card-meta",children:[s("span",{children:i.layer}),s("span",{children:i.tier==="always"?a("dashboard.rule-topology.hit-reason.global"):i.scope})]}),i.description!==null&&i.description.length>0?s("p",{className:"reason-description",children:i.description}):null]},`${i.layer}:${i.file}:${i.tier}`))})]})}function ri(t,e){if(t===null||e===null)return[];const a=new Map(Object.values(t.nodes).map(n=>[n.file,n])),r=[],i=new Set;for(const n of e.L1)la(r,i,a,n.path,"L1");for(const n of e.L2)la(r,i,a,n.path,"L2");for(const n of e.description_stubs??[]){const o=`description:${n.path}`;if(i.has(o))continue;const l=a.get(n.path);r.push({file:n.path,layer:"description",tier:"description",scope:l?.scope_glob??"",description:n.description}),i.add(o)}return r.sort((n,o)=>n.file.localeCompare(o.file))}function la(t,e,a,r,i){const n=`${i}:${r}`;if(e.has(n))return;const o=a.get(r),l=o?.activation?.tier??"path";t.push({file:r,layer:i,tier:l,scope:o?.scope_glob??"",description:l==="description"?o?.activation?.description??null:null}),e.add(n)}function ii({entry:t,currentHash:e,diffStats:a,diffPreview:r=[],onApprove:i,busy:n=!1}){const{t:o}=D(),l=e!==void 0&&e!==t.hash,c=l?"drift":"ok",d=o(l?"dashboard.lock-card.status.drift":"dashboard.lock-card.status.confirmed"),h=`L${t.start_line}-L${t.end_line}`;return s("article",{className:`lock-card lock-${c} ${n?"is-busy":""}`,"aria-label":o("dashboard.lock-card.aria-label",{file:t.file,lineRange:h,status:d}),children:[s("header",{className:"lock-head",children:[s("div",{className:"lock-icon","aria-hidden":"true",children:l?"!":"✓"}),s("div",{className:"lock-title",children:[s("strong",{children:t.file}),s("span",{children:h})]}),s(te,{kind:"pill",severity:l?"drift":"ok",message:d})]}),s("div",{className:"lock-body",children:[s("div",{className:"hash-block",children:[s(mt,{label:o("dashboard.lock-card.hash.locked"),value:t.hash,stale:l}),s(mt,{label:o("dashboard.lock-card.hash.current"),value:e??o("dashboard.history-replay.meta.not-available")}),s(mt,{label:o("dashboard.lock-card.hash.diff"),value:ni(a,l,o),accent:l})]}),s("div",{className:"preview",children:[s("div",{className:"preview-head",children:[s("span",{children:[t.file," · ",h]}),s("span",{children:o(l?"dashboard.lock-card.preview.drift":"dashboard.lock-card.preview.sync")})]}),s("pre",{className:"preview-body",children:r.length>0?r.map(u=>s("span",{className:`line-${u.kind}`,children:[s("span",{className:"line-num",children:u.line}),u.text,`
|
|
10
|
+
这个向导只负责调整初始化计划;真正执行仍然走现有的 Fabric init 阶段。`,"cli.init.wizard.step.target":"确认目标","cli.init.wizard.step.plan":"配置初始化计划","cli.init.wizard.step.review":"复核最终计划","cli.init.wizard.target.confirm":"确认在 {target} 中继续初始化 Fabric?[Y/n]","cli.init.wizard.stage.bootstrap":"是否安装 bootstrap 模板?[{defaultValue}]","cli.init.wizard.stage.mcp":"是否配置 MCP 客户端?[{defaultValue}]","cli.init.wizard.stage.hooks":"是否安装 git hooks?[{defaultValue}]","cli.init.wizard.mcp-install":"MCP 服务端安装范围(global/local)[{defaultValue}]","cli.init.wizard.execute.confirm":"现在执行该初始化计划?[Y/n]","cli.init.wizard.outro":"初始化计划已确认,开始执行 Fabric init...","cli.init.wizard.invalid-yes-no":"请输入 yes 或 no。","cli.init.wizard.invalid-select":"无效输入。可选值:{options}。","cli.init.wizard.cancelled":"Fabric 初始化已在执行前取消。","cli.init.capabilities.title":"客户端能力摘要","cli.init.capabilities.none":"没有检测到可用于 bootstrap 或 MCP 后续接力的受支持客户端。","cli.init.capabilities.header.client":"客户端","cli.init.capabilities.header.bootstrap":"Bootstrap","cli.init.capabilities.header.mcp":"MCP","cli.init.capabilities.header.hook":"Hook","cli.init.capabilities.header.skill":"Skill","cli.init.capabilities.header.follow-up":"后续动作","cli.init.capabilities.status.ready":"已就绪","cli.init.capabilities.status.installed":"已安装","cli.init.capabilities.status.supported":"已支持","cli.init.capabilities.status.manual":"手动处理","cli.init.capabilities.status.skipped":"已跳过","cli.init.capabilities.status.failed":"失败","cli.init.capabilities.status.na":"不适用","cli.init.capabilities.follow-up.ready":"可在客户端继续","cli.init.capabilities.follow-up.install":"安装客户端资产","cli.init.capabilities.follow-up.manual":"需要手动后续处理","cli.init.next-step.message":"运行 fab hooks install 以添加第 4 天的 pre-commit 流水线。","cli.init.reason-message.claude-body":".fabric/forensic.json 已就绪;请使用 agents-md-init skill 完成 Fabric 内部初始化。","cli.init.reason-message.codex-body":".fabric/forensic.json 已就绪;请继续使用仓库内的 .agents/skills/fabric-init/SKILL.md,并为 Codex hooks 启用 features.codex_hooks = true。","cli.init.reason-message.multi-body":".fabric/forensic.json 已就绪;请按已安装客户端继续后续流程:Claude 使用 agents-md-init,Codex 使用 .agents/skills/fabric-init/SKILL.md,并启用 features.codex_hooks = true。","cli.init.reason-message.installable-body":".fabric/forensic.json 已就绪;部分已检测到的客户端已支持 Fabric 后续接力,但仍需安装客户端资产。","cli.init.reason-message.manual-body":".fabric/forensic.json 已就绪;部分已检测到的客户端尚未安装 Fabric skill,需要手动完成后续初始化。","cli.init.codex-hooks.created":"{label} {path},并写入 Codex hooks 配置(需启用 features.codex_hooks = true)。","cli.init.codex-hooks.updated":"{label} {path},并写入 Codex hooks 配置(需启用 features.codex_hooks = true)。","cli.init.codex-hooks.skipped":"{label} {path}:Codex hooks 配置已存在。","cli.init.claude-settings.created":"{label} {path},并写入 Claude Stop hook。","cli.init.claude-settings.updated":"{label} {path},并写入 Claude Stop hook。","cli.init.claude-settings.skipped":"{label} {path}:Claude Stop hook 已存在。","cli.init.claude-settings.skipped-invalid":"{label} {path}:无法合并 Claude Stop hook。","cli.init.claude-settings.invalid-object":"{label} {path}:预期为 JSON 对象。","cli.init.claude-settings.invalid-json":"{label} {path}:JSON 无效({reason})。","cli.init.claude-settings.invalid-hooks":'{label} {path}:"hooks" 必须是 JSON 对象。',"cli.init.claude-settings.invalid-stop-array":'{label} {path}:"hooks.Stop" 必须是数组。',"cli.init.errors.abort-existing":"中止:{path} 已存在。fab init 是非破坏性的。","cli.ledger-append.description":"向 Fabric 意图日志追加一条记录。","cli.ledger-append.args.target.description":"目标项目路径,默认为当前工作目录。","cli.ledger-append.args.staged.description":"从暂存变更推导记录(用于 pre-commit 阶段)。","cli.ledger-append.requires-staged":"pre-commit 场景下必须传入 --staged","cli.ledger-append.intent.auto":"自动:{head}{suffix}","cli.ledger-append.intent.auto-more":" 等 {count} 项","cli.pre-commit.description":"复合 pre-commit 钩子:在单个 Node 进程中依次执行 sync-meta --check-only、human-lint、ledger-append --staged。","cli.pre-commit.args.target.description":"项目根目录,默认取当前目录或 EXTERNAL_FIXTURE_PATH。","cli.pre-commit.run-failed":"fabric pre-commit:{name} 失败 - {message}","cli.scan.description":"扫描项目以检测 Fabric 引导候选模块。","cli.scan.args.target.description":"目标绝对路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.scan.args.debug.description":"以格式化输出打印检测证据。","cli.scan.args.json.description":"以 JSON 格式输出诊断报告。","cli.scan.report.title":"Fabric 扫描报告","cli.scan.report.target":"目标","cli.scan.report.framework":"框架","cli.scan.report.evidence":"证据","cli.scan.report.readme-quality":"README 质量","cli.scan.report.contributing":"CONTRIBUTING.md","cli.scan.report.files-counted":"文件数","cli.scan.report.ignored-entries":"忽略项","cli.scan.report.existing-fabric":"现有 Fabric 文件","cli.scan.report.recommendations":"建议:","cli.scan.readme-quality.ok":"良好","cli.scan.readme-quality.stub":"草稿","cli.scan.recommendation.init":"L0:运行 fab init,在 .fabric/bootstrap/README.md 生成带 TODO 标记的初始说明。","cli.scan.recommendation.readme":"L0:先补充 README.md,再把项目事实整理到 Fabric 参考文件中。","cli.scan.recommendation.contributing":"L0:添加 CONTRIBUTING.md,或在 bootstrap 中留下贡献流程的 TODO 说明。","cli.scan.recommendation.unknown-framework":"L1:当前未检测到框架标记,需要手动补充技术栈说明。","cli.scan.recommendation.framework-dirs":"L1:检查 {framework} 目录,后续为其补充对应作用域的 Fabric 规则文件。","cli.serve.description":"启动本地 Fabric MCP HTTP 服务。若需绑定到非 localhost,请设置 FABRIC_AUTH_TOKEN 以启用 Bearer 鉴权。","cli.serve.args.port.description":"监听端口,默认 7373。","cli.serve.args.host.description":"监听主机,默认 127.0.0.1。若需绑定到非 localhost,请设置 FABRIC_AUTH_TOKEN 以启用 Bearer 鉴权。","cli.serve.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.serve.args.debug.description":"将目标解析细节输出到 stderr。","cli.serve.ready.title":"Fabric 仪表盘","cli.serve.warning.host-fallback":"--host {host} 需要 FABRIC_AUTH_TOKEN;为安全起见已回退到 127.0.0.1","cli.serve.error.port-in-use":"端口 {port} 已被占用,可尝试 --port {nextPort}","cli.update.description":"刷新 MCP 主机配置和 git hooks,不重新创建 Fabric 文件。","cli.update.args.target.description":"目标项目路径。默认依次使用 CLI 参数、EXTERNAL_FIXTURE_PATH、fabric.config.json、当前目录。","cli.update.args.no-mcp.description":"跳过重新配置 MCP 客户端","cli.update.args.no-hooks.description":"跳过重新安装 git hooks","cli.sync-meta.description":"从内部规则文件同步 Fabric 元数据。","cli.sync-meta.args.target.description":"目标项目路径,默认为当前工作目录。","cli.sync-meta.args.check-only.description":"如果 .fabric/agents.meta.json 已过期,则以代码 1 退出。","cli.sync-meta.drift-detected":"检测到 Fabric 元数据漂移。请运行 fab sync-meta 进行更新。","cli.sync-meta.updated":"{label} {path}","dashboard.app.nav.aria-label":"仪表盘视图导航","dashboard.app.nav.module-a.label":"规则拓扑","dashboard.app.nav.module-a.label-bilingual":"规则命中 Rule Topology","dashboard.app.nav.module-a.subtitle":"覆盖热力图 + 命中原因","dashboard.app.nav.module-b.label":"认知扫描","dashboard.app.nav.module-b.label-bilingual":"认知扫描 Cognitive Forensic","dashboard.app.nav.module-b.subtitle":"占位","dashboard.app.nav.module-c.label":"语义时间线","dashboard.app.nav.module-c.label-bilingual":"语义时间线 Semantic Timeline","dashboard.app.nav.module-c.subtitle":"占位","dashboard.app.nav.module-d.label":"历史记录","dashboard.app.nav.module-d.label-bilingual":"历史记录 Historical Ledger","dashboard.app.nav.module-d.subtitle":"占位","dashboard.app.nav.rules.label":"规则树","dashboard.app.nav.rules.label-bilingual":"规则树 Rules Tree","dashboard.app.nav.rules.subtitle":"规则结构","dashboard.app.nav.locks.label":"人工保护","dashboard.app.nav.locks.label-bilingual":"人工保护 Human Lock","dashboard.app.nav.locks.subtitle":"受保护区域","dashboard.app.nav.timeline.label":"意图时间线","dashboard.app.nav.timeline.label-bilingual":"意图时间线 Intent Timeline","dashboard.app.nav.timeline.subtitle":"变更记录","dashboard.app.nav.history.label":"历史回放","dashboard.app.nav.history.label-bilingual":"历史回放 History Replay","dashboard.app.nav.history.subtitle":"时间回溯","dashboard.app.nav.doctor.label":"诊断台","dashboard.app.nav.doctor.label-bilingual":"诊断台 Doctor","dashboard.app.nav.doctor.subtitle":"状态检查","dashboard.app.nav.section.modules-status":"模块状态","dashboard.app.nav.section.diagnostics":"诊断","dashboard.app.nav.drift-check":"漂移检查","dashboard.app.nav.modules.read-only":"只读仪表盘","dashboard.app.header.connected":"已连接","dashboard.app.header.connecting":"连接中","dashboard.app.live-region.received":"已收到 {type}","dashboard.app.breadcrumb.topology":"rule-topology","dashboard.app.breadcrumb.forensic":"cognitive-forensic","dashboard.app.breadcrumb.semantic":"semantic-timeline","dashboard.app.breadcrumb.ledger":"historical-ledger","dashboard.app.breadcrumb.rules":"rules-tree","dashboard.app.breadcrumb.locks":"human-lock","dashboard.app.breadcrumb.timeline":"intent-timeline","dashboard.app.breadcrumb.history":"history-replay","dashboard.app.breadcrumb.doctor":"doctor","dashboard.rule-topology.title":"规则命中","dashboard.rule-topology.subtitle":"查看当前路径会命中哪些规则,以及为什么会命中","dashboard.rule-topology.path.placeholder":"用于规则上下文的样本路径","dashboard.rule-topology.path.aria-label":"规则上下文样本路径","dashboard.rule-topology.status.sample":"当前路径 {path}","dashboard.rule-topology.status.hits":"{count} 条命中","dashboard.rule-topology.status.revision":"版本 {revision}","dashboard.rule-topology.heatmap.title":"覆盖热力图","dashboard.rule-topology.heatmap.subtitle":"基于 scope_glob 模式推导的目录覆盖情况","dashboard.rule-topology.heatmap.aria-label":"目录覆盖热力图","dashboard.rule-topology.heatmap.count":"{count} 个目录","dashboard.rule-topology.heatmap.rules":"{count} 条规则","dashboard.rule-topology.heatmap.uncovered":"没有匹配作用域","dashboard.rule-topology.heatmap.empty":"当前没有可显示的规则目录。","dashboard.rule-topology.heatmap.density.full":"已覆盖","dashboard.rule-topology.heatmap.density.partial":"部分覆盖","dashboard.rule-topology.heatmap.density.none":"未覆盖","dashboard.rule-topology.hit-reason.title":"命中原因","dashboard.rule-topology.hit-reason.subtitle":"显示当前样本路径为何命中这些规则","dashboard.rule-topology.hit-reason.aria-label":"规则命中原因","dashboard.rule-topology.hit-reason.count":"{count} 条原因","dashboard.rule-topology.hit-reason.empty":"当前样本路径没有加载到规则。","dashboard.rule-topology.hit-reason.global":"全局","dashboard.rule-topology.hit-reason.tier.always":"常驻","dashboard.rule-topology.hit-reason.tier.path":"Glob","dashboard.rule-topology.hit-reason.tier.description":"描述","dashboard.module-placeholder.coming-soon":"功能预留","dashboard.module-placeholder.read-only":"为后续只读仪表盘能力预留。","dashboard.module-placeholder.forensic.title":"认知扫描","dashboard.module-placeholder.forensic.subtitle":"后续补充","dashboard.module-placeholder.semantic.title":"语义时间线","dashboard.module-placeholder.semantic.subtitle":"后续补充","dashboard.module-placeholder.ledger.title":"历史记录","dashboard.module-placeholder.ledger.subtitle":"后续补充","dashboard.rules-tree.title":"规则树","dashboard.rules-tree.subtitle":"查看 .fabric/agents.meta.json 中的规则结构、层级和同步状态","dashboard.rules-tree.filter.placeholder":"按文件、作用域、优先级、哈希过滤...","dashboard.rules-tree.filter.aria-label":"过滤规则树","dashboard.rules-tree.status.loading":"规则加载中","dashboard.rules-tree.status.nodes":"{count} 个节点 · 版本 {revision}","dashboard.rules-tree.status.locks":"{count} 个受保护区域","dashboard.rules-tree.empty":"没有匹配的规则。","dashboard.rules-tree.tree.aria-label":"Fabric 规则树","dashboard.rules-tree.detail.title":"节点详情","dashboard.rules-tree.detail.empty":"选择一个规则节点以查看作用域、依赖、优先级和哈希。","dashboard.rules-tree.detail.file":"文件","dashboard.rules-tree.detail.scope":"作用域","dashboard.rules-tree.detail.priority":"优先级","dashboard.rules-tree.detail.hash":"哈希","dashboard.rules-tree.detail.no-deps":"无依赖","dashboard.human-lock.title":"人工保护","dashboard.human-lock.subtitle":"查看需要人工确认的受保护区域","dashboard.human-lock.filters.aria-label":"人工保护过滤器","dashboard.human-lock.filters.all":"全部","dashboard.human-lock.filters.drift":"漂移","dashboard.human-lock.filters.approved":"已批准","dashboard.human-lock.summary":"{drift} 处漂移 · {approved} 项已确认","dashboard.human-lock.empty":"当前过滤条件下没有受保护记录。","dashboard.intent-timeline.title":"意图时间线","dashboard.intent-timeline.subtitle":"查看 AI 与人工留下的变更记录,按时间倒序排列","dashboard.intent-timeline.filter.label":"来源","dashboard.intent-timeline.filter.all":"全部","dashboard.intent-timeline.summary":"AI {aiCount} · Human {humanCount}","dashboard.intent-timeline.columns.ai.title":"AI","dashboard.intent-timeline.columns.ai.entries":"{count} 条记录","dashboard.intent-timeline.columns.human.title":"人工","dashboard.intent-timeline.columns.human.entries":"{count} 条记录","dashboard.intent-timeline.empty":"没有找到日志记录。","dashboard.intent-timeline.annotate.missing-id":"缺少 id,无法为这条日志添加注释。","dashboard.history-replay.title":"历史回放","dashboard.history-replay.subtitle":"按历史记录回看当时的规则树状态","dashboard.history-replay.toolbar.scrub":"拖动","dashboard.history-replay.toolbar.latest":"最新","dashboard.history-replay.selected.none":"尚未选择历史记录","dashboard.history-replay.status.replay-points":"{count} 个回放点","dashboard.history-replay.status.entries-applied":"已应用 {count} 条记录","dashboard.history-replay.empty.entries":"没有可用于回放的日志记录。","dashboard.history-replay.state.title":"查看 {label} 时刻的状态","dashboard.history-replay.state.meta":"记录 {ledgerId} · 提交 {commit} · {mode}","dashboard.history-replay.status.loading":"快照加载中","dashboard.history-replay.status.nodes":"{count} 个节点","dashboard.history-replay.status.unknown-revision":"未知版本","dashboard.history-replay.tree.aria-label":"历史 Fabric 规则树","dashboard.history-replay.empty.loading":"正在加载历史快照...","dashboard.history-replay.empty.select":"请选择一条时间线记录以回放其状态。","dashboard.history-replay.meta.not-available":"不可用","dashboard.history-replay.meta.pending":"等待中","dashboard.history-replay.meta.na":"无","dashboard.doctor.title":"诊断控制台","dashboard.doctor.subtitle":"查看框架、入口点、版本漂移和受保护路径的状态","dashboard.doctor.toolbar.overall":"整体状态","dashboard.doctor.toolbar.no-summary":"暂无摘要","dashboard.doctor.toolbar.entry-points-summary":"{framework} · {count} 个入口点","dashboard.doctor.toolbar.entry-point-summary":"{framework} · {count} 个入口点","dashboard.doctor.empty.loading":"正在加载 doctor 报告...","dashboard.doctor.summary.framework":"框架","dashboard.doctor.summary.protected-paths":"受保护路径","dashboard.doctor.summary.intent-ledger":"意图日志","dashboard.doctor.summary.no-meta-revision":"暂无元数据版本","dashboard.doctor.summary.tracked-paths.none":"没有跟踪路径","dashboard.doctor.summary.tracked-paths.some":"已跟踪 {count} 项","dashboard.doctor.summary.hashes-intact":"所有已批准哈希均完好","dashboard.doctor.summary.drifted":"{count} 项发生漂移","dashboard.doctor.summary.no-ledger-entries":"暂无日志记录","dashboard.doctor.card.entry-points":"入口点","dashboard.doctor.card.checks":"检查项","dashboard.doctor.empty.entry-points":"当前未检测到入口点。","dashboard.doctor.framework.unknown":"未知","dashboard.doctor.age.none":"暂无记录","dashboard.doctor.age.seconds":"{count} 秒前","dashboard.doctor.age.minutes":"{count} 分钟前","dashboard.doctor.age.hours":"{count} 小时前","dashboard.doctor.age.days":"{count} 天前","dashboard.doctor.age.weeks":"{count} 周前","dashboard.shared.refresh":"刷新","dashboard.shared.loading":"加载中","dashboard.shared.status.ok":"正常","dashboard.shared.status.warn":"警告","dashboard.shared.status.error":"错误","dashboard.shared.status.confirmed":"已确认","dashboard.shared.status.hash-drift":"哈希漂移","dashboard.shared.status.stale":"过期","dashboard.shared.status.orphan":"孤立","dashboard.shared.status.attention":"注意","dashboard.source.ai":"AI","dashboard.source.human":"人工","dashboard.timeline-entry.aria-label":"{source} 意图 {intent}","dashboard.timeline-entry.working-tree":"工作区","dashboard.timeline-entry.parent":"父提交 {parent}","dashboard.timeline-entry.paths":"路径","dashboard.timeline-entry.annotate":"添加注释","dashboard.timeline-entry.annotation-label":"人工注释","dashboard.timeline-entry.annotation-placeholder":"说明审核结论或批准背景...","dashboard.timeline-entry.annotation-save":"保存注释","dashboard.tree-node.locked":"已锁定","dashboard.tree-node.stale.hash-mismatch":"哈希不匹配","dashboard.tree-node.stale.orphan":"孤立","dashboard.lock-card.aria-label":"{file} {lineRange} {status}","dashboard.lock-card.status.drift":"哈希漂移","dashboard.lock-card.status.confirmed":"已确认","dashboard.lock-card.hash.locked":"锁定哈希","dashboard.lock-card.hash.current":"当前哈希","dashboard.lock-card.hash.diff":"差异","dashboard.lock-card.preview.drift":"漂移","dashboard.lock-card.preview.sync":"同步","dashboard.lock-card.preview.drift-detail":"哈希与受保护区域不一致。","dashboard.lock-card.preview.sync-detail":"受保护区域当前保持同步。","dashboard.lock-card.footer.region":"受保护区域 · {count} 行","dashboard.lock-card.button.approve":"批准新哈希","dashboard.lock-card.button.confirmed":"已确认","dashboard.lock-card.diff.hash-mismatch":"哈希不一致","dashboard.lock-card.diff.no-changes":"无变更","dashboard.lock-card.diff.with-bytes":"+{added} / -{removed} · {bytes} 字节","dashboard.lock-card.diff.without-bytes":"+{added} / -{removed}","dashboard.approve-button.retry":"重试"},Wr={en:Vr,"zh-CN":Br};function qr(t,e=Wr){const a=e[t]??e.en,r=e.en;return(i,n)=>{const o=a[i]??r[i]??i;return n===void 0?o:Object.entries(n).reduce((l,[c,d])=>l.replaceAll(`{${c}}`,d),o)}}function Xr(t){if(typeof t!="string")return"en";const e=t.trim().toLowerCase().replace(/\..*$/,"").replace(/_/g,"-");return e.length===0?"en":e==="zh"||e.startsWith("zh-")?"zh-CN":"en"}function Yr(){return typeof navigator<"u"&&typeof navigator.language=="string"?Xr(navigator.language):"en"}function Gr(t=Yr()){return{locale:t,t:qr(t)}}const Ya=_r(null);function Jr({children:t}){const e=Y(()=>Gr(),[]);return s(Ya.Provider,{value:e,children:t})}function D(){const t=xr(Ya);if(t===null)throw new Error("useI18n must be used within an I18nProvider.");return t}function Ga({variant:t,state:e="idle",size:a="md",onClick:r,children:i,ariaLabel:n}){const{t:o}=D(),[l,c]=R(e),d=e==="idle"?l:e,h=d==="busy",u=async()=>{if(!h){c("busy");try{await r(),c("success"),window.setTimeout(()=>c("idle"),900)}catch{c("error"),window.setTimeout(()=>c("idle"),1400)}}};return s("button",{type:"button",className:`action-button action-${t} action-${a} action-${d}`,"aria-label":n,"aria-busy":h,"aria-disabled":h,onClick:u,children:[h?s("span",{className:"spinner","aria-hidden":"true"}):null,d==="success"?s("span",{"aria-hidden":"true",children:"✓"}):null,d==="error"?o("dashboard.approve-button.retry"):i]})}function Kr({nodes:t}){const{t:e}=D(),a=Qr(t);return s("section",{className:"topology-card",children:[s("div",{className:"topology-card-head",children:[s("div",{children:[s("h3",{children:e("dashboard.rule-topology.heatmap.title")}),s("p",{className:"muted",children:e("dashboard.rule-topology.heatmap.subtitle")})]}),s("span",{className:"badge badge-level",children:e("dashboard.rule-topology.heatmap.count",{count:String(a.length)})})]}),a.length===0?s("div",{className:"empty-card",children:e("dashboard.rule-topology.heatmap.empty")}):s("div",{className:"coverage-grid",role:"list","aria-label":e("dashboard.rule-topology.heatmap.aria-label"),children:a.map(r=>s("article",{className:`coverage-row coverage-${r.density}`,role:"listitem",children:[s("div",{className:"coverage-row-main",children:[s("span",{className:"coverage-path",children:r.path}),s("span",{className:`badge coverage-chip coverage-chip-${r.density}`,children:e(`dashboard.rule-topology.heatmap.density.${r.density}`)})]}),s("div",{className:"coverage-row-meta",children:[s("span",{children:e("dashboard.rule-topology.heatmap.rules",{count:String(r.directRuleCount)})}),s("span",{children:r.matchingGlobs.slice(0,2).join(" · ")||e("dashboard.rule-topology.heatmap.uncovered")})]})]},r.path))})]})}function Qr(t){return ei(t).map(r=>{const i=t.filter(o=>ai(r,qe(o.scope_glob))),n=i.some(o=>ti(r,qe(o.scope_glob)));return{path:r,density:n?"full":i.length>0?"partial":"none",matchingGlobs:i.map(o=>o.scope_glob),directRuleCount:i.length}}).sort((r,i)=>r.path.localeCompare(i.path))}function ei(t){const e=new Set;for(const a of t){for(const i of la(a.file))e.add(i);const r=Ut(a.scope_glob);if(r.length>0)for(const i of la(r))e.add(i)}return Array.from(e)}function la(t){const a=qe(t).split("/").filter(Boolean);if(a.length===0)return[];const i=(a.at(-1)??"").includes(".")?a.length-1:a.length,n=[];for(let o=1;o<=i;o+=1)n.push(a.slice(0,o).join("/"));return n}function Ut(t){const e=qe(t).split("/").filter(Boolean),a=[];for(const r of e){if(r==="**"||/[*?[\]{}()!]/.test(r))break;a.push(r)}return a.join("/")}function ti(t,e){const a=Ut(e);return a.length===0?!1:a===t&&(e===t||e.startsWith(`${t}/**`)||e.startsWith(`${t}/*`))}function ai(t,e){const a=Ut(e);return a.length===0?!0:a===t||a.startsWith(`${t}/`)||t.startsWith(`${a}/`)}function qe(t){return t.replaceAll("\\","/").replace(/^\.?\//,"").replace(/\/+$/,"")}const ri={ok:"dashboard.shared.status.confirmed",drift:"dashboard.shared.status.hash-drift",stale:"dashboard.shared.status.stale",orphan:"dashboard.shared.status.orphan",locked:"dashboard.shared.status.attention"};function te({kind:t,severity:e,message:a,diffStats:r}){const{t:i}=D();if(e==="ok"&&t==="dot")return null;const n=a??i(ri[e]),o=r===void 0?"":` +${r.added} / -${r.removed}`,l=`drift-indicator drift-${t} drift-${e}`;return t==="dot"?s("span",{className:l,"aria-label":n}):t==="banner"?s("div",{className:l,role:"status",children:[s("span",{"aria-hidden":"true",children:"!"}),s("span",{children:[n,o]})]}):s("span",{className:l,children:[s("span",{"aria-hidden":"true",children:e==="ok"?"✓":"!"}),s("span",{children:[n,o]})]})}function ii({meta:t,rulesContext:e}){const{t:a}=D(),r=ni(t,e);return s("section",{className:"topology-card",children:[s("div",{className:"topology-card-head",children:[s("div",{children:[s("h3",{children:a("dashboard.rule-topology.hit-reason.title")}),s("p",{className:"muted",children:a("dashboard.rule-topology.hit-reason.subtitle")})]}),s("span",{className:"badge badge-level",children:a("dashboard.rule-topology.hit-reason.count",{count:String(r.length)})})]}),r.length===0?s("div",{className:"empty-card",children:a("dashboard.rule-topology.hit-reason.empty")}):s("div",{className:"reason-list",role:"list","aria-label":a("dashboard.rule-topology.hit-reason.aria-label"),children:r.map(i=>s("article",{className:"reason-card",role:"listitem",children:[s("div",{className:"reason-card-head",children:[s("strong",{children:i.file}),s("span",{className:`badge reason-tier reason-tier-${i.tier}`,children:a(`dashboard.rule-topology.hit-reason.tier.${i.tier}`)})]}),s("div",{className:"reason-card-meta",children:[s("span",{children:i.layer}),s("span",{children:i.tier==="always"?a("dashboard.rule-topology.hit-reason.global"):i.scope})]}),i.description!==null&&i.description.length>0?s("p",{className:"reason-description",children:i.description}):null]},`${i.layer}:${i.file}:${i.tier}`))})]})}function ni(t,e){if(t===null||e===null)return[];const a=new Map(Object.values(t.nodes).map(n=>[n.file,n])),r=[],i=new Set;for(const n of e.L1)da(r,i,a,n.path,"L1");for(const n of e.L2)da(r,i,a,n.path,"L2");for(const n of e.description_stubs??[]){const o=`description:${n.path}`;if(i.has(o))continue;const l=a.get(n.path);r.push({file:n.path,layer:"description",tier:"description",scope:l?.scope_glob??"",description:n.description}),i.add(o)}return r.sort((n,o)=>n.file.localeCompare(o.file))}function da(t,e,a,r,i){const n=`${i}:${r}`;if(e.has(n))return;const o=a.get(r),l=o?.activation?.tier??"path";t.push({file:r,layer:i,tier:l,scope:o?.scope_glob??"",description:l==="description"?o?.activation?.description??null:null}),e.add(n)}function si({entry:t,currentHash:e,diffStats:a,diffPreview:r=[],onApprove:i,busy:n=!1}){const{t:o}=D(),l=e!==void 0&&e!==t.hash,c=l?"drift":"ok",d=o(l?"dashboard.lock-card.status.drift":"dashboard.lock-card.status.confirmed"),h=`L${t.start_line}-L${t.end_line}`;return s("article",{className:`lock-card lock-${c} ${n?"is-busy":""}`,"aria-label":o("dashboard.lock-card.aria-label",{file:t.file,lineRange:h,status:d}),children:[s("header",{className:"lock-head",children:[s("div",{className:"lock-icon","aria-hidden":"true",children:l?"!":"✓"}),s("div",{className:"lock-title",children:[s("strong",{children:t.file}),s("span",{children:h})]}),s(te,{kind:"pill",severity:l?"drift":"ok",message:d})]}),s("div",{className:"lock-body",children:[s("div",{className:"hash-block",children:[s(mt,{label:o("dashboard.lock-card.hash.locked"),value:t.hash,stale:l}),s(mt,{label:o("dashboard.lock-card.hash.current"),value:e??o("dashboard.history-replay.meta.not-available")}),s(mt,{label:o("dashboard.lock-card.hash.diff"),value:oi(a,l,o),accent:l})]}),s("div",{className:"preview",children:[s("div",{className:"preview-head",children:[s("span",{children:[t.file," · ",h]}),s("span",{children:o(l?"dashboard.lock-card.preview.drift":"dashboard.lock-card.preview.sync")})]}),s("pre",{className:"preview-body",children:r.length>0?r.map(u=>s("span",{className:`line-${u.kind}`,children:[s("span",{className:"line-num",children:u.line}),u.text,`
|
|
11
11
|
`]},`${u.kind}:${u.line}:${u.text}`)):`${t.file}
|
|
12
12
|
${h}
|
|
13
|
-
${o(l?"dashboard.lock-card.preview.drift-detail":"dashboard.lock-card.preview.sync-detail")}`})]})]}),s("footer",{className:"lock-foot",children:[s("span",{className:"meta-line",children:o("dashboard.lock-card.footer.region",{count:String(t.end_line-t.start_line+1)})}),l&&e!==void 0&&i!==void 0?s(Ya,{variant:"approve",state:n?"busy":"idle",ariaLabel:o("dashboard.lock-card.button.approve"),onClick:()=>i(t),children:o("dashboard.lock-card.button.approve")}):s("button",{className:"action-button action-approve action-success",type:"button","aria-disabled":"true",children:["✓ ",o("dashboard.lock-card.button.confirmed")]})]})]})}function mt({label:t,value:e,stale:a=!1,accent:r=!1}){return s("div",{className:"hash-row",children:[s("span",{className:"hash-key",children:t}),s("span",{className:`hash-value ${a?"is-stale":""} ${r?"is-accent":""}`,children:e})]})}function ni(t,e,a){return t===void 0?a(e?"dashboard.lock-card.diff.hash-mismatch":"dashboard.lock-card.diff.no-changes"):t.bytes!==void 0?a("dashboard.lock-card.diff.with-bytes",{added:String(t.added),removed:String(t.removed),bytes:String(t.bytes)}):a("dashboard.lock-card.diff.without-bytes",{added:String(t.added),removed:String(t.removed)})}function Nt({source:t,size:e="sm",variant:a="filled",interactive:r=!1,selected:i=!1,onClick:n}){const{t:o}=D(),l=["source-badge",`source-badge-${t}`,`source-badge-${e}`,`source-badge-${a}`,i?"is-selected":""].filter(Boolean).join(" "),c=o(`dashboard.source.${t}`);return r?s("button",{className:l,type:"button","aria-pressed":i,onClick:n,children:[s("span",{className:"source-badge-dot","aria-hidden":"true"}),c]}):s("span",{className:l,children:[s("span",{className:"source-badge-dot","aria-hidden":"true"}),c]})}function Ja({entry:t,onAnnotate:e,expanded:a=!1,readOnly:r=!1}){const{locale:i,t:n}=D(),[o,l]=R(a),[c,d]=R(""),h=t.source==="ai",u=!r&&h&&e!==void 0&&t.id!==void 0,g=async()=>{const p=c.trim();!h||e===void 0||p.length===0||(await e(t,p),d(""),l(!1))};return s("article",{className:`timeline-entry timeline-${t.source}`,"aria-label":n("dashboard.timeline-entry.aria-label",{source:n(`dashboard.source.${t.source}`),intent:t.intent}),children:[s("div",{className:`dot-axis ${t.source}`,"aria-hidden":"true"}),s("div",{className:"timeline-head",children:[s(Nt,{source:t.source}),h?s("span",{className:"commit-hash",children:t.commit_sha??n("dashboard.timeline-entry.working-tree")}):null,h?null:s("span",{className:"commit-hash",children:n("dashboard.timeline-entry.parent",{parent:t.parent_sha})}),h?null:s("span",{className:"diff-badge",children:t.diff_stat}),s("time",{className:"entry-time",dateTime:new Date(t.ts).toISOString(),children:si(t.ts,i)})]}),s("h3",{className:"entry-title",children:t.intent}),s("div",{className:"entry-meta",children:[s("span",{children:[s("span",{className:"meta-key",children:n("dashboard.timeline-entry.paths")})," ",t.affected_paths.length]}),t.affected_paths.slice(0,3).map(p=>s("span",{children:p},p))]}),!h&&t.annotation!==void 0?s("div",{className:"entry-body",children:t.annotation}):null,h&&u?s("div",{className:"entry-foot",children:s("button",{className:"ghost-button",type:"button",onClick:()=>l(p=>!p),children:n("dashboard.timeline-entry.annotate")})}):null,o&&h?s("form",{className:"annotate-form",onSubmit:p=>{p.preventDefault(),g()},children:[s("label",{htmlFor:`annotate-${t.id??t.ts}`,children:n("dashboard.timeline-entry.annotation-label")}),s("input",{id:`annotate-${t.id??t.ts}`,className:"annotate-input",value:c,onInput:p=>d(p.currentTarget.value),placeholder:n("dashboard.timeline-entry.annotation-placeholder")}),s(Ya,{variant:"annotate",size:"sm",onClick:g,children:n("dashboard.timeline-entry.annotation-save")})]}):null]})}function si(t,e){return new Intl.DateTimeFormat(e,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date(t))}function Ht({node:t,level:e,selected:a=!1,onSelect:r,humanLockedNearby:i=!1,staleReason:n=null,defaultExpanded:o=!1,readOnly:l=!1,children:c=[]}){const{t:d}=D(),[h,u]=R(o),g=c.length>0,p=t.file,y=n===null?"ok":n==="orphan"?"orphan":"stale",C=()=>{l||(g&&u(x=>!x),r?.(p))},w=x=>{l||((x.key==="Enter"||x.key===" ")&&(x.preventDefault(),C()),x.key==="ArrowRight"&&g&&u(!0),x.key==="ArrowLeft"&&g&&u(!1))};return s("div",{className:`tree-node-group tree-level-${e}`,children:[s("div",{className:["tree-node",a?"is-selected":"",h?"is-expanded":"",i?"is-locked":"",n!==null?"is-stale":"",l?"is-readonly":""].filter(Boolean).join(" "),role:"treeitem","aria-expanded":g?h:void 0,"aria-level":e+1,"aria-readonly":l||void 0,tabIndex:l?-1:0,onClick:l?void 0:C,onKeyDown:l?void 0:w,children:[s("span",{className:"tree-caret","aria-hidden":"true",children:g?"›":"·"}),s("span",{className:"tree-icon","aria-hidden":"true",children:e===0?"F":e===1?"D":"R"}),s("span",{className:"tree-label",children:p}),i?s("span",{className:"badge badge-locked",children:d("dashboard.tree-node.locked")}):null,n!==null?s(te,{kind:"pill",severity:y,message:d(`dashboard.tree-node.stale.${n}`)}):null,s("span",{className:"tree-meta",children:[s("span",{className:"badge badge-level",children:["L",e]}),s("span",{className:"tree-hash",children:oi(t.hash)})]})]}),g&&h?s("div",{className:"tree-children",role:"group",children:c.map(x=>s(Ht,{...x,onSelect:r,readOnly:l},`${x.node.file}:${x.level}`))}):null]})}function oi(t){return t.length>18?`${t.slice(0,12)}…`:t}var I;(function(t){t.assertEqual=i=>{};function e(i){}t.assertIs=e;function a(i){throw new Error}t.assertNever=a,t.arrayToEnum=i=>{const n={};for(const o of i)n[o]=o;return n},t.getValidEnumValues=i=>{const n=t.objectKeys(i).filter(l=>typeof i[i[l]]!="number"),o={};for(const l of n)o[l]=i[l];return t.objectValues(o)},t.objectValues=i=>t.objectKeys(i).map(function(n){return i[n]}),t.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const n=[];for(const o in i)Object.prototype.hasOwnProperty.call(i,o)&&n.push(o);return n},t.find=(i,n)=>{for(const o of i)if(n(o))return o},t.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&Number.isFinite(i)&&Math.floor(i)===i;function r(i,n=" | "){return i.map(o=>typeof o=="string"?`'${o}'`:o).join(n)}t.joinValues=r,t.jsonStringifyReplacer=(i,n)=>typeof n=="bigint"?n.toString():n})(I||(I={}));var da;(function(t){t.mergeShapes=(e,a)=>({...e,...a})})(da||(da={}));const v=I.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),se=t=>{switch(typeof t){case"undefined":return v.undefined;case"string":return v.string;case"number":return Number.isNaN(t)?v.nan:v.number;case"boolean":return v.boolean;case"function":return v.function;case"bigint":return v.bigint;case"symbol":return v.symbol;case"object":return Array.isArray(t)?v.array:t===null?v.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?v.promise:typeof Map<"u"&&t instanceof Map?v.map:typeof Set<"u"&&t instanceof Set?v.set:typeof Date<"u"&&t instanceof Date?v.date:v.object;default:return v.unknown}},m=I.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class ae extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const a=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,a):this.__proto__=a,this.name="ZodError",this.issues=e}format(e){const a=e||function(n){return n.message},r={_errors:[]},i=n=>{for(const o of n.issues)if(o.code==="invalid_union")o.unionErrors.map(i);else if(o.code==="invalid_return_type")i(o.returnTypeError);else if(o.code==="invalid_arguments")i(o.argumentsError);else if(o.path.length===0)r._errors.push(a(o));else{let l=r,c=0;for(;c<o.path.length;){const d=o.path[c];c===o.path.length-1?(l[d]=l[d]||{_errors:[]},l[d]._errors.push(a(o))):l[d]=l[d]||{_errors:[]},l=l[d],c++}}};return i(this),r}static assert(e){if(!(e instanceof ae))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,I.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=a=>a.message){const a={},r=[];for(const i of this.issues)if(i.path.length>0){const n=i.path[0];a[n]=a[n]||[],a[n].push(e(i))}else r.push(e(i));return{formErrors:r,fieldErrors:a}}get formErrors(){return this.flatten()}}ae.create=t=>new ae(t);const St=(t,e)=>{let a;switch(t.code){case m.invalid_type:t.received===v.undefined?a="Required":a=`Expected ${t.expected}, received ${t.received}`;break;case m.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(t.expected,I.jsonStringifyReplacer)}`;break;case m.unrecognized_keys:a=`Unrecognized key(s) in object: ${I.joinValues(t.keys,", ")}`;break;case m.invalid_union:a="Invalid input";break;case m.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${I.joinValues(t.options)}`;break;case m.invalid_enum_value:a=`Invalid enum value. Expected ${I.joinValues(t.options)}, received '${t.received}'`;break;case m.invalid_arguments:a="Invalid function arguments";break;case m.invalid_return_type:a="Invalid function return type";break;case m.invalid_date:a="Invalid date";break;case m.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(a=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(a=`${a} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?a=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?a=`Invalid input: must end with "${t.validation.endsWith}"`:I.assertNever(t.validation):t.validation!=="regex"?a=`Invalid ${t.validation}`:a="Invalid";break;case m.too_small:t.type==="array"?a=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?a=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?a=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?a=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?a=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:a="Invalid input";break;case m.too_big:t.type==="array"?a=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?a=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?a=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?a=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?a=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:a="Invalid input";break;case m.custom:a="Invalid input";break;case m.invalid_intersection_types:a="Intersection results could not be merged";break;case m.not_multiple_of:a=`Number must be a multiple of ${t.multipleOf}`;break;case m.not_finite:a="Number must be finite";break;default:a=e.defaultError,I.assertNever(t)}return{message:a}};let li=St;function di(){return li}const ci=t=>{const{data:e,path:a,errorMaps:r,issueData:i}=t,n=[...a,...i.path||[]],o={...i,path:n};if(i.message!==void 0)return{...i,path:n,message:i.message};let l="";const c=r.filter(d=>!!d).slice().reverse();for(const d of c)l=d(o,{data:e,defaultError:l}).message;return{...i,path:n,message:l}};function b(t,e){const a=di(),r=ci({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,a,a===St?void 0:St].filter(i=>!!i)});t.common.issues.push(r)}class z{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,a){const r=[];for(const i of a){if(i.status==="aborted")return N;i.status==="dirty"&&e.dirty(),r.push(i.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,a){const r=[];for(const i of a){const n=await i.key,o=await i.value;r.push({key:n,value:o})}return z.mergeObjectSync(e,r)}static mergeObjectSync(e,a){const r={};for(const i of a){const{key:n,value:o}=i;if(n.status==="aborted"||o.status==="aborted")return N;n.status==="dirty"&&e.dirty(),o.status==="dirty"&&e.dirty(),n.value!=="__proto__"&&(typeof o.value<"u"||i.alwaysSet)&&(r[n.value]=o.value)}return{status:e.value,value:r}}}const N=Object.freeze({status:"aborted"}),Se=t=>({status:"dirty",value:t}),W=t=>({status:"valid",value:t}),ca=t=>t.status==="aborted",ua=t=>t.status==="dirty",ye=t=>t.status==="valid",Xe=t=>typeof Promise<"u"&&t instanceof Promise;var k;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(k||(k={}));class J{constructor(e,a,r,i){this._cachedPath=[],this.parent=e,this.data=a,this._path=r,this._key=i}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const ha=(t,e)=>{if(ye(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const a=new ae(t.common.issues);return this._error=a,this._error}}};function T(t){if(!t)return{};const{errorMap:e,invalid_type_error:a,required_error:r,description:i}=t;if(e&&(a||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:i}:{errorMap:(o,l)=>{const{message:c}=t;return o.code==="invalid_enum_value"?{message:c??l.defaultError}:typeof l.data>"u"?{message:c??r??l.defaultError}:o.code!=="invalid_type"?{message:l.defaultError}:{message:c??a??l.defaultError}},description:i}}class E{get description(){return this._def.description}_getType(e){return se(e.data)}_getOrReturnCtx(e,a){return a||{common:e.parent.common,data:e.data,parsedType:se(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new z,ctx:{common:e.parent.common,data:e.data,parsedType:se(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const a=this._parse(e);if(Xe(a))throw new Error("Synchronous parse encountered promise.");return a}_parseAsync(e){const a=this._parse(e);return Promise.resolve(a)}parse(e,a){const r=this.safeParse(e,a);if(r.success)return r.data;throw r.error}safeParse(e,a){const r={common:{issues:[],async:a?.async??!1,contextualErrorMap:a?.errorMap},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)},i=this._parseSync({data:e,path:r.path,parent:r});return ha(r,i)}"~validate"(e){const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:a});return ye(r)?{value:r.value}:{issues:a.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),a.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:a}).then(r=>ye(r)?{value:r.value}:{issues:a.common.issues})}async parseAsync(e,a){const r=await this.safeParseAsync(e,a);if(r.success)return r.data;throw r.error}async safeParseAsync(e,a){const r={common:{issues:[],contextualErrorMap:a?.errorMap,async:!0},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)},i=this._parse({data:e,path:r.path,parent:r}),n=await(Xe(i)?i:Promise.resolve(i));return ha(r,n)}refine(e,a){const r=i=>typeof a=="string"||typeof a>"u"?{message:a}:typeof a=="function"?a(i):a;return this._refinement((i,n)=>{const o=e(i),l=()=>n.addIssue({code:m.custom,...r(i)});return typeof Promise<"u"&&o instanceof Promise?o.then(c=>c?!0:(l(),!1)):o?!0:(l(),!1)})}refinement(e,a){return this._refinement((r,i)=>e(r)?!0:(i.addIssue(typeof a=="function"?a(r,i):a),!1))}_refinement(e){return new le({schema:this,typeName:S.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:a=>this["~validate"](a)}}optional(){return ee.create(this,this._def)}nullable(){return pe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return X.create(this)}promise(){return et.create(this,this._def)}or(e){return Je.create([this,e],this._def)}and(e){return Ge.create(this,e,this._def)}transform(e){return new le({...T(this._def),schema:this,typeName:S.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const a=typeof e=="function"?e:()=>e;return new tt({...T(this._def),innerType:this,defaultValue:a,typeName:S.ZodDefault})}brand(){return new er({typeName:S.ZodBranded,type:this,...T(this._def)})}catch(e){const a=typeof e=="function"?e:()=>e;return new at({...T(this._def),innerType:this,catchValue:a,typeName:S.ZodCatch})}describe(e){const a=this.constructor;return new a({...this._def,description:e})}pipe(e){return Bt.create(this,e)}readonly(){return rt.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const ui=/^c[^\s-]{8,}$/i,hi=/^[0-9a-z]+$/,pi=/^[0-9A-HJKMNP-TV-Z]{26}$/i,mi=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,fi=/^[a-z0-9_-]{21}$/i,bi=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,gi=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,yi=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,vi="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let ft;const _i=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ki=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,wi=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,xi=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ni=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Si=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Ga="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Ci=new RegExp(`^${Ga}$`);function Ka(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);const a=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${a}`}function Ti(t){return new RegExp(`^${Ka(t)}$`)}function Ai(t){let e=`${Ga}T${Ka(t)}`;const a=[];return a.push(t.local?"Z?":"Z"),t.offset&&a.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${a.join("|")})`,new RegExp(`^${e}$`)}function Ei(t,e){return!!((e==="v4"||!e)&&_i.test(t)||(e==="v6"||!e)&&wi.test(t))}function Ii(t,e){if(!bi.test(t))return!1;try{const[a]=t.split(".");if(!a)return!1;const r=a.replace(/-/g,"+").replace(/_/g,"/").padEnd(a.length+(4-a.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||"typ"in i&&i?.typ!=="JWT"||!i.alg||e&&i.alg!==e)}catch{return!1}}function Ri(t,e){return!!((e==="v4"||!e)&&ki.test(t)||(e==="v6"||!e)&&xi.test(t))}class Q extends E{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==v.string){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.string,received:n.parsedType}),N}const r=new z;let i;for(const n of this._def.checks)if(n.kind==="min")e.data.length<n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="max")e.data.length>n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="length"){const o=e.data.length>n.value,l=e.data.length<n.value;(o||l)&&(i=this._getOrReturnCtx(e,i),o?b(i,{code:m.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}):l&&b(i,{code:m.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}),r.dirty())}else if(n.kind==="email")yi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"email",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="emoji")ft||(ft=new RegExp(vi,"u")),ft.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"emoji",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="uuid")mi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"uuid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="nanoid")fi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"nanoid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid")ui.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid2")hi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid2",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="ulid")pi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ulid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="url")try{new URL(e.data)}catch{i=this._getOrReturnCtx(e,i),b(i,{validation:"url",code:m.invalid_string,message:n.message}),r.dirty()}else n.kind==="regex"?(n.regex.lastIndex=0,n.regex.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"regex",code:m.invalid_string,message:n.message}),r.dirty())):n.kind==="trim"?e.data=e.data.trim():n.kind==="includes"?e.data.includes(n.value,n.position)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{includes:n.value,position:n.position},message:n.message}),r.dirty()):n.kind==="toLowerCase"?e.data=e.data.toLowerCase():n.kind==="toUpperCase"?e.data=e.data.toUpperCase():n.kind==="startsWith"?e.data.startsWith(n.value)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{startsWith:n.value},message:n.message}),r.dirty()):n.kind==="endsWith"?e.data.endsWith(n.value)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{endsWith:n.value},message:n.message}),r.dirty()):n.kind==="datetime"?Ai(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"datetime",message:n.message}),r.dirty()):n.kind==="date"?Ci.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"date",message:n.message}),r.dirty()):n.kind==="time"?Ti(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"time",message:n.message}),r.dirty()):n.kind==="duration"?gi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"duration",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="ip"?Ei(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ip",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="jwt"?Ii(e.data,n.alg)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"jwt",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="cidr"?Ri(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cidr",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="base64"?Ni.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="base64url"?Si.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64url",code:m.invalid_string,message:n.message}),r.dirty()):I.assertNever(n);return{status:r.value,value:e.data}}_regex(e,a,r){return this.refinement(i=>e.test(i),{validation:a,code:m.invalid_string,...k.errToObj(r)})}_addCheck(e){return new Q({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...k.errToObj(e)})}url(e){return this._addCheck({kind:"url",...k.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...k.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...k.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...k.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...k.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...k.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...k.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...k.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...k.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...k.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...k.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...k.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...k.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...k.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...k.errToObj(e)})}regex(e,a){return this._addCheck({kind:"regex",regex:e,...k.errToObj(a)})}includes(e,a){return this._addCheck({kind:"includes",value:e,position:a?.position,...k.errToObj(a?.message)})}startsWith(e,a){return this._addCheck({kind:"startsWith",value:e,...k.errToObj(a)})}endsWith(e,a){return this._addCheck({kind:"endsWith",value:e,...k.errToObj(a)})}min(e,a){return this._addCheck({kind:"min",value:e,...k.errToObj(a)})}max(e,a){return this._addCheck({kind:"max",value:e,...k.errToObj(a)})}length(e,a){return this._addCheck({kind:"length",value:e,...k.errToObj(a)})}nonempty(e){return this.min(1,k.errToObj(e))}trim(){return new Q({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Q({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Q({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxLength(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}}Q.create=t=>new Q({checks:[],typeName:S.ZodString,coerce:t?.coerce??!1,...T(t)});function $i(t,e){const a=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,i=a>r?a:r,n=Number.parseInt(t.toFixed(i).replace(".","")),o=Number.parseInt(e.toFixed(i).replace(".",""));return n%o/10**i}class ve extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==v.number){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.number,received:n.parsedType}),N}let r;const i=new z;for(const n of this._def.checks)n.kind==="int"?I.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:m.invalid_type,expected:"integer",received:"float",message:n.message}),i.dirty()):n.kind==="min"?(n.inclusive?e.data<n.value:e.data<=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_small,minimum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="max"?(n.inclusive?e.data>n.value:e.data>=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_big,maximum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="multipleOf"?$i(e.data,n.value)!==0&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_multiple_of,multipleOf:n.value,message:n.message}),i.dirty()):n.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_finite,message:n.message}),i.dirty()):I.assertNever(n);return{status:i.value,value:e.data}}gte(e,a){return this.setLimit("min",e,!0,k.toString(a))}gt(e,a){return this.setLimit("min",e,!1,k.toString(a))}lte(e,a){return this.setLimit("max",e,!0,k.toString(a))}lt(e,a){return this.setLimit("max",e,!1,k.toString(a))}setLimit(e,a,r,i){return new ve({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new ve({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:k.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:k.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:k.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:k.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:k.toString(e)})}multipleOf(e,a){return this._addCheck({kind:"multipleOf",value:e,message:k.toString(a)})}finite(e){return this._addCheck({kind:"finite",message:k.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:k.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:k.toString(e)})}get minValue(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxValue(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&I.isInteger(e.value))}get isFinite(){let e=null,a=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(a===null||r.value>a)&&(a=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value)}return Number.isFinite(a)&&Number.isFinite(e)}}ve.create=t=>new ve({checks:[],typeName:S.ZodNumber,coerce:t?.coerce||!1,...T(t)});class Ae extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==v.bigint)return this._getInvalidInput(e);let r;const i=new z;for(const n of this._def.checks)n.kind==="min"?(n.inclusive?e.data<n.value:e.data<=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_small,type:"bigint",minimum:n.value,inclusive:n.inclusive,message:n.message}),i.dirty()):n.kind==="max"?(n.inclusive?e.data>n.value:e.data>=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_big,type:"bigint",maximum:n.value,inclusive:n.inclusive,message:n.message}),i.dirty()):n.kind==="multipleOf"?e.data%n.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_multiple_of,multipleOf:n.value,message:n.message}),i.dirty()):I.assertNever(n);return{status:i.value,value:e.data}}_getInvalidInput(e){const a=this._getOrReturnCtx(e);return b(a,{code:m.invalid_type,expected:v.bigint,received:a.parsedType}),N}gte(e,a){return this.setLimit("min",e,!0,k.toString(a))}gt(e,a){return this.setLimit("min",e,!1,k.toString(a))}lte(e,a){return this.setLimit("max",e,!0,k.toString(a))}lt(e,a){return this.setLimit("max",e,!1,k.toString(a))}setLimit(e,a,r,i){return new Ae({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new Ae({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:k.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:k.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:k.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:k.toString(e)})}multipleOf(e,a){return this._addCheck({kind:"multipleOf",value:e,message:k.toString(a)})}get minValue(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxValue(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}}Ae.create=t=>new Ae({checks:[],typeName:S.ZodBigInt,coerce:t?.coerce??!1,...T(t)});class Ct extends E{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==v.boolean){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.boolean,received:r.parsedType}),N}return W(e.data)}}Ct.create=t=>new Ct({typeName:S.ZodBoolean,coerce:t?.coerce||!1,...T(t)});class Ye extends E{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==v.date){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.date,received:n.parsedType}),N}if(Number.isNaN(e.data.getTime())){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_date}),N}const r=new z;let i;for(const n of this._def.checks)n.kind==="min"?e.data.getTime()<n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_small,message:n.message,inclusive:!0,exact:!1,minimum:n.value,type:"date"}),r.dirty()):n.kind==="max"?e.data.getTime()>n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_big,message:n.message,inclusive:!0,exact:!1,maximum:n.value,type:"date"}),r.dirty()):I.assertNever(n);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new Ye({...this._def,checks:[...this._def.checks,e]})}min(e,a){return this._addCheck({kind:"min",value:e.getTime(),message:k.toString(a)})}max(e,a){return this._addCheck({kind:"max",value:e.getTime(),message:k.toString(a)})}get minDate(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e!=null?new Date(e):null}}Ye.create=t=>new Ye({checks:[],coerce:t?.coerce||!1,typeName:S.ZodDate,...T(t)});class pa extends E{_parse(e){if(this._getType(e)!==v.symbol){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.symbol,received:r.parsedType}),N}return W(e.data)}}pa.create=t=>new pa({typeName:S.ZodSymbol,...T(t)});class Tt extends E{_parse(e){if(this._getType(e)!==v.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.undefined,received:r.parsedType}),N}return W(e.data)}}Tt.create=t=>new Tt({typeName:S.ZodUndefined,...T(t)});class At extends E{_parse(e){if(this._getType(e)!==v.null){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.null,received:r.parsedType}),N}return W(e.data)}}At.create=t=>new At({typeName:S.ZodNull,...T(t)});class ma extends E{constructor(){super(...arguments),this._any=!0}_parse(e){return W(e.data)}}ma.create=t=>new ma({typeName:S.ZodAny,...T(t)});class fa extends E{constructor(){super(...arguments),this._unknown=!0}_parse(e){return W(e.data)}}fa.create=t=>new fa({typeName:S.ZodUnknown,...T(t)});class oe extends E{_parse(e){const a=this._getOrReturnCtx(e);return b(a,{code:m.invalid_type,expected:v.never,received:a.parsedType}),N}}oe.create=t=>new oe({typeName:S.ZodNever,...T(t)});class ba extends E{_parse(e){if(this._getType(e)!==v.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.void,received:r.parsedType}),N}return W(e.data)}}ba.create=t=>new ba({typeName:S.ZodVoid,...T(t)});class X extends E{_parse(e){const{ctx:a,status:r}=this._processInputParams(e),i=this._def;if(a.parsedType!==v.array)return b(a,{code:m.invalid_type,expected:v.array,received:a.parsedType}),N;if(i.exactLength!==null){const o=a.data.length>i.exactLength.value,l=a.data.length<i.exactLength.value;(o||l)&&(b(a,{code:o?m.too_big:m.too_small,minimum:l?i.exactLength.value:void 0,maximum:o?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),r.dirty())}if(i.minLength!==null&&a.data.length<i.minLength.value&&(b(a,{code:m.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),r.dirty()),i.maxLength!==null&&a.data.length>i.maxLength.value&&(b(a,{code:m.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),a.common.async)return Promise.all([...a.data].map((o,l)=>i.type._parseAsync(new J(a,o,a.path,l)))).then(o=>z.mergeArray(r,o));const n=[...a.data].map((o,l)=>i.type._parseSync(new J(a,o,a.path,l)));return z.mergeArray(r,n)}get element(){return this._def.type}min(e,a){return new X({...this._def,minLength:{value:e,message:k.toString(a)}})}max(e,a){return new X({...this._def,maxLength:{value:e,message:k.toString(a)}})}length(e,a){return new X({...this._def,exactLength:{value:e,message:k.toString(a)}})}nonempty(e){return this.min(1,e)}}X.create=(t,e)=>new X({type:t,minLength:null,maxLength:null,exactLength:null,typeName:S.ZodArray,...T(e)});function fe(t){if(t instanceof M){const e={};for(const a in t.shape){const r=t.shape[a];e[a]=ee.create(fe(r))}return new M({...t._def,shape:()=>e})}else return t instanceof X?new X({...t._def,type:fe(t.element)}):t instanceof ee?ee.create(fe(t.unwrap())):t instanceof pe?pe.create(fe(t.unwrap())):t instanceof ue?ue.create(t.items.map(e=>fe(e))):t}class M extends E{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),a=I.objectKeys(e);return this._cached={shape:e,keys:a},this._cached}_parse(e){if(this._getType(e)!==v.object){const d=this._getOrReturnCtx(e);return b(d,{code:m.invalid_type,expected:v.object,received:d.parsedType}),N}const{status:r,ctx:i}=this._processInputParams(e),{shape:n,keys:o}=this._getCached(),l=[];if(!(this._def.catchall instanceof oe&&this._def.unknownKeys==="strip"))for(const d in i.data)o.includes(d)||l.push(d);const c=[];for(const d of o){const h=n[d],u=i.data[d];c.push({key:{status:"valid",value:d},value:h._parse(new J(i,u,i.path,d)),alwaysSet:d in i.data})}if(this._def.catchall instanceof oe){const d=this._def.unknownKeys;if(d==="passthrough")for(const h of l)c.push({key:{status:"valid",value:h},value:{status:"valid",value:i.data[h]}});else if(d==="strict")l.length>0&&(b(i,{code:m.unrecognized_keys,keys:l}),r.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const d=this._def.catchall;for(const h of l){const u=i.data[h];c.push({key:{status:"valid",value:h},value:d._parse(new J(i,u,i.path,h)),alwaysSet:h in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const d=[];for(const h of c){const u=await h.key,g=await h.value;d.push({key:u,value:g,alwaysSet:h.alwaysSet})}return d}).then(d=>z.mergeObjectSync(r,d)):z.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return k.errToObj,new M({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(a,r)=>{const i=this._def.errorMap?.(a,r).message??r.defaultError;return a.code==="unrecognized_keys"?{message:k.errToObj(e).message??i}:{message:i}}}:{}})}strip(){return new M({...this._def,unknownKeys:"strip"})}passthrough(){return new M({...this._def,unknownKeys:"passthrough"})}extend(e){return new M({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new M({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:S.ZodObject})}setKey(e,a){return this.augment({[e]:a})}catchall(e){return new M({...this._def,catchall:e})}pick(e){const a={};for(const r of I.objectKeys(e))e[r]&&this.shape[r]&&(a[r]=this.shape[r]);return new M({...this._def,shape:()=>a})}omit(e){const a={};for(const r of I.objectKeys(this.shape))e[r]||(a[r]=this.shape[r]);return new M({...this._def,shape:()=>a})}deepPartial(){return fe(this)}partial(e){const a={};for(const r of I.objectKeys(this.shape)){const i=this.shape[r];e&&!e[r]?a[r]=i:a[r]=i.optional()}return new M({...this._def,shape:()=>a})}required(e){const a={};for(const r of I.objectKeys(this.shape))if(e&&!e[r])a[r]=this.shape[r];else{let n=this.shape[r];for(;n instanceof ee;)n=n._def.innerType;a[r]=n}return new M({...this._def,shape:()=>a})}keyof(){return Qa(I.objectKeys(this.shape))}}M.create=(t,e)=>new M({shape:()=>t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...T(e)});M.strictCreate=(t,e)=>new M({shape:()=>t,unknownKeys:"strict",catchall:oe.create(),typeName:S.ZodObject,...T(e)});M.lazycreate=(t,e)=>new M({shape:t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...T(e)});class Je extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=this._def.options;function i(n){for(const l of n)if(l.result.status==="valid")return l.result;for(const l of n)if(l.result.status==="dirty")return a.common.issues.push(...l.ctx.common.issues),l.result;const o=n.map(l=>new ae(l.ctx.common.issues));return b(a,{code:m.invalid_union,unionErrors:o}),N}if(a.common.async)return Promise.all(r.map(async n=>{const o={...a,common:{...a.common,issues:[]},parent:null};return{result:await n._parseAsync({data:a.data,path:a.path,parent:o}),ctx:o}})).then(i);{let n;const o=[];for(const c of r){const d={...a,common:{...a.common,issues:[]},parent:null},h=c._parseSync({data:a.data,path:a.path,parent:d});if(h.status==="valid")return h;h.status==="dirty"&&!n&&(n={result:h,ctx:d}),d.common.issues.length&&o.push(d.common.issues)}if(n)return a.common.issues.push(...n.ctx.common.issues),n.result;const l=o.map(c=>new ae(c));return b(a,{code:m.invalid_union,unionErrors:l}),N}}get options(){return this._def.options}}Je.create=(t,e)=>new Je({options:t,typeName:S.ZodUnion,...T(e)});const G=t=>t instanceof It?G(t.schema):t instanceof le?G(t.innerType()):t instanceof Qe?[t.value]:t instanceof he?t.options:t instanceof Rt?I.objectValues(t.enum):t instanceof tt?G(t._def.innerType):t instanceof Tt?[void 0]:t instanceof At?[null]:t instanceof ee?[void 0,...G(t.unwrap())]:t instanceof pe?[null,...G(t.unwrap())]:t instanceof er||t instanceof rt?G(t.unwrap()):t instanceof at?G(t._def.innerType):[];class Vt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==v.object)return b(a,{code:m.invalid_type,expected:v.object,received:a.parsedType}),N;const r=this.discriminator,i=a.data[r],n=this.optionsMap.get(i);return n?a.common.async?n._parseAsync({data:a.data,path:a.path,parent:a}):n._parseSync({data:a.data,path:a.path,parent:a}):(b(a,{code:m.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),N)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,a,r){const i=new Map;for(const n of a){const o=G(n.shape[e]);if(!o.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const l of o){if(i.has(l))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(l)}`);i.set(l,n)}}return new Vt({typeName:S.ZodDiscriminatedUnion,discriminator:e,options:a,optionsMap:i,...T(r)})}}function Et(t,e){const a=se(t),r=se(e);if(t===e)return{valid:!0,data:t};if(a===v.object&&r===v.object){const i=I.objectKeys(e),n=I.objectKeys(t).filter(l=>i.indexOf(l)!==-1),o={...t,...e};for(const l of n){const c=Et(t[l],e[l]);if(!c.valid)return{valid:!1};o[l]=c.data}return{valid:!0,data:o}}else if(a===v.array&&r===v.array){if(t.length!==e.length)return{valid:!1};const i=[];for(let n=0;n<t.length;n++){const o=t[n],l=e[n],c=Et(o,l);if(!c.valid)return{valid:!1};i.push(c.data)}return{valid:!0,data:i}}else return a===v.date&&r===v.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class Ge extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=(n,o)=>{if(ca(n)||ca(o))return N;const l=Et(n.value,o.value);return l.valid?((ua(n)||ua(o))&&a.dirty(),{status:a.value,value:l.data}):(b(r,{code:m.invalid_intersection_types}),N)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([n,o])=>i(n,o)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Ge.create=(t,e,a)=>new Ge({left:t,right:e,typeName:S.ZodIntersection,...T(a)});class ue extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.array)return b(r,{code:m.invalid_type,expected:v.array,received:r.parsedType}),N;if(r.data.length<this._def.items.length)return b(r,{code:m.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),N;!this._def.rest&&r.data.length>this._def.items.length&&(b(r,{code:m.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const n=[...r.data].map((o,l)=>{const c=this._def.items[l]||this._def.rest;return c?c._parse(new J(r,o,r.path,l)):null}).filter(o=>!!o);return r.common.async?Promise.all(n).then(o=>z.mergeArray(a,o)):z.mergeArray(a,n)}get items(){return this._def.items}rest(e){return new ue({...this._def,rest:e})}}ue.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ue({items:t,typeName:S.ZodTuple,rest:null,...T(e)})};class Ke extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.object)return b(r,{code:m.invalid_type,expected:v.object,received:r.parsedType}),N;const i=[],n=this._def.keyType,o=this._def.valueType;for(const l in r.data)i.push({key:n._parse(new J(r,l,r.path,l)),value:o._parse(new J(r,r.data[l],r.path,l)),alwaysSet:l in r.data});return r.common.async?z.mergeObjectAsync(a,i):z.mergeObjectSync(a,i)}get element(){return this._def.valueType}static create(e,a,r){return a instanceof E?new Ke({keyType:e,valueType:a,typeName:S.ZodRecord,...T(r)}):new Ke({keyType:Q.create(),valueType:e,typeName:S.ZodRecord,...T(a)})}}class ga extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.map)return b(r,{code:m.invalid_type,expected:v.map,received:r.parsedType}),N;const i=this._def.keyType,n=this._def.valueType,o=[...r.data.entries()].map(([l,c],d)=>({key:i._parse(new J(r,l,r.path,[d,"key"])),value:n._parse(new J(r,c,r.path,[d,"value"]))}));if(r.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const c of o){const d=await c.key,h=await c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),l.set(d.value,h.value)}return{status:a.value,value:l}})}else{const l=new Map;for(const c of o){const d=c.key,h=c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),l.set(d.value,h.value)}return{status:a.value,value:l}}}}ga.create=(t,e,a)=>new ga({valueType:e,keyType:t,typeName:S.ZodMap,...T(a)});class Ee extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.set)return b(r,{code:m.invalid_type,expected:v.set,received:r.parsedType}),N;const i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(b(r,{code:m.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),a.dirty()),i.maxSize!==null&&r.data.size>i.maxSize.value&&(b(r,{code:m.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),a.dirty());const n=this._def.valueType;function o(c){const d=new Set;for(const h of c){if(h.status==="aborted")return N;h.status==="dirty"&&a.dirty(),d.add(h.value)}return{status:a.value,value:d}}const l=[...r.data.values()].map((c,d)=>n._parse(new J(r,c,r.path,d)));return r.common.async?Promise.all(l).then(c=>o(c)):o(l)}min(e,a){return new Ee({...this._def,minSize:{value:e,message:k.toString(a)}})}max(e,a){return new Ee({...this._def,maxSize:{value:e,message:k.toString(a)}})}size(e,a){return this.min(e,a).max(e,a)}nonempty(e){return this.min(1,e)}}Ee.create=(t,e)=>new Ee({valueType:t,minSize:null,maxSize:null,typeName:S.ZodSet,...T(e)});class It extends E{get schema(){return this._def.getter()}_parse(e){const{ctx:a}=this._processInputParams(e);return this._def.getter()._parse({data:a.data,path:a.path,parent:a})}}It.create=(t,e)=>new It({getter:t,typeName:S.ZodLazy,...T(e)});class Qe extends E{_parse(e){if(e.data!==this._def.value){const a=this._getOrReturnCtx(e);return b(a,{received:a.data,code:m.invalid_literal,expected:this._def.value}),N}return{status:"valid",value:e.data}}get value(){return this._def.value}}Qe.create=(t,e)=>new Qe({value:t,typeName:S.ZodLiteral,...T(e)});function Qa(t,e){return new he({values:t,typeName:S.ZodEnum,...T(e)})}class he extends E{_parse(e){if(typeof e.data!="string"){const a=this._getOrReturnCtx(e),r=this._def.values;return b(a,{expected:I.joinValues(r),received:a.parsedType,code:m.invalid_type}),N}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const a=this._getOrReturnCtx(e),r=this._def.values;return b(a,{received:a.data,code:m.invalid_enum_value,options:r}),N}return W(e.data)}get options(){return this._def.values}get enum(){const e={};for(const a of this._def.values)e[a]=a;return e}get Values(){const e={};for(const a of this._def.values)e[a]=a;return e}get Enum(){const e={};for(const a of this._def.values)e[a]=a;return e}extract(e,a=this._def){return he.create(e,{...this._def,...a})}exclude(e,a=this._def){return he.create(this.options.filter(r=>!e.includes(r)),{...this._def,...a})}}he.create=Qa;class Rt extends E{_parse(e){const a=I.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==v.string&&r.parsedType!==v.number){const i=I.objectValues(a);return b(r,{expected:I.joinValues(i),received:r.parsedType,code:m.invalid_type}),N}if(this._cache||(this._cache=new Set(I.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const i=I.objectValues(a);return b(r,{received:r.data,code:m.invalid_enum_value,options:i}),N}return W(e.data)}get enum(){return this._def.values}}Rt.create=(t,e)=>new Rt({values:t,typeName:S.ZodNativeEnum,...T(e)});class et extends E{unwrap(){return this._def.type}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==v.promise&&a.common.async===!1)return b(a,{code:m.invalid_type,expected:v.promise,received:a.parsedType}),N;const r=a.parsedType===v.promise?a.data:Promise.resolve(a.data);return W(r.then(i=>this._def.type.parseAsync(i,{path:a.path,errorMap:a.common.contextualErrorMap})))}}et.create=(t,e)=>new et({type:t,typeName:S.ZodPromise,...T(e)});class le extends E{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===S.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=this._def.effect||null,n={addIssue:o=>{b(r,o),o.fatal?a.abort():a.dirty()},get path(){return r.path}};if(n.addIssue=n.addIssue.bind(n),i.type==="preprocess"){const o=i.transform(r.data,n);if(r.common.async)return Promise.resolve(o).then(async l=>{if(a.value==="aborted")return N;const c=await this._def.schema._parseAsync({data:l,path:r.path,parent:r});return c.status==="aborted"?N:c.status==="dirty"||a.value==="dirty"?Se(c.value):c});{if(a.value==="aborted")return N;const l=this._def.schema._parseSync({data:o,path:r.path,parent:r});return l.status==="aborted"?N:l.status==="dirty"||a.value==="dirty"?Se(l.value):l}}if(i.type==="refinement"){const o=l=>{const c=i.refinement(l,n);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(r.common.async===!1){const l=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return l.status==="aborted"?N:(l.status==="dirty"&&a.dirty(),o(l.value),{status:a.value,value:l.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(l=>l.status==="aborted"?N:(l.status==="dirty"&&a.dirty(),o(l.value).then(()=>({status:a.value,value:l.value}))))}if(i.type==="transform")if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ye(o))return N;const l=i.transform(o.value,n);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:l}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>ye(o)?Promise.resolve(i.transform(o.value,n)).then(l=>({status:a.value,value:l})):N);I.assertNever(i)}}le.create=(t,e,a)=>new le({schema:t,typeName:S.ZodEffects,effect:e,...T(a)});le.createWithPreprocess=(t,e,a)=>new le({schema:e,effect:{type:"preprocess",transform:t},typeName:S.ZodEffects,...T(a)});class ee extends E{_parse(e){return this._getType(e)===v.undefined?W(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}ee.create=(t,e)=>new ee({innerType:t,typeName:S.ZodOptional,...T(e)});class pe extends E{_parse(e){return this._getType(e)===v.null?W(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}pe.create=(t,e)=>new pe({innerType:t,typeName:S.ZodNullable,...T(e)});class tt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);let r=a.data;return a.parsedType===v.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}tt.create=(t,e)=>new tt({innerType:t,typeName:S.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...T(e)});class at extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r={...a,common:{...a.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Xe(i)?i.then(n=>({status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new ae(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new ae(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}at.create=(t,e)=>new at({innerType:t,typeName:S.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...T(e)});class ya extends E{_parse(e){if(this._getType(e)!==v.nan){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.nan,received:r.parsedType}),N}return{status:"valid",value:e.data}}}ya.create=t=>new ya({typeName:S.ZodNaN,...T(t)});class er extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=a.data;return this._def.type._parse({data:r,path:a.path,parent:a})}unwrap(){return this._def.type}}class Bt extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const n=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return n.status==="aborted"?N:n.status==="dirty"?(a.dirty(),Se(n.value)):this._def.out._parseAsync({data:n.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?N:i.status==="dirty"?(a.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(e,a){return new Bt({in:e,out:a,typeName:S.ZodPipeline})}}class rt extends E{_parse(e){const a=this._def.innerType._parse(e),r=i=>(ye(i)&&(i.value=Object.freeze(i.value)),i);return Xe(a)?a.then(i=>r(i)):r(a)}unwrap(){return this._def.innerType}}rt.create=(t,e)=>new rt({innerType:t,typeName:S.ZodReadonly,...T(e)});var S;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(S||(S={}));const f=Q.create,V=ve.create,Li=Ct.create;oe.create;const O=X.create,A=M.create;Je.create;const tr=Vt.create;Ge.create;ue.create;const ar=Ke.create,re=Qe.create,B=he.create;et.create;ee.create;pe.create;const Wt=le.createWithPreprocess;var va=".fabric/agents/",Pi=["L0","L1","L2"],Oi=["mirror","cross-cutting"],ji=B(Pi),Fi=B(Oi),Mi=A({file:f(),scope_glob:f(),deps:O(f()),priority:B(["high","medium","low"]),layer:ji,topology_type:Fi,hash:f(),activation:A({tier:B(["always","path","description"]),description:f().optional()}).optional()}),Di=Wt(t=>!Bi(t)||typeof t.file!="string"?t:$t(t),Mi),Zi=A({revision:f(),nodes:ar(Di)});function $t(t){return{...t,layer:t.layer??zi(t.file),topology_type:t.topology_type??Ui(t.file)}}function zi(t){const e=ir(t);if(e==="AGENTS.md"||e===".fabric/bootstrap/README.md")return"L0";if(rr(e))return"L1";const a=Hi(e),r=Vi(a);return r===0?"L0":r<=2?"L1":"L2"}function Ui(t){return rr(ir(t))?"cross-cutting":"mirror"}function Hi(t){return t.startsWith(va)?t.slice(va.length):t}function Vi(t){const e=t.split("/").filter(Boolean);return Math.max(e.length-1,0)}function rr(t){return t.split("/").includes("_cross")}function ir(t){return t.replaceAll("\\","/")}function Bi(t){return typeof t=="object"&&t!==null}var Wi=B(["ai","human"]),nr=Wt(t=>{if(!(t==null||t==="")){if(typeof t=="number")return t;if(typeof t=="string"){const e=t.trim();if(e.length===0)return;if(/^\d+$/.test(e))return Number.parseInt(e,10);const a=Date.parse(e);return Number.isNaN(a)?t:a}return t}},V().int().nonnegative());A({source:Wi.optional(),since:nr.optional()});A({ledger_id:f().trim().min(1).optional(),ts:nr.optional()}).superRefine((t,e)=>{[t.ledger_id,t.ts].filter(r=>r!==void 0).length!==1&&e.addIssue({code:m.custom,message:"Provide exactly one of ledger_id or ts.",path:["ledger_id"]})});A({file:f().min(1),start_line:V().int().positive(),end_line:V().int().positive(),new_hash:f().min(1)});A({file:f().min(1)});A({ledger_entry_id:f().min(1),annotation:f().trim().min(1)});var sr={id:f().optional(),ts:V().int().nonnegative(),intent:f(),affected_paths:O(f())},qi=A({...sr,source:re("ai"),commit_sha:f().optional()}),Xi=A({...sr,source:re("human"),parent_sha:f(),parent_ledger_entry_id:f().optional(),diff_stat:f(),annotation:f().optional()}),Yi=tr("source",[qi,Xi]),Ji=Wt(t=>t&&typeof t=="object"&&!Array.isArray(t)&&(!("source"in t)||t.source===void 0)?{...t,source:"human"}:t,Yi),Ie=A({file:f(),start_line:V().int().nonnegative(),end_line:V().int().nonnegative(),hash:f()});A({locked:O(Ie).optional()});var _a=B(["strict","warn","off"]),Gi=A({claudeCodeCLI:f().optional(),claudeCodeDesktop:f().optional(),cursor:f().optional(),windsurf:f().optional(),rooCode:f().optional(),geminiCLI:f().optional(),codexCLI:f().optional()});A({clientPaths:Gi.optional(),externalFixturePath:f().optional(),scanIgnores:O(f()).optional(),auditMode:_a.optional(),audit_mode:_a.optional()});var Ki=A({path:f(),lines:f(),snippet:f(),pattern_hint:f()}),Qi=A({file:f(),line:f(),snippet:f()}),en=A({ratio:V().min(0).max(1),total:V().int().nonnegative(),matched:V().int().nonnegative(),co_occurring_patterns:O(f())}),tn=A({type:B(["framework","pattern","invariant","domain"]),statement:f(),confidence:B(["HIGH","MEDIUM","LOW"]),evidence:O(Qi),coverage:en,proposed_rule:f().optional(),alternatives:O(f()).optional()}),an=A({total_files:V().int().nonnegative(),by_ext:ar(V().int().nonnegative()),key_dirs:O(f()),max_depth:V().int().nonnegative()}),rn=A({path:f(),reason:f(),size_bytes:V().int().nonnegative().optional()}),nn=A({kind:f(),version:f(),subkind:f(),evidence:O(f())}),sn=A({quality:B(["missing","stub","ok"]),line_count:V().int().nonnegative(),has_contributing:Li()}),on=A({path:f(),family:B(["entry","component","config","test","domain"]),rationale:f()}),ln=A({max_files:re(15),max_lines_per_file:re(100)}),dn=A({version:f(),generated_at:f(),generated_by:f(),target:f(),project_name:f(),framework:nn,topology:an,entry_points:O(rn),code_samples:O(Ki),assertions:O(tn),candidate_files:O(on),sampling_budget:ln,readme:sn,recommendations_for_skill:O(f()).optional()}),cn=A({kind:f(),version:f(),subkind:f()}),un=A({confidence:B(["HIGH","MEDIUM","LOW"]),evidence_refs:O(f())}),hn=A({file:f(),lines:f()}),pn=A({type:B(["ban","require","protect"]),rule:f(),rationale:f().optional(),confidence_snapshot:un.optional(),source_evidence:O(hn).optional()}),mn=A({name:f(),paths:O(f()),summary:f().optional(),topology_type:B(["mirror","cross-cutting"]).optional(),target_path:f().optional()}),fn=A({phase:f(),question:f(),answer:f(),presentation:f().optional(),user_corrections:O(f()).optional()});A({framework:cn,architecture_patterns:O(f()),invariants:O(pn),domain_groups:O(mn),interview_trail:O(fn),forensic_ref:f()});var bn=A({type:re("meta:updated"),payload:Zi}),gn=A({type:re("lock:drift"),payload:A({locked:O(Ie),drifted:O(Ie)})}),yn=A({type:re("lock:approved"),payload:A({locked:O(Ie),approved:O(Ie)})}),vn=A({type:re("ledger:appended"),payload:Ji}),_n=A({type:re("drift:detected"),payload:dn});tr("type",[bn,gn,yn,vn,_n]);function kn({lastEvent:t}){const{t:e}=D(),[a,r]=R(null),[i,n]=R([]),[o,l]=R(null),[c,d]=R(""),[h,u]=R(null),g=async()=>{try{const[w,x]=await Promise.all([Ha(),Ba().catch(()=>[])]);r(w),n(x),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};Z(()=>{g()},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g()},[t]);const p=Y(()=>new Set(i.map(w=>w.file)),[i]),y=Y(()=>a===null?[]:or(a,p,c),[a,p,c]),C=o===null?null:a?.nodes[o]??null;return s("section",{className:"view",children:[s(xe,{title:e("dashboard.rules-tree.title"),subtitle:e("dashboard.rules-tree.subtitle")}),h!==null?s(te,{kind:"banner",severity:"stale",message:h}):null,s("div",{className:"view-split",children:[s("div",{className:"tree-panel",children:[s("div",{className:"tree-filter",children:[s("input",{value:c,onInput:w=>d(w.currentTarget.value),placeholder:e("dashboard.rules-tree.filter.placeholder"),"aria-label":e("dashboard.rules-tree.filter.aria-label")}),s("button",{className:"ghost-button",type:"button",onClick:()=>{g()},children:e("dashboard.shared.refresh")})]}),s("div",{className:"status-line",children:[s("span",{children:a===null?e("dashboard.rules-tree.status.loading"):e("dashboard.rules-tree.status.nodes",{count:String(Object.keys(a.nodes).length),revision:a.revision})}),s("span",{children:e("dashboard.rules-tree.status.locks",{count:String(i.length)})})]}),s("div",{className:"tree",role:"tree","aria-label":e("dashboard.rules-tree.tree.aria-label"),children:y.length>0?y.map(w=>s(Ht,{...w,selected:w.node.file===o,onSelect:l},w.node.file)):s("div",{className:"empty-card",children:e("dashboard.rules-tree.empty")})})]}),s("aside",{className:"detail-panel",children:[s("h3",{children:e("dashboard.rules-tree.detail.title")}),C===null?s("p",{className:"muted",children:e("dashboard.rules-tree.detail.empty")}):s("div",{className:"kv",children:[s(Pe,{label:e("dashboard.rules-tree.detail.file"),value:C.file}),s(Pe,{label:e("dashboard.rules-tree.detail.scope"),value:C.scope_glob}),s(Pe,{label:e("dashboard.rules-tree.detail.priority"),value:C.priority}),s(Pe,{label:e("dashboard.rules-tree.detail.hash"),value:C.hash}),s("pre",{className:"code",children:C.deps.length>0?C.deps.join(`
|
|
14
|
-
`):e("dashboard.rules-tree.detail.no-deps")})]})]})]})]})}function xe({title:t,subtitle:e}){return s("div",{className:"view-header",children:s("div",{children:[s("h1",{className:"view-title",children:t}),s("p",{className:"view-subtitle",children:e})]})})}function Pe({label:t,value:e}){return s("div",{className:"kv-row",children:[s("span",{className:"kv-key",children:t}),s("span",{className:"kv-value",children:e})]})}function or(t,e,a){const r=a.trim().toLowerCase(),i=Object.values(t.nodes).filter(l=>r.length===0||JSON.stringify(l).toLowerCase().includes(r)).sort((l,c)=>l.file.localeCompare(c.file)),n=new Map;for(const l of i){const c=l.file.split("/")[0]??"root";n.set(c,[...n.get(c)??[],l])}return[{node:$t({file:`revision:${t.revision}`,scope_glob:"**/*",deps:[],priority:"high",hash:t.revision}),level:0,defaultExpanded:!0,children:Array.from(n.entries()).map(([l,c])=>({node:$t({file:l,scope_glob:`${l}/**/*`,deps:[],priority:"medium",hash:`${c.length} nodes`}),level:1,defaultExpanded:!0,children:c.map(d=>({node:d,level:2,humanLockedNearby:e.has(d.file),staleReason:d.hash.length===0?"hash-mismatch":null}))}))}]}function wn({lastEvent:t}){const{locale:e,t:a}=D(),[r,i]=R(null),[n,o]=R(!0),[l,c]=R(null),d=async()=>{o(!0);try{i(await Ar()),c(null)}catch(h){c(h instanceof Error?h.message:String(h))}finally{o(!1)}};return Z(()=>{d()},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="lock:approved"||t?.type==="lock:drift"||t?.type==="ledger:appended"||t?.type==="drift:detected")&&d()},[t]),s("section",{className:"view",children:[s(xe,{title:a("dashboard.doctor.title"),subtitle:a("dashboard.doctor.subtitle")}),l!==null?s(te,{kind:"banner",severity:"stale",message:l}):null,s("div",{className:"filter-bar doctor-toolbar",children:[s("span",{className:"filter-label",children:a("dashboard.doctor.toolbar.overall")}),s(te,{kind:"pill",severity:lr(r?.status??"warn"),message:a(r===null?"dashboard.shared.loading":`dashboard.shared.status.${r.status}`)}),s("span",{className:"filter-date",children:r===null?a("dashboard.doctor.toolbar.no-summary"):r.summary.entryPoints.length===1?a("dashboard.doctor.toolbar.entry-point-summary",{framework:gt(r.summary.framework,a),count:"1"}):a("dashboard.doctor.toolbar.entry-points-summary",{framework:gt(r.summary.framework,a),count:String(r.summary.entryPoints.length)})}),s("button",{className:"ghost-button",type:"button",onClick:()=>{d()},children:a("dashboard.shared.refresh")})]}),n&&r===null?s("div",{className:"empty-card",children:a("dashboard.doctor.empty.loading")}):null,r!==null?s("div",{className:"doctor-layout",children:[s("div",{className:"doctor-summary-grid",children:[s(bt,{label:a("dashboard.doctor.summary.framework"),value:gt(r.summary.framework,a),detail:r.summary.metaRevision===null?a("dashboard.doctor.summary.no-meta-revision"):`rev ${r.summary.metaRevision}`}),s(bt,{label:a("dashboard.doctor.summary.protected-paths"),value:r.summary.protectedPathCount===0?a("dashboard.doctor.summary.tracked-paths.none"):a("dashboard.doctor.summary.tracked-paths.some",{count:String(r.summary.protectedPathCount)}),detail:r.summary.protectedPathsIntact?a("dashboard.doctor.summary.hashes-intact"):a("dashboard.doctor.summary.drifted",{count:String(r.summary.driftCount)})}),s(bt,{label:a("dashboard.doctor.summary.intent-ledger"),value:Nn(r.summary.lastLedgerEntryAgeMs,a),detail:r.summary.lastLedgerEntryTs===null?a("dashboard.doctor.summary.no-ledger-entries"):new Date(r.summary.lastLedgerEntryTs).toLocaleString(e)})]}),s("div",{className:"doctor-panels",children:[s("article",{className:"doctor-card",children:[s("div",{className:"doctor-card-head",children:[s("h3",{children:a("dashboard.doctor.card.entry-points")}),s("span",{children:r.summary.entryPoints.length})]}),r.summary.entryPoints.length>0?s("div",{className:"doctor-entry-list",children:r.summary.entryPoints.map(h=>s("div",{className:"doctor-entry",children:[s("strong",{children:h.path}),s("span",{children:h.reason})]},`${h.path}:${h.reason}`))}):s("div",{className:"empty-card doctor-empty",children:a("dashboard.doctor.empty.entry-points")})]}),s("article",{className:"doctor-card",children:[s("div",{className:"doctor-card-head",children:[s("h3",{children:a("dashboard.doctor.card.checks")}),s("span",{children:r.checks.length})]}),s("div",{className:"doctor-check-list",children:r.checks.map(h=>s(xn,{check:h},h.name))})]})]})]}):null]})}function bt({label:t,value:e,detail:a}){return s("article",{className:"doctor-summary-card",children:[s("span",{className:"doctor-summary-label",children:t}),s("strong",{className:"doctor-summary-value",children:e}),s("span",{className:"doctor-summary-detail",children:a})]})}function xn({check:t}){const{t:e}=D();return s("div",{className:`doctor-check doctor-check-${t.status}`,children:[s("div",{className:"doctor-check-head",children:[s("strong",{children:t.name}),s(te,{kind:"pill",severity:lr(t.status),message:e(`dashboard.shared.status.${t.status}`)})]}),s("p",{children:t.message})]})}function lr(t){switch(t){case"ok":return"ok";case"warn":return"locked";case"error":return"stale"}}function gt(t,e){const a=[t.kind,t.version,t.subkind].filter(r=>r!=="unknown");return a.length>0?a.join(" · "):e("dashboard.doctor.framework.unknown")}function Nn(t,e){if(t===null)return e("dashboard.doctor.age.none");const a=Math.floor(t/1e3);if(a<60)return e("dashboard.doctor.age.seconds",{count:String(a)});const r=Math.floor(a/60);if(r<60)return e("dashboard.doctor.age.minutes",{count:String(r)});const i=Math.floor(r/60);if(i<48)return e("dashboard.doctor.age.hours",{count:String(i)});const n=Math.floor(i/24);return n<14?e("dashboard.doctor.age.days",{count:String(n)}):e("dashboard.doctor.age.weeks",{count:String(Math.floor(n/7))})}function Sn({lastEvent:t}){const{locale:e,t:a}=D(),[r,i]=R([]),[n,o]=R(null),[l,c]=R(null),[d,h]=R(!1),[u,g]=R(null),p=async()=>{try{const _=(await Va()).sort((P,H)=>P.ts-H.ts);i(_),o(P=>_.length===0?null:P!==null&&_.some(H=>H.id===P)?P:_.at(-1)?.id??null),g(null)}catch(_){g(_ instanceof Error?_.message:String(_))}};Z(()=>{p()},[]),Z(()=>{t?.type==="ledger:appended"&&p()},[t]),Z(()=>{if(n===null){c(null);return}let _=!1;return h(!0),Rr({ledgerId:n}).then(P=>{_||(c(P),g(null))}).catch(P=>{_||(c(null),g(P instanceof Error?P.message:String(P)))}).finally(()=>{_||h(!1)}),()=>{_=!0}},[n]);const y=Y(()=>r.findIndex(_=>_.id===n),[r,n]),C=y>=0?r[y]??null:null,w=C===null?a("dashboard.history-replay.selected.none"):new Date(C.ts).toLocaleString(e),x=Y(()=>l===null?[]:or(l.meta,new Set,""),[l]);return s("section",{className:"view",children:[s(xe,{title:a("dashboard.history-replay.title"),subtitle:a("dashboard.history-replay.subtitle")}),u!==null?s(te,{kind:"banner",severity:"stale",message:u}):null,s("div",{className:"filter-bar history-toolbar",children:[s("span",{className:"filter-label",children:a("dashboard.history-replay.toolbar.scrub")}),s("input",{className:"history-slider",type:"range",min:"0",max:Math.max(r.length-1,0),value:y>=0?y:0,disabled:r.length===0,onInput:_=>{const P=Number.parseInt(_.currentTarget.value,10),H=r[P];H?.id!==void 0&&o(H.id)}}),s("span",{className:"filter-date",children:w}),s("button",{className:"ghost-button",type:"button",disabled:r.length===0,onClick:()=>o(r.at(-1)?.id??null),children:a("dashboard.history-replay.toolbar.latest")})]}),s("div",{className:"view-split history-layout",children:[s("div",{className:"tree-panel history-timeline-panel",children:[s("div",{className:"status-line",children:[s("span",{children:a("dashboard.history-replay.status.replay-points",{count:String(r.length)})}),s("span",{children:a("dashboard.history-replay.status.entries-applied",{count:String(l?.metadata.replayed_count??0)})})]}),s("div",{className:"history-timeline-list",children:r.length>0?[...r].reverse().map(_=>s("div",{className:`history-timeline-item ${_.id===n?"selected":""}`,role:"button",tabIndex:0,onClick:()=>o(_.id??null),onKeyDown:P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),o(_.id??null))},children:s(Ja,{entry:_,readOnly:!0})},_.id??`${_.source}:${_.ts}:${_.intent}`)):s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.entries")})})]}),s("div",{className:"tree-panel",children:[s("div",{className:"tree-filter history-state-head",children:s("div",{children:[s("div",{className:"history-state-title",children:a("dashboard.history-replay.state.title",{label:w})}),s("div",{className:"meta-line",children:a("dashboard.history-replay.state.meta",{ledgerId:l?.metadata.at_ledger_id??a("dashboard.history-replay.meta.na"),commit:l?.metadata.at_commit??a("dashboard.history-replay.meta.not-available"),mode:l?.metadata.mode??a("dashboard.history-replay.meta.pending")})})]})}),s("div",{className:"status-line",children:[s("span",{children:l===null?a("dashboard.history-replay.status.loading"):a("dashboard.history-replay.status.nodes",{count:String(Object.keys(l.meta.nodes).length)})}),s("span",{children:l?.meta.revision??a("dashboard.history-replay.status.unknown-revision")})]}),s("div",{className:"tree",role:"tree","aria-label":a("dashboard.history-replay.tree.aria-label"),children:[d?s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.loading")}):null,!d&&x.length>0?x.map(_=>s(Ht,{..._,readOnly:!0},_.node.file)):null,!d&&x.length===0?s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.select")}):null]})]})]})]})}function Cn({lastEvent:t}){const{t:e}=D(),[a,r]=R([]),[i,n]=R("all"),[o,l]=R(null),[c,d]=R(null),h=async()=>{try{r(await Ba()),d(null)}catch(y){d(y instanceof Error?y.message:String(y))}};Z(()=>{h()},[]),Z(()=>{(t?.type==="lock:drift"||t?.type==="lock:approved")&&h()},[t]);const u=Y(()=>({all:a.length,drift:a.filter(y=>y.drift).length,approved:a.filter(y=>!y.drift).length}),[a]),g=a.filter(y=>i==="all"||(i==="drift"?y.drift:!y.drift)),p=async y=>{const C=a.find(w=>de(w)===de(y));if(C!==void 0){l(de(y));try{const w=await Er({file:C.file,start_line:C.start_line,end_line:C.end_line,new_hash:C.current_hash});r(x=>x.map(_=>de(_)===de(y)?w.entry:_)),d(null)}catch(w){throw d(w instanceof Error?w.message:String(w)),w}finally{l(null)}}};return s("section",{className:"view",children:[s(xe,{title:e("dashboard.human-lock.title"),subtitle:e("dashboard.human-lock.subtitle")}),c!==null?s(te,{kind:"banner",severity:"drift",message:c}):null,s("div",{className:"filter-bar",role:"tablist","aria-label":e("dashboard.human-lock.filters.aria-label"),children:[["all","drift","approved"].map(y=>s("button",{className:`filter-chip ${i===y?"active":""} ${y}`,type:"button",role:"tab","aria-selected":i===y,onClick:()=>n(y),children:[e(`dashboard.human-lock.filters.${y}`),s("span",{className:"count",children:u[y]})]},y)),s("span",{className:"filter-date",children:e("dashboard.human-lock.summary",{drift:String(u.drift),approved:String(u.approved)})})]}),s("div",{className:"lock-grid",children:g.length>0?g.map(y=>s(ii,{entry:y,currentHash:y.current_hash,onApprove:p,busy:o===de(y)},de(y))):s("div",{className:"empty-card",children:e("dashboard.human-lock.empty")})})]})}function de(t){return`${t.file}:${t.start_line}:${t.end_line}`}function Tn({lastEvent:t}){const{t:e}=D(),[a,r]=R([]),[i,n]=R("all"),[o,l]=R(null),c=async()=>{try{r((await Va()).sort((p,y)=>y.ts-p.ts)),l(null)}catch(p){l(p instanceof Error?p.message:String(p))}};Z(()=>{c()},[]),Z(()=>{t?.type==="ledger:appended"&&r(p=>[t.payload,...p].sort((y,C)=>C.ts-y.ts))},[t]);const d=Y(()=>a.filter(p=>i==="all"||p.source===i),[a,i]),h=a.filter(p=>p.source==="ai").length,u=a.length-h,g=async(p,y)=>{if(p.id===void 0)throw new Error(e("dashboard.intent-timeline.annotate.missing-id"));const C=await Ir({ledger_entry_id:p.id,annotation:y});C.created&&r(w=>[C.entry,...w].sort((x,_)=>_.ts-x.ts))};return s("section",{className:"view",children:[s(xe,{title:e("dashboard.intent-timeline.title"),subtitle:e("dashboard.intent-timeline.subtitle")}),o!==null?s("div",{className:"empty-card",children:o}):null,s("div",{className:"filter-bar",children:[s("span",{className:"filter-label",children:e("dashboard.intent-timeline.filter.label")}),s("button",{className:`filter-chip ${i==="all"?"active":""}`,type:"button",onClick:()=>n("all"),children:[e("dashboard.intent-timeline.filter.all")," ",a.length]}),s(Nt,{source:"ai",interactive:!0,selected:i==="ai",onClick:()=>n("ai")}),s(Nt,{source:"human",interactive:!0,selected:i==="human",onClick:()=>n("human")}),s("span",{className:"filter-date",children:e("dashboard.intent-timeline.summary",{aiCount:String(h),humanCount:String(u)})})]}),s("div",{className:"col-headers",children:[s("div",{className:"col-head ai",children:[s("strong",{children:e("dashboard.intent-timeline.columns.ai.title")}),s("span",{children:e("dashboard.intent-timeline.columns.ai.entries",{count:String(h)})})]}),s("div",{className:"col-head human",children:[s("strong",{children:e("dashboard.intent-timeline.columns.human.title")}),s("span",{children:e("dashboard.intent-timeline.columns.human.entries",{count:String(u)})})]})]}),s("div",{className:"timeline-grid",children:[s("div",{className:"axis",children:s("div",{className:"axis-line"})}),d.length>0?d.map(p=>s(Ja,{entry:p,onAnnotate:g},p.id??`${p.source}:${p.ts}:${p.intent}`)):s("div",{className:"empty-card timeline-empty",children:e("dashboard.intent-timeline.empty")})]})]})}const Oe="packages/dashboard/src/views/rule-topology.tsx";function An({lastEvent:t}){const{t:e}=D(),[a,r]=R(null),[i,n]=R(null),[o,l]=R(Oe),[c,d]=R(Oe),[h,u]=R(null),g=async C=>{try{const[w,x]=await Promise.all([Ha(),Tr(C)]);r(w),n(x),d(C),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};Z(()=>{g(Oe)},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g(c)},[c,t]);const p=Y(()=>a===null?[]:Object.values(a.nodes),[a]),y=(i?.L1.length??0)+(i?.L2.length??0)+(i?.description_stubs?.length??0);return s("section",{className:"view",children:[s(xe,{title:e("dashboard.rule-topology.title"),subtitle:e("dashboard.rule-topology.subtitle")}),h!==null?s(te,{kind:"banner",severity:"stale",message:h}):null,s("div",{className:"tree-filter topology-toolbar",children:[s("input",{value:o,onInput:C=>l(C.currentTarget.value),placeholder:e("dashboard.rule-topology.path.placeholder"),"aria-label":e("dashboard.rule-topology.path.aria-label")}),s("button",{className:"ghost-button",type:"button",onClick:()=>{g(o.trim().length>0?o.trim():Oe)},children:e("dashboard.shared.refresh")})]}),s("div",{className:"status-line topology-status",children:[s("span",{children:e("dashboard.rule-topology.status.sample",{path:c})}),s("span",{children:e("dashboard.rule-topology.status.hits",{count:String(y)})}),s("span",{children:a===null?e("dashboard.shared.loading"):e("dashboard.rule-topology.status.revision",{revision:a.revision})})]}),s("div",{className:"view-split topology-split",children:[s(Jr,{nodes:p}),s(ai,{meta:a,rulesContext:i})]})]})}function En(){return s(Yr,{children:s(In,{})})}function In(){const{t}=D(),[e,a]=R(ka()),r=zr(),i=[{id:"topology",hash:"#/topology",label:t("dashboard.app.nav.module-a.label-bilingual"),subtitle:t("dashboard.app.nav.module-a.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.topology")},{id:"forensic",hash:"#/forensic",label:t("dashboard.app.nav.module-b.label-bilingual"),subtitle:t("dashboard.app.nav.module-b.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.forensic")},{id:"semantic",hash:"#/semantic",label:t("dashboard.app.nav.module-c.label-bilingual"),subtitle:t("dashboard.app.nav.module-c.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.semantic")},{id:"ledger",hash:"#/ledger",label:t("dashboard.app.nav.module-d.label-bilingual"),subtitle:t("dashboard.app.nav.module-d.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.ledger")}],n=[{id:"rules",hash:"#/rules",label:t("dashboard.app.nav.rules.label-bilingual"),subtitle:t("dashboard.app.nav.rules.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.rules")},{id:"locks",hash:"#/locks",label:t("dashboard.app.nav.locks.label-bilingual"),subtitle:t("dashboard.app.nav.locks.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.locks")},{id:"timeline",hash:"#/timeline",label:t("dashboard.app.nav.timeline.label-bilingual"),subtitle:t("dashboard.app.nav.timeline.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.timeline")},{id:"history",hash:"#/history",label:t("dashboard.app.nav.history.label-bilingual"),subtitle:t("dashboard.app.nav.history.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.history")},{id:"doctor",hash:"#/doctor",label:t("dashboard.app.nav.doctor.label-bilingual"),subtitle:t("dashboard.app.nav.doctor.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.doctor")}];Z(()=>{const l=()=>a(ka());return window.addEventListener("hashchange",l),window.location.hash===""&&(window.location.hash="#/topology"),()=>window.removeEventListener("hashchange",l)},[]);const o=Y(()=>[...i,...n].find(l=>l.id===e)??i[0],[n,i,e]);return s(Rn,{connected:r.connected,port:wa(),activeRoute:o.id,children:[s("aside",{className:"sidebar",children:[s("div",{className:"brand",children:[s("span",{className:"brand-logo",children:"F"}),s("span",{children:"fabric"}),s("span",{className:"brand-version",children:"v1.5.1"})]}),s("nav",{"aria-label":t("dashboard.app.nav.aria-label"),children:i.map(l=>s("a",{className:`nav-item ${l.id===e?"active":""}`,href:l.hash,"aria-current":l.id===e?"page":void 0,children:[s("span",{className:"dot","aria-hidden":"true"}),s("span",{children:l.label}),s("small",{children:l.subtitle})]},l.id))}),s("div",{className:"nav-section",children:t("dashboard.app.nav.section.modules-status")}),s("span",{className:"nav-item muted-nav",children:[s("span",{className:"dot"}),t("dashboard.app.nav.modules.read-only")]}),s("div",{className:"nav-section",children:t("dashboard.app.nav.section.diagnostics")}),n.map(l=>s("a",{className:`nav-item ${l.id===e?"active":""}`,href:l.hash,"aria-current":l.id===e?"page":void 0,children:[s("span",{className:"dot","aria-hidden":"true"}),s("span",{children:l.label}),s("small",{children:l.subtitle})]},l.id)),s("span",{className:"nav-item muted-nav",children:[s("span",{className:"dot"}),t("dashboard.app.nav.drift-check")]})]}),s("main",{className:"main",children:[s("header",{className:"header",children:[s("div",{className:"breadcrumb",children:[s("span",{children:window.location.pathname==="/"?"~":window.location.pathname}),s("span",{className:"sep",children:"/"}),s("strong",{children:o.breadcrumb})]}),s("div",{className:"header-actions",children:[s("span",{className:`badge-live ${r.connected?"connected":"disconnected"}`,children:[s("span",{className:"pulse","aria-hidden":"true"}),r.connected?t("dashboard.app.header.connected"):t("dashboard.app.header.connecting")]}),s("span",{className:"port-label",children:[":",wa()," /events"]})]})]}),e==="topology"?s(An,{lastEvent:r.lastEvent}):null,e==="forensic"?s(yt,{title:t("dashboard.module-placeholder.forensic.title"),subtitle:t("dashboard.module-placeholder.forensic.subtitle")}):null,e==="semantic"?s(yt,{title:t("dashboard.module-placeholder.semantic.title"),subtitle:t("dashboard.module-placeholder.semantic.subtitle")}):null,e==="ledger"?s(yt,{title:t("dashboard.module-placeholder.ledger.title"),subtitle:t("dashboard.module-placeholder.ledger.subtitle")}):null,e==="rules"?s(kn,{lastEvent:r.lastEvent}):null,e==="locks"?s(Cn,{lastEvent:r.lastEvent}):null,e==="timeline"?s(Tn,{lastEvent:r.lastEvent}):null,e==="history"?s(Sn,{lastEvent:r.lastEvent}):null,e==="doctor"?s(wn,{lastEvent:r.lastEvent}):null]}),s("div",{className:"live-region","aria-live":"polite","aria-atomic":"true",children:r.lastEvent===null?"":t("dashboard.app.live-region.received",{type:r.lastEvent.type})})]})}function yt({title:t,subtitle:e}){const{t:a}=D();return s("section",{className:"view",children:[s("div",{className:"view-header",children:s("div",{children:[s("h1",{className:"view-title",children:t}),s("p",{className:"view-subtitle",children:e})]})}),s("div",{className:"empty-card module-placeholder",children:[s("strong",{children:a("dashboard.module-placeholder.coming-soon")}),s("p",{children:a("dashboard.module-placeholder.read-only")})]})]})}function Rn({connected:t,port:e,activeRoute:a,children:r}){return s("div",{className:`app-shell ${t?"is-connected":"is-disconnected"}`,"data-port":e,"data-route":a,children:r})}function ka(){switch(window.location.hash){case"#/topology":return"topology";case"#/forensic":return"forensic";case"#/semantic":return"semantic";case"#/ledger":return"ledger";case"#/locks":return"locks";case"#/timeline":return"timeline";case"#/history":return"history";case"#/doctor":return"doctor";case"#/rules":return"rules";default:return"topology"}}function wa(){const t=Number.parseInt(window.location.port,10);return Number.isFinite(t)?t:7373}const dr=document.getElementById("app");if(dr===null)throw new Error("Fabric Dashboard root element #app was not found.");gr(s(En,{}),dr);
|
|
13
|
+
${o(l?"dashboard.lock-card.preview.drift-detail":"dashboard.lock-card.preview.sync-detail")}`})]})]}),s("footer",{className:"lock-foot",children:[s("span",{className:"meta-line",children:o("dashboard.lock-card.footer.region",{count:String(t.end_line-t.start_line+1)})}),l&&e!==void 0&&i!==void 0?s(Ga,{variant:"approve",state:n?"busy":"idle",ariaLabel:o("dashboard.lock-card.button.approve"),onClick:()=>i(t),children:o("dashboard.lock-card.button.approve")}):s("button",{className:"action-button action-approve action-success",type:"button","aria-disabled":"true",children:["✓ ",o("dashboard.lock-card.button.confirmed")]})]})]})}function mt({label:t,value:e,stale:a=!1,accent:r=!1}){return s("div",{className:"hash-row",children:[s("span",{className:"hash-key",children:t}),s("span",{className:`hash-value ${a?"is-stale":""} ${r?"is-accent":""}`,children:e})]})}function oi(t,e,a){return t===void 0?a(e?"dashboard.lock-card.diff.hash-mismatch":"dashboard.lock-card.diff.no-changes"):t.bytes!==void 0?a("dashboard.lock-card.diff.with-bytes",{added:String(t.added),removed:String(t.removed),bytes:String(t.bytes)}):a("dashboard.lock-card.diff.without-bytes",{added:String(t.added),removed:String(t.removed)})}function Nt({source:t,size:e="sm",variant:a="filled",interactive:r=!1,selected:i=!1,onClick:n}){const{t:o}=D(),l=["source-badge",`source-badge-${t}`,`source-badge-${e}`,`source-badge-${a}`,i?"is-selected":""].filter(Boolean).join(" "),c=o(`dashboard.source.${t}`);return r?s("button",{className:l,type:"button","aria-pressed":i,onClick:n,children:[s("span",{className:"source-badge-dot","aria-hidden":"true"}),c]}):s("span",{className:l,children:[s("span",{className:"source-badge-dot","aria-hidden":"true"}),c]})}function Ja({entry:t,onAnnotate:e,expanded:a=!1,readOnly:r=!1}){const{locale:i,t:n}=D(),[o,l]=R(a),[c,d]=R(""),h=t.source==="ai",u=!r&&h&&e!==void 0&&t.id!==void 0,g=async()=>{const p=c.trim();!h||e===void 0||p.length===0||(await e(t,p),d(""),l(!1))};return s("article",{className:`timeline-entry timeline-${t.source}`,"aria-label":n("dashboard.timeline-entry.aria-label",{source:n(`dashboard.source.${t.source}`),intent:t.intent}),children:[s("div",{className:`dot-axis ${t.source}`,"aria-hidden":"true"}),s("div",{className:"timeline-head",children:[s(Nt,{source:t.source}),h?s("span",{className:"commit-hash",children:t.commit_sha??n("dashboard.timeline-entry.working-tree")}):null,h?null:s("span",{className:"commit-hash",children:n("dashboard.timeline-entry.parent",{parent:t.parent_sha})}),h?null:s("span",{className:"diff-badge",children:t.diff_stat}),s("time",{className:"entry-time",dateTime:new Date(t.ts).toISOString(),children:li(t.ts,i)})]}),s("h3",{className:"entry-title",children:t.intent}),s("div",{className:"entry-meta",children:[s("span",{children:[s("span",{className:"meta-key",children:n("dashboard.timeline-entry.paths")})," ",t.affected_paths.length]}),t.affected_paths.slice(0,3).map(p=>s("span",{children:p},p))]}),!h&&t.annotation!==void 0?s("div",{className:"entry-body",children:t.annotation}):null,h&&u?s("div",{className:"entry-foot",children:s("button",{className:"ghost-button",type:"button",onClick:()=>l(p=>!p),children:n("dashboard.timeline-entry.annotate")})}):null,o&&h?s("form",{className:"annotate-form",onSubmit:p=>{p.preventDefault(),g()},children:[s("label",{htmlFor:`annotate-${t.id??t.ts}`,children:n("dashboard.timeline-entry.annotation-label")}),s("input",{id:`annotate-${t.id??t.ts}`,className:"annotate-input",value:c,onInput:p=>d(p.currentTarget.value),placeholder:n("dashboard.timeline-entry.annotation-placeholder")}),s(Ga,{variant:"annotate",size:"sm",onClick:g,children:n("dashboard.timeline-entry.annotation-save")})]}):null]})}function li(t,e){return new Intl.DateTimeFormat(e,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date(t))}function Ht({node:t,level:e,selected:a=!1,onSelect:r,humanLockedNearby:i=!1,staleReason:n=null,defaultExpanded:o=!1,readOnly:l=!1,children:c=[]}){const{t:d}=D(),[h,u]=R(o),g=c.length>0,p=t.file,y=n===null?"ok":n==="orphan"?"orphan":"stale",C=()=>{l||(g&&u(x=>!x),r?.(p))},w=x=>{l||((x.key==="Enter"||x.key===" ")&&(x.preventDefault(),C()),x.key==="ArrowRight"&&g&&u(!0),x.key==="ArrowLeft"&&g&&u(!1))};return s("div",{className:`tree-node-group tree-level-${e}`,children:[s("div",{className:["tree-node",a?"is-selected":"",h?"is-expanded":"",i?"is-locked":"",n!==null?"is-stale":"",l?"is-readonly":""].filter(Boolean).join(" "),role:"treeitem","aria-expanded":g?h:void 0,"aria-level":e+1,"aria-readonly":l||void 0,tabIndex:l?-1:0,onClick:l?void 0:C,onKeyDown:l?void 0:w,children:[s("span",{className:"tree-caret","aria-hidden":"true",children:g?"›":"·"}),s("span",{className:"tree-icon","aria-hidden":"true",children:e===0?"F":e===1?"D":"R"}),s("span",{className:"tree-label",children:p}),i?s("span",{className:"badge badge-locked",children:d("dashboard.tree-node.locked")}):null,n!==null?s(te,{kind:"pill",severity:y,message:d(`dashboard.tree-node.stale.${n}`)}):null,s("span",{className:"tree-meta",children:[s("span",{className:"badge badge-level",children:["L",e]}),s("span",{className:"tree-hash",children:di(t.hash)})]})]}),g&&h?s("div",{className:"tree-children",role:"group",children:c.map(x=>s(Ht,{...x,onSelect:r,readOnly:l},`${x.node.file}:${x.level}`))}):null]})}function di(t){return t.length>18?`${t.slice(0,12)}…`:t}var I;(function(t){t.assertEqual=i=>{};function e(i){}t.assertIs=e;function a(i){throw new Error}t.assertNever=a,t.arrayToEnum=i=>{const n={};for(const o of i)n[o]=o;return n},t.getValidEnumValues=i=>{const n=t.objectKeys(i).filter(l=>typeof i[i[l]]!="number"),o={};for(const l of n)o[l]=i[l];return t.objectValues(o)},t.objectValues=i=>t.objectKeys(i).map(function(n){return i[n]}),t.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const n=[];for(const o in i)Object.prototype.hasOwnProperty.call(i,o)&&n.push(o);return n},t.find=(i,n)=>{for(const o of i)if(n(o))return o},t.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&Number.isFinite(i)&&Math.floor(i)===i;function r(i,n=" | "){return i.map(o=>typeof o=="string"?`'${o}'`:o).join(n)}t.joinValues=r,t.jsonStringifyReplacer=(i,n)=>typeof n=="bigint"?n.toString():n})(I||(I={}));var ca;(function(t){t.mergeShapes=(e,a)=>({...e,...a})})(ca||(ca={}));const v=I.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),se=t=>{switch(typeof t){case"undefined":return v.undefined;case"string":return v.string;case"number":return Number.isNaN(t)?v.nan:v.number;case"boolean":return v.boolean;case"function":return v.function;case"bigint":return v.bigint;case"symbol":return v.symbol;case"object":return Array.isArray(t)?v.array:t===null?v.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?v.promise:typeof Map<"u"&&t instanceof Map?v.map:typeof Set<"u"&&t instanceof Set?v.set:typeof Date<"u"&&t instanceof Date?v.date:v.object;default:return v.unknown}},m=I.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class ae extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const a=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,a):this.__proto__=a,this.name="ZodError",this.issues=e}format(e){const a=e||function(n){return n.message},r={_errors:[]},i=n=>{for(const o of n.issues)if(o.code==="invalid_union")o.unionErrors.map(i);else if(o.code==="invalid_return_type")i(o.returnTypeError);else if(o.code==="invalid_arguments")i(o.argumentsError);else if(o.path.length===0)r._errors.push(a(o));else{let l=r,c=0;for(;c<o.path.length;){const d=o.path[c];c===o.path.length-1?(l[d]=l[d]||{_errors:[]},l[d]._errors.push(a(o))):l[d]=l[d]||{_errors:[]},l=l[d],c++}}};return i(this),r}static assert(e){if(!(e instanceof ae))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,I.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=a=>a.message){const a={},r=[];for(const i of this.issues)if(i.path.length>0){const n=i.path[0];a[n]=a[n]||[],a[n].push(e(i))}else r.push(e(i));return{formErrors:r,fieldErrors:a}}get formErrors(){return this.flatten()}}ae.create=t=>new ae(t);const St=(t,e)=>{let a;switch(t.code){case m.invalid_type:t.received===v.undefined?a="Required":a=`Expected ${t.expected}, received ${t.received}`;break;case m.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(t.expected,I.jsonStringifyReplacer)}`;break;case m.unrecognized_keys:a=`Unrecognized key(s) in object: ${I.joinValues(t.keys,", ")}`;break;case m.invalid_union:a="Invalid input";break;case m.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${I.joinValues(t.options)}`;break;case m.invalid_enum_value:a=`Invalid enum value. Expected ${I.joinValues(t.options)}, received '${t.received}'`;break;case m.invalid_arguments:a="Invalid function arguments";break;case m.invalid_return_type:a="Invalid function return type";break;case m.invalid_date:a="Invalid date";break;case m.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(a=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(a=`${a} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?a=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?a=`Invalid input: must end with "${t.validation.endsWith}"`:I.assertNever(t.validation):t.validation!=="regex"?a=`Invalid ${t.validation}`:a="Invalid";break;case m.too_small:t.type==="array"?a=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?a=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?a=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?a=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?a=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:a="Invalid input";break;case m.too_big:t.type==="array"?a=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?a=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?a=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?a=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?a=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:a="Invalid input";break;case m.custom:a="Invalid input";break;case m.invalid_intersection_types:a="Intersection results could not be merged";break;case m.not_multiple_of:a=`Number must be a multiple of ${t.multipleOf}`;break;case m.not_finite:a="Number must be finite";break;default:a=e.defaultError,I.assertNever(t)}return{message:a}};let ci=St;function ui(){return ci}const hi=t=>{const{data:e,path:a,errorMaps:r,issueData:i}=t,n=[...a,...i.path||[]],o={...i,path:n};if(i.message!==void 0)return{...i,path:n,message:i.message};let l="";const c=r.filter(d=>!!d).slice().reverse();for(const d of c)l=d(o,{data:e,defaultError:l}).message;return{...i,path:n,message:l}};function b(t,e){const a=ui(),r=hi({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,a,a===St?void 0:St].filter(i=>!!i)});t.common.issues.push(r)}class z{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,a){const r=[];for(const i of a){if(i.status==="aborted")return N;i.status==="dirty"&&e.dirty(),r.push(i.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,a){const r=[];for(const i of a){const n=await i.key,o=await i.value;r.push({key:n,value:o})}return z.mergeObjectSync(e,r)}static mergeObjectSync(e,a){const r={};for(const i of a){const{key:n,value:o}=i;if(n.status==="aborted"||o.status==="aborted")return N;n.status==="dirty"&&e.dirty(),o.status==="dirty"&&e.dirty(),n.value!=="__proto__"&&(typeof o.value<"u"||i.alwaysSet)&&(r[n.value]=o.value)}return{status:e.value,value:r}}}const N=Object.freeze({status:"aborted"}),Se=t=>({status:"dirty",value:t}),W=t=>({status:"valid",value:t}),ua=t=>t.status==="aborted",ha=t=>t.status==="dirty",ye=t=>t.status==="valid",Xe=t=>typeof Promise<"u"&&t instanceof Promise;var k;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(k||(k={}));class G{constructor(e,a,r,i){this._cachedPath=[],this.parent=e,this.data=a,this._path=r,this._key=i}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const pa=(t,e)=>{if(ye(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const a=new ae(t.common.issues);return this._error=a,this._error}}};function T(t){if(!t)return{};const{errorMap:e,invalid_type_error:a,required_error:r,description:i}=t;if(e&&(a||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:i}:{errorMap:(o,l)=>{const{message:c}=t;return o.code==="invalid_enum_value"?{message:c??l.defaultError}:typeof l.data>"u"?{message:c??r??l.defaultError}:o.code!=="invalid_type"?{message:l.defaultError}:{message:c??a??l.defaultError}},description:i}}class E{get description(){return this._def.description}_getType(e){return se(e.data)}_getOrReturnCtx(e,a){return a||{common:e.parent.common,data:e.data,parsedType:se(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new z,ctx:{common:e.parent.common,data:e.data,parsedType:se(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const a=this._parse(e);if(Xe(a))throw new Error("Synchronous parse encountered promise.");return a}_parseAsync(e){const a=this._parse(e);return Promise.resolve(a)}parse(e,a){const r=this.safeParse(e,a);if(r.success)return r.data;throw r.error}safeParse(e,a){const r={common:{issues:[],async:a?.async??!1,contextualErrorMap:a?.errorMap},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)},i=this._parseSync({data:e,path:r.path,parent:r});return pa(r,i)}"~validate"(e){const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:a});return ye(r)?{value:r.value}:{issues:a.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),a.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:a}).then(r=>ye(r)?{value:r.value}:{issues:a.common.issues})}async parseAsync(e,a){const r=await this.safeParseAsync(e,a);if(r.success)return r.data;throw r.error}async safeParseAsync(e,a){const r={common:{issues:[],contextualErrorMap:a?.errorMap,async:!0},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:se(e)},i=this._parse({data:e,path:r.path,parent:r}),n=await(Xe(i)?i:Promise.resolve(i));return pa(r,n)}refine(e,a){const r=i=>typeof a=="string"||typeof a>"u"?{message:a}:typeof a=="function"?a(i):a;return this._refinement((i,n)=>{const o=e(i),l=()=>n.addIssue({code:m.custom,...r(i)});return typeof Promise<"u"&&o instanceof Promise?o.then(c=>c?!0:(l(),!1)):o?!0:(l(),!1)})}refinement(e,a){return this._refinement((r,i)=>e(r)?!0:(i.addIssue(typeof a=="function"?a(r,i):a),!1))}_refinement(e){return new le({schema:this,typeName:S.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:a=>this["~validate"](a)}}optional(){return ee.create(this,this._def)}nullable(){return pe.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return X.create(this)}promise(){return et.create(this,this._def)}or(e){return Ge.create([this,e],this._def)}and(e){return Je.create(this,e,this._def)}transform(e){return new le({...T(this._def),schema:this,typeName:S.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const a=typeof e=="function"?e:()=>e;return new tt({...T(this._def),innerType:this,defaultValue:a,typeName:S.ZodDefault})}brand(){return new tr({typeName:S.ZodBranded,type:this,...T(this._def)})}catch(e){const a=typeof e=="function"?e:()=>e;return new at({...T(this._def),innerType:this,catchValue:a,typeName:S.ZodCatch})}describe(e){const a=this.constructor;return new a({...this._def,description:e})}pipe(e){return Bt.create(this,e)}readonly(){return rt.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const pi=/^c[^\s-]{8,}$/i,mi=/^[0-9a-z]+$/,fi=/^[0-9A-HJKMNP-TV-Z]{26}$/i,bi=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,gi=/^[a-z0-9_-]{21}$/i,yi=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,vi=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,_i=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,ki="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let ft;const wi=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,xi=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Ni=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Si=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ci=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Ti=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Ka="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Ai=new RegExp(`^${Ka}$`);function Qa(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);const a=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${a}`}function Ei(t){return new RegExp(`^${Qa(t)}$`)}function Ii(t){let e=`${Ka}T${Qa(t)}`;const a=[];return a.push(t.local?"Z?":"Z"),t.offset&&a.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${a.join("|")})`,new RegExp(`^${e}$`)}function Ri(t,e){return!!((e==="v4"||!e)&&wi.test(t)||(e==="v6"||!e)&&Ni.test(t))}function $i(t,e){if(!yi.test(t))return!1;try{const[a]=t.split(".");if(!a)return!1;const r=a.replace(/-/g,"+").replace(/_/g,"/").padEnd(a.length+(4-a.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||"typ"in i&&i?.typ!=="JWT"||!i.alg||e&&i.alg!==e)}catch{return!1}}function Li(t,e){return!!((e==="v4"||!e)&&xi.test(t)||(e==="v6"||!e)&&Si.test(t))}class Q extends E{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==v.string){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.string,received:n.parsedType}),N}const r=new z;let i;for(const n of this._def.checks)if(n.kind==="min")e.data.length<n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="max")e.data.length>n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!1,message:n.message}),r.dirty());else if(n.kind==="length"){const o=e.data.length>n.value,l=e.data.length<n.value;(o||l)&&(i=this._getOrReturnCtx(e,i),o?b(i,{code:m.too_big,maximum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}):l&&b(i,{code:m.too_small,minimum:n.value,type:"string",inclusive:!0,exact:!0,message:n.message}),r.dirty())}else if(n.kind==="email")_i.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"email",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="emoji")ft||(ft=new RegExp(ki,"u")),ft.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"emoji",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="uuid")bi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"uuid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="nanoid")gi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"nanoid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid")pi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="cuid2")mi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cuid2",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="ulid")fi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ulid",code:m.invalid_string,message:n.message}),r.dirty());else if(n.kind==="url")try{new URL(e.data)}catch{i=this._getOrReturnCtx(e,i),b(i,{validation:"url",code:m.invalid_string,message:n.message}),r.dirty()}else n.kind==="regex"?(n.regex.lastIndex=0,n.regex.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"regex",code:m.invalid_string,message:n.message}),r.dirty())):n.kind==="trim"?e.data=e.data.trim():n.kind==="includes"?e.data.includes(n.value,n.position)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{includes:n.value,position:n.position},message:n.message}),r.dirty()):n.kind==="toLowerCase"?e.data=e.data.toLowerCase():n.kind==="toUpperCase"?e.data=e.data.toUpperCase():n.kind==="startsWith"?e.data.startsWith(n.value)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{startsWith:n.value},message:n.message}),r.dirty()):n.kind==="endsWith"?e.data.endsWith(n.value)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:{endsWith:n.value},message:n.message}),r.dirty()):n.kind==="datetime"?Ii(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"datetime",message:n.message}),r.dirty()):n.kind==="date"?Ai.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"date",message:n.message}),r.dirty()):n.kind==="time"?Ei(n).test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{code:m.invalid_string,validation:"time",message:n.message}),r.dirty()):n.kind==="duration"?vi.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"duration",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="ip"?Ri(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"ip",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="jwt"?$i(e.data,n.alg)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"jwt",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="cidr"?Li(e.data,n.version)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"cidr",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="base64"?Ci.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64",code:m.invalid_string,message:n.message}),r.dirty()):n.kind==="base64url"?Ti.test(e.data)||(i=this._getOrReturnCtx(e,i),b(i,{validation:"base64url",code:m.invalid_string,message:n.message}),r.dirty()):I.assertNever(n);return{status:r.value,value:e.data}}_regex(e,a,r){return this.refinement(i=>e.test(i),{validation:a,code:m.invalid_string,...k.errToObj(r)})}_addCheck(e){return new Q({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...k.errToObj(e)})}url(e){return this._addCheck({kind:"url",...k.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...k.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...k.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...k.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...k.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...k.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...k.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...k.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...k.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...k.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...k.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...k.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...k.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...k.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...k.errToObj(e)})}regex(e,a){return this._addCheck({kind:"regex",regex:e,...k.errToObj(a)})}includes(e,a){return this._addCheck({kind:"includes",value:e,position:a?.position,...k.errToObj(a?.message)})}startsWith(e,a){return this._addCheck({kind:"startsWith",value:e,...k.errToObj(a)})}endsWith(e,a){return this._addCheck({kind:"endsWith",value:e,...k.errToObj(a)})}min(e,a){return this._addCheck({kind:"min",value:e,...k.errToObj(a)})}max(e,a){return this._addCheck({kind:"max",value:e,...k.errToObj(a)})}length(e,a){return this._addCheck({kind:"length",value:e,...k.errToObj(a)})}nonempty(e){return this.min(1,k.errToObj(e))}trim(){return new Q({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Q({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Q({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxLength(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}}Q.create=t=>new Q({checks:[],typeName:S.ZodString,coerce:t?.coerce??!1,...T(t)});function Oi(t,e){const a=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,i=a>r?a:r,n=Number.parseInt(t.toFixed(i).replace(".","")),o=Number.parseInt(e.toFixed(i).replace(".",""));return n%o/10**i}class ve extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==v.number){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.number,received:n.parsedType}),N}let r;const i=new z;for(const n of this._def.checks)n.kind==="int"?I.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:m.invalid_type,expected:"integer",received:"float",message:n.message}),i.dirty()):n.kind==="min"?(n.inclusive?e.data<n.value:e.data<=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_small,minimum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="max"?(n.inclusive?e.data>n.value:e.data>=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_big,maximum:n.value,type:"number",inclusive:n.inclusive,exact:!1,message:n.message}),i.dirty()):n.kind==="multipleOf"?Oi(e.data,n.value)!==0&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_multiple_of,multipleOf:n.value,message:n.message}),i.dirty()):n.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_finite,message:n.message}),i.dirty()):I.assertNever(n);return{status:i.value,value:e.data}}gte(e,a){return this.setLimit("min",e,!0,k.toString(a))}gt(e,a){return this.setLimit("min",e,!1,k.toString(a))}lte(e,a){return this.setLimit("max",e,!0,k.toString(a))}lt(e,a){return this.setLimit("max",e,!1,k.toString(a))}setLimit(e,a,r,i){return new ve({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new ve({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:k.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:k.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:k.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:k.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:k.toString(e)})}multipleOf(e,a){return this._addCheck({kind:"multipleOf",value:e,message:k.toString(a)})}finite(e){return this._addCheck({kind:"finite",message:k.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:k.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:k.toString(e)})}get minValue(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxValue(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&I.isInteger(e.value))}get isFinite(){let e=null,a=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(a===null||r.value>a)&&(a=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value)}return Number.isFinite(a)&&Number.isFinite(e)}}ve.create=t=>new ve({checks:[],typeName:S.ZodNumber,coerce:t?.coerce||!1,...T(t)});class Ae extends E{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==v.bigint)return this._getInvalidInput(e);let r;const i=new z;for(const n of this._def.checks)n.kind==="min"?(n.inclusive?e.data<n.value:e.data<=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_small,type:"bigint",minimum:n.value,inclusive:n.inclusive,message:n.message}),i.dirty()):n.kind==="max"?(n.inclusive?e.data>n.value:e.data>=n.value)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.too_big,type:"bigint",maximum:n.value,inclusive:n.inclusive,message:n.message}),i.dirty()):n.kind==="multipleOf"?e.data%n.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),b(r,{code:m.not_multiple_of,multipleOf:n.value,message:n.message}),i.dirty()):I.assertNever(n);return{status:i.value,value:e.data}}_getInvalidInput(e){const a=this._getOrReturnCtx(e);return b(a,{code:m.invalid_type,expected:v.bigint,received:a.parsedType}),N}gte(e,a){return this.setLimit("min",e,!0,k.toString(a))}gt(e,a){return this.setLimit("min",e,!1,k.toString(a))}lte(e,a){return this.setLimit("max",e,!0,k.toString(a))}lt(e,a){return this.setLimit("max",e,!1,k.toString(a))}setLimit(e,a,r,i){return new Ae({...this._def,checks:[...this._def.checks,{kind:e,value:a,inclusive:r,message:k.toString(i)}]})}_addCheck(e){return new Ae({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:k.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:k.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:k.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:k.toString(e)})}multipleOf(e,a){return this._addCheck({kind:"multipleOf",value:e,message:k.toString(a)})}get minValue(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e}get maxValue(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e}}Ae.create=t=>new Ae({checks:[],typeName:S.ZodBigInt,coerce:t?.coerce??!1,...T(t)});class Ct extends E{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==v.boolean){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.boolean,received:r.parsedType}),N}return W(e.data)}}Ct.create=t=>new Ct({typeName:S.ZodBoolean,coerce:t?.coerce||!1,...T(t)});class Ye extends E{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==v.date){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_type,expected:v.date,received:n.parsedType}),N}if(Number.isNaN(e.data.getTime())){const n=this._getOrReturnCtx(e);return b(n,{code:m.invalid_date}),N}const r=new z;let i;for(const n of this._def.checks)n.kind==="min"?e.data.getTime()<n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_small,message:n.message,inclusive:!0,exact:!1,minimum:n.value,type:"date"}),r.dirty()):n.kind==="max"?e.data.getTime()>n.value&&(i=this._getOrReturnCtx(e,i),b(i,{code:m.too_big,message:n.message,inclusive:!0,exact:!1,maximum:n.value,type:"date"}),r.dirty()):I.assertNever(n);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new Ye({...this._def,checks:[...this._def.checks,e]})}min(e,a){return this._addCheck({kind:"min",value:e.getTime(),message:k.toString(a)})}max(e,a){return this._addCheck({kind:"max",value:e.getTime(),message:k.toString(a)})}get minDate(){let e=null;for(const a of this._def.checks)a.kind==="min"&&(e===null||a.value>e)&&(e=a.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const a of this._def.checks)a.kind==="max"&&(e===null||a.value<e)&&(e=a.value);return e!=null?new Date(e):null}}Ye.create=t=>new Ye({checks:[],coerce:t?.coerce||!1,typeName:S.ZodDate,...T(t)});class ma extends E{_parse(e){if(this._getType(e)!==v.symbol){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.symbol,received:r.parsedType}),N}return W(e.data)}}ma.create=t=>new ma({typeName:S.ZodSymbol,...T(t)});class Tt extends E{_parse(e){if(this._getType(e)!==v.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.undefined,received:r.parsedType}),N}return W(e.data)}}Tt.create=t=>new Tt({typeName:S.ZodUndefined,...T(t)});class At extends E{_parse(e){if(this._getType(e)!==v.null){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.null,received:r.parsedType}),N}return W(e.data)}}At.create=t=>new At({typeName:S.ZodNull,...T(t)});class fa extends E{constructor(){super(...arguments),this._any=!0}_parse(e){return W(e.data)}}fa.create=t=>new fa({typeName:S.ZodAny,...T(t)});class ba extends E{constructor(){super(...arguments),this._unknown=!0}_parse(e){return W(e.data)}}ba.create=t=>new ba({typeName:S.ZodUnknown,...T(t)});class oe extends E{_parse(e){const a=this._getOrReturnCtx(e);return b(a,{code:m.invalid_type,expected:v.never,received:a.parsedType}),N}}oe.create=t=>new oe({typeName:S.ZodNever,...T(t)});class ga extends E{_parse(e){if(this._getType(e)!==v.undefined){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.void,received:r.parsedType}),N}return W(e.data)}}ga.create=t=>new ga({typeName:S.ZodVoid,...T(t)});class X extends E{_parse(e){const{ctx:a,status:r}=this._processInputParams(e),i=this._def;if(a.parsedType!==v.array)return b(a,{code:m.invalid_type,expected:v.array,received:a.parsedType}),N;if(i.exactLength!==null){const o=a.data.length>i.exactLength.value,l=a.data.length<i.exactLength.value;(o||l)&&(b(a,{code:o?m.too_big:m.too_small,minimum:l?i.exactLength.value:void 0,maximum:o?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),r.dirty())}if(i.minLength!==null&&a.data.length<i.minLength.value&&(b(a,{code:m.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),r.dirty()),i.maxLength!==null&&a.data.length>i.maxLength.value&&(b(a,{code:m.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),a.common.async)return Promise.all([...a.data].map((o,l)=>i.type._parseAsync(new G(a,o,a.path,l)))).then(o=>z.mergeArray(r,o));const n=[...a.data].map((o,l)=>i.type._parseSync(new G(a,o,a.path,l)));return z.mergeArray(r,n)}get element(){return this._def.type}min(e,a){return new X({...this._def,minLength:{value:e,message:k.toString(a)}})}max(e,a){return new X({...this._def,maxLength:{value:e,message:k.toString(a)}})}length(e,a){return new X({...this._def,exactLength:{value:e,message:k.toString(a)}})}nonempty(e){return this.min(1,e)}}X.create=(t,e)=>new X({type:t,minLength:null,maxLength:null,exactLength:null,typeName:S.ZodArray,...T(e)});function fe(t){if(t instanceof M){const e={};for(const a in t.shape){const r=t.shape[a];e[a]=ee.create(fe(r))}return new M({...t._def,shape:()=>e})}else return t instanceof X?new X({...t._def,type:fe(t.element)}):t instanceof ee?ee.create(fe(t.unwrap())):t instanceof pe?pe.create(fe(t.unwrap())):t instanceof ue?ue.create(t.items.map(e=>fe(e))):t}class M extends E{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),a=I.objectKeys(e);return this._cached={shape:e,keys:a},this._cached}_parse(e){if(this._getType(e)!==v.object){const d=this._getOrReturnCtx(e);return b(d,{code:m.invalid_type,expected:v.object,received:d.parsedType}),N}const{status:r,ctx:i}=this._processInputParams(e),{shape:n,keys:o}=this._getCached(),l=[];if(!(this._def.catchall instanceof oe&&this._def.unknownKeys==="strip"))for(const d in i.data)o.includes(d)||l.push(d);const c=[];for(const d of o){const h=n[d],u=i.data[d];c.push({key:{status:"valid",value:d},value:h._parse(new G(i,u,i.path,d)),alwaysSet:d in i.data})}if(this._def.catchall instanceof oe){const d=this._def.unknownKeys;if(d==="passthrough")for(const h of l)c.push({key:{status:"valid",value:h},value:{status:"valid",value:i.data[h]}});else if(d==="strict")l.length>0&&(b(i,{code:m.unrecognized_keys,keys:l}),r.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const d=this._def.catchall;for(const h of l){const u=i.data[h];c.push({key:{status:"valid",value:h},value:d._parse(new G(i,u,i.path,h)),alwaysSet:h in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const d=[];for(const h of c){const u=await h.key,g=await h.value;d.push({key:u,value:g,alwaysSet:h.alwaysSet})}return d}).then(d=>z.mergeObjectSync(r,d)):z.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return k.errToObj,new M({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(a,r)=>{const i=this._def.errorMap?.(a,r).message??r.defaultError;return a.code==="unrecognized_keys"?{message:k.errToObj(e).message??i}:{message:i}}}:{}})}strip(){return new M({...this._def,unknownKeys:"strip"})}passthrough(){return new M({...this._def,unknownKeys:"passthrough"})}extend(e){return new M({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new M({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:S.ZodObject})}setKey(e,a){return this.augment({[e]:a})}catchall(e){return new M({...this._def,catchall:e})}pick(e){const a={};for(const r of I.objectKeys(e))e[r]&&this.shape[r]&&(a[r]=this.shape[r]);return new M({...this._def,shape:()=>a})}omit(e){const a={};for(const r of I.objectKeys(this.shape))e[r]||(a[r]=this.shape[r]);return new M({...this._def,shape:()=>a})}deepPartial(){return fe(this)}partial(e){const a={};for(const r of I.objectKeys(this.shape)){const i=this.shape[r];e&&!e[r]?a[r]=i:a[r]=i.optional()}return new M({...this._def,shape:()=>a})}required(e){const a={};for(const r of I.objectKeys(this.shape))if(e&&!e[r])a[r]=this.shape[r];else{let n=this.shape[r];for(;n instanceof ee;)n=n._def.innerType;a[r]=n}return new M({...this._def,shape:()=>a})}keyof(){return er(I.objectKeys(this.shape))}}M.create=(t,e)=>new M({shape:()=>t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...T(e)});M.strictCreate=(t,e)=>new M({shape:()=>t,unknownKeys:"strict",catchall:oe.create(),typeName:S.ZodObject,...T(e)});M.lazycreate=(t,e)=>new M({shape:t,unknownKeys:"strip",catchall:oe.create(),typeName:S.ZodObject,...T(e)});class Ge extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=this._def.options;function i(n){for(const l of n)if(l.result.status==="valid")return l.result;for(const l of n)if(l.result.status==="dirty")return a.common.issues.push(...l.ctx.common.issues),l.result;const o=n.map(l=>new ae(l.ctx.common.issues));return b(a,{code:m.invalid_union,unionErrors:o}),N}if(a.common.async)return Promise.all(r.map(async n=>{const o={...a,common:{...a.common,issues:[]},parent:null};return{result:await n._parseAsync({data:a.data,path:a.path,parent:o}),ctx:o}})).then(i);{let n;const o=[];for(const c of r){const d={...a,common:{...a.common,issues:[]},parent:null},h=c._parseSync({data:a.data,path:a.path,parent:d});if(h.status==="valid")return h;h.status==="dirty"&&!n&&(n={result:h,ctx:d}),d.common.issues.length&&o.push(d.common.issues)}if(n)return a.common.issues.push(...n.ctx.common.issues),n.result;const l=o.map(c=>new ae(c));return b(a,{code:m.invalid_union,unionErrors:l}),N}}get options(){return this._def.options}}Ge.create=(t,e)=>new Ge({options:t,typeName:S.ZodUnion,...T(e)});const J=t=>t instanceof It?J(t.schema):t instanceof le?J(t.innerType()):t instanceof Qe?[t.value]:t instanceof he?t.options:t instanceof Rt?I.objectValues(t.enum):t instanceof tt?J(t._def.innerType):t instanceof Tt?[void 0]:t instanceof At?[null]:t instanceof ee?[void 0,...J(t.unwrap())]:t instanceof pe?[null,...J(t.unwrap())]:t instanceof tr||t instanceof rt?J(t.unwrap()):t instanceof at?J(t._def.innerType):[];class Vt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==v.object)return b(a,{code:m.invalid_type,expected:v.object,received:a.parsedType}),N;const r=this.discriminator,i=a.data[r],n=this.optionsMap.get(i);return n?a.common.async?n._parseAsync({data:a.data,path:a.path,parent:a}):n._parseSync({data:a.data,path:a.path,parent:a}):(b(a,{code:m.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),N)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,a,r){const i=new Map;for(const n of a){const o=J(n.shape[e]);if(!o.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const l of o){if(i.has(l))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(l)}`);i.set(l,n)}}return new Vt({typeName:S.ZodDiscriminatedUnion,discriminator:e,options:a,optionsMap:i,...T(r)})}}function Et(t,e){const a=se(t),r=se(e);if(t===e)return{valid:!0,data:t};if(a===v.object&&r===v.object){const i=I.objectKeys(e),n=I.objectKeys(t).filter(l=>i.indexOf(l)!==-1),o={...t,...e};for(const l of n){const c=Et(t[l],e[l]);if(!c.valid)return{valid:!1};o[l]=c.data}return{valid:!0,data:o}}else if(a===v.array&&r===v.array){if(t.length!==e.length)return{valid:!1};const i=[];for(let n=0;n<t.length;n++){const o=t[n],l=e[n],c=Et(o,l);if(!c.valid)return{valid:!1};i.push(c.data)}return{valid:!0,data:i}}else return a===v.date&&r===v.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class Je extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=(n,o)=>{if(ua(n)||ua(o))return N;const l=Et(n.value,o.value);return l.valid?((ha(n)||ha(o))&&a.dirty(),{status:a.value,value:l.data}):(b(r,{code:m.invalid_intersection_types}),N)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([n,o])=>i(n,o)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Je.create=(t,e,a)=>new Je({left:t,right:e,typeName:S.ZodIntersection,...T(a)});class ue extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.array)return b(r,{code:m.invalid_type,expected:v.array,received:r.parsedType}),N;if(r.data.length<this._def.items.length)return b(r,{code:m.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),N;!this._def.rest&&r.data.length>this._def.items.length&&(b(r,{code:m.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const n=[...r.data].map((o,l)=>{const c=this._def.items[l]||this._def.rest;return c?c._parse(new G(r,o,r.path,l)):null}).filter(o=>!!o);return r.common.async?Promise.all(n).then(o=>z.mergeArray(a,o)):z.mergeArray(a,n)}get items(){return this._def.items}rest(e){return new ue({...this._def,rest:e})}}ue.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ue({items:t,typeName:S.ZodTuple,rest:null,...T(e)})};class Ke extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.object)return b(r,{code:m.invalid_type,expected:v.object,received:r.parsedType}),N;const i=[],n=this._def.keyType,o=this._def.valueType;for(const l in r.data)i.push({key:n._parse(new G(r,l,r.path,l)),value:o._parse(new G(r,r.data[l],r.path,l)),alwaysSet:l in r.data});return r.common.async?z.mergeObjectAsync(a,i):z.mergeObjectSync(a,i)}get element(){return this._def.valueType}static create(e,a,r){return a instanceof E?new Ke({keyType:e,valueType:a,typeName:S.ZodRecord,...T(r)}):new Ke({keyType:Q.create(),valueType:e,typeName:S.ZodRecord,...T(a)})}}class ya extends E{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.map)return b(r,{code:m.invalid_type,expected:v.map,received:r.parsedType}),N;const i=this._def.keyType,n=this._def.valueType,o=[...r.data.entries()].map(([l,c],d)=>({key:i._parse(new G(r,l,r.path,[d,"key"])),value:n._parse(new G(r,c,r.path,[d,"value"]))}));if(r.common.async){const l=new Map;return Promise.resolve().then(async()=>{for(const c of o){const d=await c.key,h=await c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),l.set(d.value,h.value)}return{status:a.value,value:l}})}else{const l=new Map;for(const c of o){const d=c.key,h=c.value;if(d.status==="aborted"||h.status==="aborted")return N;(d.status==="dirty"||h.status==="dirty")&&a.dirty(),l.set(d.value,h.value)}return{status:a.value,value:l}}}}ya.create=(t,e,a)=>new ya({valueType:e,keyType:t,typeName:S.ZodMap,...T(a)});class Ee extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.parsedType!==v.set)return b(r,{code:m.invalid_type,expected:v.set,received:r.parsedType}),N;const i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(b(r,{code:m.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),a.dirty()),i.maxSize!==null&&r.data.size>i.maxSize.value&&(b(r,{code:m.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),a.dirty());const n=this._def.valueType;function o(c){const d=new Set;for(const h of c){if(h.status==="aborted")return N;h.status==="dirty"&&a.dirty(),d.add(h.value)}return{status:a.value,value:d}}const l=[...r.data.values()].map((c,d)=>n._parse(new G(r,c,r.path,d)));return r.common.async?Promise.all(l).then(c=>o(c)):o(l)}min(e,a){return new Ee({...this._def,minSize:{value:e,message:k.toString(a)}})}max(e,a){return new Ee({...this._def,maxSize:{value:e,message:k.toString(a)}})}size(e,a){return this.min(e,a).max(e,a)}nonempty(e){return this.min(1,e)}}Ee.create=(t,e)=>new Ee({valueType:t,minSize:null,maxSize:null,typeName:S.ZodSet,...T(e)});class It extends E{get schema(){return this._def.getter()}_parse(e){const{ctx:a}=this._processInputParams(e);return this._def.getter()._parse({data:a.data,path:a.path,parent:a})}}It.create=(t,e)=>new It({getter:t,typeName:S.ZodLazy,...T(e)});class Qe extends E{_parse(e){if(e.data!==this._def.value){const a=this._getOrReturnCtx(e);return b(a,{received:a.data,code:m.invalid_literal,expected:this._def.value}),N}return{status:"valid",value:e.data}}get value(){return this._def.value}}Qe.create=(t,e)=>new Qe({value:t,typeName:S.ZodLiteral,...T(e)});function er(t,e){return new he({values:t,typeName:S.ZodEnum,...T(e)})}class he extends E{_parse(e){if(typeof e.data!="string"){const a=this._getOrReturnCtx(e),r=this._def.values;return b(a,{expected:I.joinValues(r),received:a.parsedType,code:m.invalid_type}),N}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const a=this._getOrReturnCtx(e),r=this._def.values;return b(a,{received:a.data,code:m.invalid_enum_value,options:r}),N}return W(e.data)}get options(){return this._def.values}get enum(){const e={};for(const a of this._def.values)e[a]=a;return e}get Values(){const e={};for(const a of this._def.values)e[a]=a;return e}get Enum(){const e={};for(const a of this._def.values)e[a]=a;return e}extract(e,a=this._def){return he.create(e,{...this._def,...a})}exclude(e,a=this._def){return he.create(this.options.filter(r=>!e.includes(r)),{...this._def,...a})}}he.create=er;class Rt extends E{_parse(e){const a=I.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==v.string&&r.parsedType!==v.number){const i=I.objectValues(a);return b(r,{expected:I.joinValues(i),received:r.parsedType,code:m.invalid_type}),N}if(this._cache||(this._cache=new Set(I.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const i=I.objectValues(a);return b(r,{received:r.data,code:m.invalid_enum_value,options:i}),N}return W(e.data)}get enum(){return this._def.values}}Rt.create=(t,e)=>new Rt({values:t,typeName:S.ZodNativeEnum,...T(e)});class et extends E{unwrap(){return this._def.type}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==v.promise&&a.common.async===!1)return b(a,{code:m.invalid_type,expected:v.promise,received:a.parsedType}),N;const r=a.parsedType===v.promise?a.data:Promise.resolve(a.data);return W(r.then(i=>this._def.type.parseAsync(i,{path:a.path,errorMap:a.common.contextualErrorMap})))}}et.create=(t,e)=>new et({type:t,typeName:S.ZodPromise,...T(e)});class le extends E{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===S.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:a,ctx:r}=this._processInputParams(e),i=this._def.effect||null,n={addIssue:o=>{b(r,o),o.fatal?a.abort():a.dirty()},get path(){return r.path}};if(n.addIssue=n.addIssue.bind(n),i.type==="preprocess"){const o=i.transform(r.data,n);if(r.common.async)return Promise.resolve(o).then(async l=>{if(a.value==="aborted")return N;const c=await this._def.schema._parseAsync({data:l,path:r.path,parent:r});return c.status==="aborted"?N:c.status==="dirty"||a.value==="dirty"?Se(c.value):c});{if(a.value==="aborted")return N;const l=this._def.schema._parseSync({data:o,path:r.path,parent:r});return l.status==="aborted"?N:l.status==="dirty"||a.value==="dirty"?Se(l.value):l}}if(i.type==="refinement"){const o=l=>{const c=i.refinement(l,n);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(r.common.async===!1){const l=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return l.status==="aborted"?N:(l.status==="dirty"&&a.dirty(),o(l.value),{status:a.value,value:l.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(l=>l.status==="aborted"?N:(l.status==="dirty"&&a.dirty(),o(l.value).then(()=>({status:a.value,value:l.value}))))}if(i.type==="transform")if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!ye(o))return N;const l=i.transform(o.value,n);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:l}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>ye(o)?Promise.resolve(i.transform(o.value,n)).then(l=>({status:a.value,value:l})):N);I.assertNever(i)}}le.create=(t,e,a)=>new le({schema:t,typeName:S.ZodEffects,effect:e,...T(a)});le.createWithPreprocess=(t,e,a)=>new le({schema:e,effect:{type:"preprocess",transform:t},typeName:S.ZodEffects,...T(a)});class ee extends E{_parse(e){return this._getType(e)===v.undefined?W(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}ee.create=(t,e)=>new ee({innerType:t,typeName:S.ZodOptional,...T(e)});class pe extends E{_parse(e){return this._getType(e)===v.null?W(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}pe.create=(t,e)=>new pe({innerType:t,typeName:S.ZodNullable,...T(e)});class tt extends E{_parse(e){const{ctx:a}=this._processInputParams(e);let r=a.data;return a.parsedType===v.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}tt.create=(t,e)=>new tt({innerType:t,typeName:S.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,...T(e)});class at extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r={...a,common:{...a.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Xe(i)?i.then(n=>({status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new ae(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new ae(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}at.create=(t,e)=>new at({innerType:t,typeName:S.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,...T(e)});class va extends E{_parse(e){if(this._getType(e)!==v.nan){const r=this._getOrReturnCtx(e);return b(r,{code:m.invalid_type,expected:v.nan,received:r.parsedType}),N}return{status:"valid",value:e.data}}}va.create=t=>new va({typeName:S.ZodNaN,...T(t)});class tr extends E{_parse(e){const{ctx:a}=this._processInputParams(e),r=a.data;return this._def.type._parse({data:r,path:a.path,parent:a})}unwrap(){return this._def.type}}class Bt extends E{_parse(e){const{status:a,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const n=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return n.status==="aborted"?N:n.status==="dirty"?(a.dirty(),Se(n.value)):this._def.out._parseAsync({data:n.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?N:i.status==="dirty"?(a.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(e,a){return new Bt({in:e,out:a,typeName:S.ZodPipeline})}}class rt extends E{_parse(e){const a=this._def.innerType._parse(e),r=i=>(ye(i)&&(i.value=Object.freeze(i.value)),i);return Xe(a)?a.then(i=>r(i)):r(a)}unwrap(){return this._def.innerType}}rt.create=(t,e)=>new rt({innerType:t,typeName:S.ZodReadonly,...T(e)});var S;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(S||(S={}));const f=Q.create,V=ve.create,Pi=Ct.create;oe.create;const P=X.create,A=M.create;Ge.create;const ar=Vt.create;Je.create;ue.create;const rr=Ke.create,re=Qe.create,B=he.create;et.create;ee.create;pe.create;const Wt=le.createWithPreprocess;var _a=".fabric/agents/",ji=["L0","L1","L2"],Fi=["mirror","cross-cutting"],Mi=["declared","derived"],Di=B(ji),Zi=B(Fi),zi=B(Mi),Ui=A({file:f(),scope_glob:f(),deps:P(f()),priority:B(["high","medium","low"]),layer:Di,topology_type:Zi,hash:f(),stable_id:f().optional(),identity_source:zi.optional(),activation:A({tier:B(["always","path","description"]),description:f().optional()}).optional()}),Hi=Wt(t=>!Yi(t)||typeof t.file!="string"?t:$t(t),Ui),Vi=A({revision:f(),nodes:rr(Hi)});function $t(t){const e=t.stable_id??ir(t.file),a=Bi(t);return{...t,layer:t.layer??Wi(t.file),topology_type:t.topology_type??qi(t.file),stable_id:e,identity_source:a}}function ir(t){const e=qt(t);return e==="AGENTS.md"||e===".fabric/bootstrap/README.md"?"bootstrap":nr(e).replace(/\.md$/u,"")}function Bi(t){if(t.identity_source!==void 0)return t.identity_source;const e=ir(t.file);return t.stable_id!==void 0&&t.stable_id!==e?"declared":"derived"}function Wi(t){const e=qt(t);if(e==="AGENTS.md"||e===".fabric/bootstrap/README.md")return"L0";if(sr(e))return"L1";const a=nr(e),r=Xi(a);return r===0?"L0":r<=2?"L1":"L2"}function qi(t){return sr(qt(t))?"cross-cutting":"mirror"}function nr(t){return t.startsWith(_a)?t.slice(_a.length):t}function Xi(t){const e=t.split("/").filter(Boolean);return Math.max(e.length-1,0)}function sr(t){return t.split("/").includes("_cross")}function qt(t){return t.replaceAll("\\","/")}function Yi(t){return typeof t=="object"&&t!==null}var Gi=B(["ai","human"]),or=Wt(t=>{if(!(t==null||t==="")){if(typeof t=="number")return t;if(typeof t=="string"){const e=t.trim();if(e.length===0)return;if(/^\d+$/.test(e))return Number.parseInt(e,10);const a=Date.parse(e);return Number.isNaN(a)?t:a}return t}},V().int().nonnegative());A({source:Gi.optional(),since:or.optional()});A({ledger_id:f().trim().min(1).optional(),ts:or.optional()}).superRefine((t,e)=>{[t.ledger_id,t.ts].filter(r=>r!==void 0).length!==1&&e.addIssue({code:m.custom,message:"Provide exactly one of ledger_id or ts.",path:["ledger_id"]})});A({file:f().min(1),start_line:V().int().positive(),end_line:V().int().positive(),new_hash:f().min(1)});A({file:f().min(1)});A({ledger_entry_id:f().min(1),annotation:f().trim().min(1)});var lr={id:f().optional(),ts:V().int().nonnegative(),intent:f(),affected_paths:P(f())},Ji=A({...lr,source:re("ai"),commit_sha:f().optional()}),Ki=A({...lr,source:re("human"),parent_sha:f(),parent_ledger_entry_id:f().optional(),diff_stat:f(),annotation:f().optional()}),Qi=ar("source",[Ji,Ki]),en=Wt(t=>t&&typeof t=="object"&&!Array.isArray(t)&&(!("source"in t)||t.source===void 0)?{...t,source:"human"}:t,Qi),Ie=A({file:f(),start_line:V().int().nonnegative(),end_line:V().int().nonnegative(),hash:f()});A({locked:P(Ie).optional()});var ka=B(["strict","warn","off"]),tn=A({claudeCodeCLI:f().optional(),claudeCodeDesktop:f().optional(),cursor:f().optional(),windsurf:f().optional(),rooCode:f().optional(),geminiCLI:f().optional(),codexCLI:f().optional()});A({clientPaths:tn.optional(),externalFixturePath:f().optional(),scanIgnores:P(f()).optional(),auditMode:ka.optional(),audit_mode:ka.optional()});var an=A({path:f(),lines:f(),snippet:f(),pattern_hint:f()}),rn=A({file:f(),line:f(),snippet:f()}),nn=A({ratio:V().min(0).max(1),total:V().int().nonnegative(),matched:V().int().nonnegative(),co_occurring_patterns:P(f())}),sn=A({type:B(["framework","pattern","invariant","domain"]),statement:f(),confidence:B(["HIGH","MEDIUM","LOW"]),evidence:P(rn),coverage:nn,proposed_rule:f().optional(),alternatives:P(f()).optional()}),on=A({total_files:V().int().nonnegative(),by_ext:rr(V().int().nonnegative()),key_dirs:P(f()),max_depth:V().int().nonnegative()}),ln=A({path:f(),reason:f(),size_bytes:V().int().nonnegative().optional()}),dn=A({kind:f(),version:f(),subkind:f(),evidence:P(f())}),cn=A({quality:B(["missing","stub","ok"]),line_count:V().int().nonnegative(),has_contributing:Pi()}),un=A({path:f(),family:B(["entry","component","config","test","domain"]),rationale:f()}),hn=A({max_files:re(15),max_lines_per_file:re(100)}),pn=A({version:f(),generated_at:f(),generated_by:f(),target:f(),project_name:f(),framework:dn,topology:on,entry_points:P(ln),code_samples:P(an),assertions:P(sn),candidate_files:P(un),sampling_budget:hn,readme:cn,recommendations_for_skill:P(f()).optional()}),mn=A({kind:f(),version:f(),subkind:f()}),fn=A({confidence:B(["HIGH","MEDIUM","LOW"]),evidence_refs:P(f())}),bn=A({file:f(),lines:f()}),gn=A({type:B(["ban","require","protect"]),rule:f(),rationale:f().optional(),confidence_snapshot:fn.optional(),source_evidence:P(bn).optional()}),yn=A({name:f(),paths:P(f()),summary:f().optional(),topology_type:B(["mirror","cross-cutting"]).optional(),target_path:f().optional()}),vn=A({phase:f(),question:f(),answer:f(),presentation:f().optional(),user_corrections:P(f()).optional()});A({framework:mn,architecture_patterns:P(f()),invariants:P(gn),domain_groups:P(yn),interview_trail:P(vn),forensic_ref:f()});var _n=A({type:re("meta:updated"),payload:Vi}),kn=A({type:re("lock:drift"),payload:A({locked:P(Ie),drifted:P(Ie)})}),wn=A({type:re("lock:approved"),payload:A({locked:P(Ie),approved:P(Ie)})}),xn=A({type:re("ledger:appended"),payload:en}),Nn=A({type:re("drift:detected"),payload:pn});ar("type",[_n,kn,wn,xn,Nn]);function Sn({lastEvent:t}){const{t:e}=D(),[a,r]=R(null),[i,n]=R([]),[o,l]=R(null),[c,d]=R(""),[h,u]=R(null),g=async()=>{try{const[w,x]=await Promise.all([Va(),Wa().catch(()=>[])]);r(w),n(x),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};Z(()=>{g()},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g()},[t]);const p=Y(()=>new Set(i.map(w=>w.file)),[i]),y=Y(()=>a===null?[]:dr(a,p,c),[a,p,c]),C=o===null?null:a?.nodes[o]??null;return s("section",{className:"view",children:[s(xe,{title:e("dashboard.rules-tree.title"),subtitle:e("dashboard.rules-tree.subtitle")}),h!==null?s(te,{kind:"banner",severity:"stale",message:h}):null,s("div",{className:"view-split",children:[s("div",{className:"tree-panel",children:[s("div",{className:"tree-filter",children:[s("input",{value:c,onInput:w=>d(w.currentTarget.value),placeholder:e("dashboard.rules-tree.filter.placeholder"),"aria-label":e("dashboard.rules-tree.filter.aria-label")}),s("button",{className:"ghost-button",type:"button",onClick:()=>{g()},children:e("dashboard.shared.refresh")})]}),s("div",{className:"status-line",children:[s("span",{children:a===null?e("dashboard.rules-tree.status.loading"):e("dashboard.rules-tree.status.nodes",{count:String(Object.keys(a.nodes).length),revision:a.revision})}),s("span",{children:e("dashboard.rules-tree.status.locks",{count:String(i.length)})})]}),s("div",{className:"tree",role:"tree","aria-label":e("dashboard.rules-tree.tree.aria-label"),children:y.length>0?y.map(w=>s(Ht,{...w,selected:w.node.file===o,onSelect:l},w.node.file)):s("div",{className:"empty-card",children:e("dashboard.rules-tree.empty")})})]}),s("aside",{className:"detail-panel",children:[s("h3",{children:e("dashboard.rules-tree.detail.title")}),C===null?s("p",{className:"muted",children:e("dashboard.rules-tree.detail.empty")}):s("div",{className:"kv",children:[s(Oe,{label:e("dashboard.rules-tree.detail.file"),value:C.file}),s(Oe,{label:e("dashboard.rules-tree.detail.scope"),value:C.scope_glob}),s(Oe,{label:e("dashboard.rules-tree.detail.priority"),value:C.priority}),s(Oe,{label:e("dashboard.rules-tree.detail.hash"),value:C.hash}),s("pre",{className:"code",children:C.deps.length>0?C.deps.join(`
|
|
14
|
+
`):e("dashboard.rules-tree.detail.no-deps")})]})]})]})]})}function xe({title:t,subtitle:e}){return s("div",{className:"view-header",children:s("div",{children:[s("h1",{className:"view-title",children:t}),s("p",{className:"view-subtitle",children:e})]})})}function Oe({label:t,value:e}){return s("div",{className:"kv-row",children:[s("span",{className:"kv-key",children:t}),s("span",{className:"kv-value",children:e})]})}function dr(t,e,a){const r=a.trim().toLowerCase(),i=Object.values(t.nodes).filter(l=>r.length===0||JSON.stringify(l).toLowerCase().includes(r)).sort((l,c)=>l.file.localeCompare(c.file)),n=new Map;for(const l of i){const c=l.file.split("/")[0]??"root";n.set(c,[...n.get(c)??[],l])}return[{node:$t({file:`revision:${t.revision}`,scope_glob:"**/*",deps:[],priority:"high",hash:t.revision}),level:0,defaultExpanded:!0,children:Array.from(n.entries()).map(([l,c])=>({node:$t({file:l,scope_glob:`${l}/**/*`,deps:[],priority:"medium",hash:`${c.length} nodes`}),level:1,defaultExpanded:!0,children:c.map(d=>({node:d,level:2,humanLockedNearby:e.has(d.file),staleReason:d.hash.length===0?"hash-mismatch":null}))}))}]}function Cn({lastEvent:t}){const{locale:e,t:a}=D(),[r,i]=R(null),[n,o]=R(!0),[l,c]=R(null),d=async()=>{o(!0);try{i(await Ir()),c(null)}catch(h){c(h instanceof Error?h.message:String(h))}finally{o(!1)}};return Z(()=>{d()},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="lock:approved"||t?.type==="lock:drift"||t?.type==="ledger:appended"||t?.type==="drift:detected")&&d()},[t]),s("section",{className:"view",children:[s(xe,{title:a("dashboard.doctor.title"),subtitle:a("dashboard.doctor.subtitle")}),l!==null?s(te,{kind:"banner",severity:"stale",message:l}):null,s("div",{className:"filter-bar doctor-toolbar",children:[s("span",{className:"filter-label",children:a("dashboard.doctor.toolbar.overall")}),s(te,{kind:"pill",severity:cr(r?.status??"warn"),message:a(r===null?"dashboard.shared.loading":`dashboard.shared.status.${r.status}`)}),s("span",{className:"filter-date",children:r===null?a("dashboard.doctor.toolbar.no-summary"):r.summary.entryPoints.length===1?a("dashboard.doctor.toolbar.entry-point-summary",{framework:gt(r.summary.framework,a),count:"1"}):a("dashboard.doctor.toolbar.entry-points-summary",{framework:gt(r.summary.framework,a),count:String(r.summary.entryPoints.length)})}),s("button",{className:"ghost-button",type:"button",onClick:()=>{d()},children:a("dashboard.shared.refresh")})]}),n&&r===null?s("div",{className:"empty-card",children:a("dashboard.doctor.empty.loading")}):null,r!==null?s("div",{className:"doctor-layout",children:[s("div",{className:"doctor-summary-grid",children:[s(bt,{label:a("dashboard.doctor.summary.framework"),value:gt(r.summary.framework,a),detail:r.summary.metaRevision===null?a("dashboard.doctor.summary.no-meta-revision"):`rev ${r.summary.metaRevision}`}),s(bt,{label:a("dashboard.doctor.summary.protected-paths"),value:r.summary.protectedPathCount===0?a("dashboard.doctor.summary.tracked-paths.none"):a("dashboard.doctor.summary.tracked-paths.some",{count:String(r.summary.protectedPathCount)}),detail:r.summary.protectedPathsIntact?a("dashboard.doctor.summary.hashes-intact"):a("dashboard.doctor.summary.drifted",{count:String(r.summary.driftCount)})}),s(bt,{label:a("dashboard.doctor.summary.intent-ledger"),value:An(r.summary.lastLedgerEntryAgeMs,a),detail:r.summary.lastLedgerEntryTs===null?a("dashboard.doctor.summary.no-ledger-entries"):new Date(r.summary.lastLedgerEntryTs).toLocaleString(e)})]}),s("div",{className:"doctor-panels",children:[s("article",{className:"doctor-card",children:[s("div",{className:"doctor-card-head",children:[s("h3",{children:a("dashboard.doctor.card.entry-points")}),s("span",{children:r.summary.entryPoints.length})]}),r.summary.entryPoints.length>0?s("div",{className:"doctor-entry-list",children:r.summary.entryPoints.map(h=>s("div",{className:"doctor-entry",children:[s("strong",{children:h.path}),s("span",{children:h.reason})]},`${h.path}:${h.reason}`))}):s("div",{className:"empty-card doctor-empty",children:a("dashboard.doctor.empty.entry-points")})]}),s("article",{className:"doctor-card",children:[s("div",{className:"doctor-card-head",children:[s("h3",{children:a("dashboard.doctor.card.checks")}),s("span",{children:r.checks.length})]}),s("div",{className:"doctor-check-list",children:r.checks.map(h=>s(Tn,{check:h},h.name))})]})]})]}):null]})}function bt({label:t,value:e,detail:a}){return s("article",{className:"doctor-summary-card",children:[s("span",{className:"doctor-summary-label",children:t}),s("strong",{className:"doctor-summary-value",children:e}),s("span",{className:"doctor-summary-detail",children:a})]})}function Tn({check:t}){const{t:e}=D();return s("div",{className:`doctor-check doctor-check-${t.status}`,children:[s("div",{className:"doctor-check-head",children:[s("strong",{children:t.name}),s(te,{kind:"pill",severity:cr(t.status),message:e(`dashboard.shared.status.${t.status}`)})]}),s("p",{children:t.message})]})}function cr(t){switch(t){case"ok":return"ok";case"warn":return"locked";case"error":return"stale"}}function gt(t,e){const a=[t.kind,t.version,t.subkind].filter(r=>r!=="unknown");return a.length>0?a.join(" · "):e("dashboard.doctor.framework.unknown")}function An(t,e){if(t===null)return e("dashboard.doctor.age.none");const a=Math.floor(t/1e3);if(a<60)return e("dashboard.doctor.age.seconds",{count:String(a)});const r=Math.floor(a/60);if(r<60)return e("dashboard.doctor.age.minutes",{count:String(r)});const i=Math.floor(r/60);if(i<48)return e("dashboard.doctor.age.hours",{count:String(i)});const n=Math.floor(i/24);return n<14?e("dashboard.doctor.age.days",{count:String(n)}):e("dashboard.doctor.age.weeks",{count:String(Math.floor(n/7))})}function En({lastEvent:t}){const{locale:e,t:a}=D(),[r,i]=R([]),[n,o]=R(null),[l,c]=R(null),[d,h]=R(!1),[u,g]=R(null),p=async()=>{try{const _=(await Ba()).sort((O,H)=>O.ts-H.ts);i(_),o(O=>_.length===0?null:O!==null&&_.some(H=>H.id===O)?O:_.at(-1)?.id??null),g(null)}catch(_){g(_ instanceof Error?_.message:String(_))}};Z(()=>{p()},[]),Z(()=>{t?.type==="ledger:appended"&&p()},[t]),Z(()=>{if(n===null){c(null);return}let _=!1;return h(!0),Lr({ledgerId:n}).then(O=>{_||(c(O),g(null))}).catch(O=>{_||(c(null),g(O instanceof Error?O.message:String(O)))}).finally(()=>{_||h(!1)}),()=>{_=!0}},[n]);const y=Y(()=>r.findIndex(_=>_.id===n),[r,n]),C=y>=0?r[y]??null:null,w=C===null?a("dashboard.history-replay.selected.none"):new Date(C.ts).toLocaleString(e),x=Y(()=>l===null?[]:dr(l.meta,new Set,""),[l]);return s("section",{className:"view",children:[s(xe,{title:a("dashboard.history-replay.title"),subtitle:a("dashboard.history-replay.subtitle")}),u!==null?s(te,{kind:"banner",severity:"stale",message:u}):null,s("div",{className:"filter-bar history-toolbar",children:[s("span",{className:"filter-label",children:a("dashboard.history-replay.toolbar.scrub")}),s("input",{className:"history-slider",type:"range",min:"0",max:Math.max(r.length-1,0),value:y>=0?y:0,disabled:r.length===0,onInput:_=>{const O=Number.parseInt(_.currentTarget.value,10),H=r[O];H?.id!==void 0&&o(H.id)}}),s("span",{className:"filter-date",children:w}),s("button",{className:"ghost-button",type:"button",disabled:r.length===0,onClick:()=>o(r.at(-1)?.id??null),children:a("dashboard.history-replay.toolbar.latest")})]}),s("div",{className:"view-split history-layout",children:[s("div",{className:"tree-panel history-timeline-panel",children:[s("div",{className:"status-line",children:[s("span",{children:a("dashboard.history-replay.status.replay-points",{count:String(r.length)})}),s("span",{children:a("dashboard.history-replay.status.entries-applied",{count:String(l?.metadata.replayed_count??0)})})]}),s("div",{className:"history-timeline-list",children:r.length>0?[...r].reverse().map(_=>s("div",{className:`history-timeline-item ${_.id===n?"selected":""}`,role:"button",tabIndex:0,onClick:()=>o(_.id??null),onKeyDown:O=>{(O.key==="Enter"||O.key===" ")&&(O.preventDefault(),o(_.id??null))},children:s(Ja,{entry:_,readOnly:!0})},_.id??`${_.source}:${_.ts}:${_.intent}`)):s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.entries")})})]}),s("div",{className:"tree-panel",children:[s("div",{className:"tree-filter history-state-head",children:s("div",{children:[s("div",{className:"history-state-title",children:a("dashboard.history-replay.state.title",{label:w})}),s("div",{className:"meta-line",children:a("dashboard.history-replay.state.meta",{ledgerId:l?.metadata.at_ledger_id??a("dashboard.history-replay.meta.na"),commit:l?.metadata.at_commit??a("dashboard.history-replay.meta.not-available"),mode:l?.metadata.mode??a("dashboard.history-replay.meta.pending")})})]})}),s("div",{className:"status-line",children:[s("span",{children:l===null?a("dashboard.history-replay.status.loading"):a("dashboard.history-replay.status.nodes",{count:String(Object.keys(l.meta.nodes).length)})}),s("span",{children:l?.meta.revision??a("dashboard.history-replay.status.unknown-revision")})]}),s("div",{className:"tree",role:"tree","aria-label":a("dashboard.history-replay.tree.aria-label"),children:[d?s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.loading")}):null,!d&&x.length>0?x.map(_=>s(Ht,{..._,readOnly:!0},_.node.file)):null,!d&&x.length===0?s("div",{className:"empty-card",children:a("dashboard.history-replay.empty.select")}):null]})]})]})]})}function In({lastEvent:t}){const{t:e}=D(),[a,r]=R([]),[i,n]=R("all"),[o,l]=R(null),[c,d]=R(null),h=async()=>{try{r(await Wa()),d(null)}catch(y){d(y instanceof Error?y.message:String(y))}};Z(()=>{h()},[]),Z(()=>{(t?.type==="lock:drift"||t?.type==="lock:approved")&&h()},[t]);const u=Y(()=>({all:a.length,drift:a.filter(y=>y.drift).length,approved:a.filter(y=>!y.drift).length}),[a]),g=a.filter(y=>i==="all"||(i==="drift"?y.drift:!y.drift)),p=async y=>{const C=a.find(w=>de(w)===de(y));if(C!==void 0){l(de(y));try{const w=await Rr({file:C.file,start_line:C.start_line,end_line:C.end_line,new_hash:C.current_hash});r(x=>x.map(_=>de(_)===de(y)?w.entry:_)),d(null)}catch(w){throw d(w instanceof Error?w.message:String(w)),w}finally{l(null)}}};return s("section",{className:"view",children:[s(xe,{title:e("dashboard.human-lock.title"),subtitle:e("dashboard.human-lock.subtitle")}),c!==null?s(te,{kind:"banner",severity:"drift",message:c}):null,s("div",{className:"filter-bar",role:"tablist","aria-label":e("dashboard.human-lock.filters.aria-label"),children:[["all","drift","approved"].map(y=>s("button",{className:`filter-chip ${i===y?"active":""} ${y}`,type:"button",role:"tab","aria-selected":i===y,onClick:()=>n(y),children:[e(`dashboard.human-lock.filters.${y}`),s("span",{className:"count",children:u[y]})]},y)),s("span",{className:"filter-date",children:e("dashboard.human-lock.summary",{drift:String(u.drift),approved:String(u.approved)})})]}),s("div",{className:"lock-grid",children:g.length>0?g.map(y=>s(si,{entry:y,currentHash:y.current_hash,onApprove:p,busy:o===de(y)},de(y))):s("div",{className:"empty-card",children:e("dashboard.human-lock.empty")})})]})}function de(t){return`${t.file}:${t.start_line}:${t.end_line}`}function Rn({lastEvent:t}){const{t:e}=D(),[a,r]=R([]),[i,n]=R("all"),[o,l]=R(null),c=async()=>{try{r((await Ba()).sort((p,y)=>y.ts-p.ts)),l(null)}catch(p){l(p instanceof Error?p.message:String(p))}};Z(()=>{c()},[]),Z(()=>{t?.type==="ledger:appended"&&r(p=>[t.payload,...p].sort((y,C)=>C.ts-y.ts))},[t]);const d=Y(()=>a.filter(p=>i==="all"||p.source===i),[a,i]),h=a.filter(p=>p.source==="ai").length,u=a.length-h,g=async(p,y)=>{if(p.id===void 0)throw new Error(e("dashboard.intent-timeline.annotate.missing-id"));const C=await $r({ledger_entry_id:p.id,annotation:y});C.created&&r(w=>[C.entry,...w].sort((x,_)=>_.ts-x.ts))};return s("section",{className:"view",children:[s(xe,{title:e("dashboard.intent-timeline.title"),subtitle:e("dashboard.intent-timeline.subtitle")}),o!==null?s("div",{className:"empty-card",children:o}):null,s("div",{className:"filter-bar",children:[s("span",{className:"filter-label",children:e("dashboard.intent-timeline.filter.label")}),s("button",{className:`filter-chip ${i==="all"?"active":""}`,type:"button",onClick:()=>n("all"),children:[e("dashboard.intent-timeline.filter.all")," ",a.length]}),s(Nt,{source:"ai",interactive:!0,selected:i==="ai",onClick:()=>n("ai")}),s(Nt,{source:"human",interactive:!0,selected:i==="human",onClick:()=>n("human")}),s("span",{className:"filter-date",children:e("dashboard.intent-timeline.summary",{aiCount:String(h),humanCount:String(u)})})]}),s("div",{className:"col-headers",children:[s("div",{className:"col-head ai",children:[s("strong",{children:e("dashboard.intent-timeline.columns.ai.title")}),s("span",{children:e("dashboard.intent-timeline.columns.ai.entries",{count:String(h)})})]}),s("div",{className:"col-head human",children:[s("strong",{children:e("dashboard.intent-timeline.columns.human.title")}),s("span",{children:e("dashboard.intent-timeline.columns.human.entries",{count:String(u)})})]})]}),s("div",{className:"timeline-grid",children:[s("div",{className:"axis",children:s("div",{className:"axis-line"})}),d.length>0?d.map(p=>s(Ja,{entry:p,onAnnotate:g},p.id??`${p.source}:${p.ts}:${p.intent}`)):s("div",{className:"empty-card timeline-empty",children:e("dashboard.intent-timeline.empty")})]})]})}const Pe="packages/dashboard/src/views/rule-topology.tsx";function $n({lastEvent:t}){const{t:e}=D(),[a,r]=R(null),[i,n]=R(null),[o,l]=R(Pe),[c,d]=R(Pe),[h,u]=R(null),g=async C=>{try{const[w,x]=await Promise.all([Va(),Er(C)]);r(w),n(x),d(C),u(null)}catch(w){u(w instanceof Error?w.message:String(w))}};Z(()=>{g(Pe)},[]),Z(()=>{(t?.type==="meta:updated"||t?.type==="drift:detected"||t?.type==="lock:drift")&&g(c)},[c,t]);const p=Y(()=>a===null?[]:Object.values(a.nodes),[a]),y=(i?.L1.length??0)+(i?.L2.length??0)+(i?.description_stubs?.length??0);return s("section",{className:"view",children:[s(xe,{title:e("dashboard.rule-topology.title"),subtitle:e("dashboard.rule-topology.subtitle")}),h!==null?s(te,{kind:"banner",severity:"stale",message:h}):null,s("div",{className:"tree-filter topology-toolbar",children:[s("input",{value:o,onInput:C=>l(C.currentTarget.value),placeholder:e("dashboard.rule-topology.path.placeholder"),"aria-label":e("dashboard.rule-topology.path.aria-label")}),s("button",{className:"ghost-button",type:"button",onClick:()=>{g(o.trim().length>0?o.trim():Pe)},children:e("dashboard.shared.refresh")})]}),s("div",{className:"status-line topology-status",children:[s("span",{children:e("dashboard.rule-topology.status.sample",{path:c})}),s("span",{children:e("dashboard.rule-topology.status.hits",{count:String(y)})}),s("span",{children:a===null?e("dashboard.shared.loading"):e("dashboard.rule-topology.status.revision",{revision:a.revision})})]}),s("div",{className:"view-split topology-split",children:[s(Kr,{nodes:p}),s(ii,{meta:a,rulesContext:i})]})]})}function Ln(){return s(Jr,{children:s(On,{})})}function On(){const{t}=D(),[e,a]=R(wa()),r=Hr(),i=[{id:"topology",hash:"#/topology",label:t("dashboard.app.nav.module-a.label-bilingual"),subtitle:t("dashboard.app.nav.module-a.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.topology")},{id:"forensic",hash:"#/forensic",label:t("dashboard.app.nav.module-b.label-bilingual"),subtitle:t("dashboard.app.nav.module-b.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.forensic")},{id:"semantic",hash:"#/semantic",label:t("dashboard.app.nav.module-c.label-bilingual"),subtitle:t("dashboard.app.nav.module-c.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.semantic")},{id:"ledger",hash:"#/ledger",label:t("dashboard.app.nav.module-d.label-bilingual"),subtitle:t("dashboard.app.nav.module-d.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.ledger")}],n=[{id:"rules",hash:"#/rules",label:t("dashboard.app.nav.rules.label-bilingual"),subtitle:t("dashboard.app.nav.rules.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.rules")},{id:"locks",hash:"#/locks",label:t("dashboard.app.nav.locks.label-bilingual"),subtitle:t("dashboard.app.nav.locks.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.locks")},{id:"timeline",hash:"#/timeline",label:t("dashboard.app.nav.timeline.label-bilingual"),subtitle:t("dashboard.app.nav.timeline.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.timeline")},{id:"history",hash:"#/history",label:t("dashboard.app.nav.history.label-bilingual"),subtitle:t("dashboard.app.nav.history.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.history")},{id:"doctor",hash:"#/doctor",label:t("dashboard.app.nav.doctor.label-bilingual"),subtitle:t("dashboard.app.nav.doctor.subtitle"),breadcrumb:t("dashboard.app.breadcrumb.doctor")}];Z(()=>{const l=()=>a(wa());return window.addEventListener("hashchange",l),window.location.hash===""&&(window.location.hash="#/topology"),()=>window.removeEventListener("hashchange",l)},[]);const o=Y(()=>[...i,...n].find(l=>l.id===e)??i[0],[n,i,e]);return s(Pn,{connected:r.connected,port:xa(),activeRoute:o.id,children:[s("aside",{className:"sidebar",children:[s("div",{className:"brand",children:[s("span",{className:"brand-logo",children:"F"}),s("span",{children:"fabric"}),s("span",{className:"brand-version",children:"v1.5.2"})]}),s("nav",{"aria-label":t("dashboard.app.nav.aria-label"),children:i.map(l=>s("a",{className:`nav-item ${l.id===e?"active":""}`,href:l.hash,"aria-current":l.id===e?"page":void 0,children:[s("span",{className:"dot","aria-hidden":"true"}),s("span",{children:l.label}),s("small",{children:l.subtitle})]},l.id))}),s("div",{className:"nav-section",children:t("dashboard.app.nav.section.modules-status")}),s("span",{className:"nav-item muted-nav",children:[s("span",{className:"dot"}),t("dashboard.app.nav.modules.read-only")]}),s("div",{className:"nav-section",children:t("dashboard.app.nav.section.diagnostics")}),n.map(l=>s("a",{className:`nav-item ${l.id===e?"active":""}`,href:l.hash,"aria-current":l.id===e?"page":void 0,children:[s("span",{className:"dot","aria-hidden":"true"}),s("span",{children:l.label}),s("small",{children:l.subtitle})]},l.id)),s("span",{className:"nav-item muted-nav",children:[s("span",{className:"dot"}),t("dashboard.app.nav.drift-check")]})]}),s("main",{className:"main",children:[s("header",{className:"header",children:[s("div",{className:"breadcrumb",children:[s("span",{children:window.location.pathname==="/"?"~":window.location.pathname}),s("span",{className:"sep",children:"/"}),s("strong",{children:o.breadcrumb})]}),s("div",{className:"header-actions",children:[s("span",{className:`badge-live ${r.connected?"connected":"disconnected"}`,children:[s("span",{className:"pulse","aria-hidden":"true"}),r.connected?t("dashboard.app.header.connected"):t("dashboard.app.header.connecting")]}),s("span",{className:"port-label",children:[":",xa()," /events"]})]})]}),e==="topology"?s($n,{lastEvent:r.lastEvent}):null,e==="forensic"?s(yt,{title:t("dashboard.module-placeholder.forensic.title"),subtitle:t("dashboard.module-placeholder.forensic.subtitle")}):null,e==="semantic"?s(yt,{title:t("dashboard.module-placeholder.semantic.title"),subtitle:t("dashboard.module-placeholder.semantic.subtitle")}):null,e==="ledger"?s(yt,{title:t("dashboard.module-placeholder.ledger.title"),subtitle:t("dashboard.module-placeholder.ledger.subtitle")}):null,e==="rules"?s(Sn,{lastEvent:r.lastEvent}):null,e==="locks"?s(In,{lastEvent:r.lastEvent}):null,e==="timeline"?s(Rn,{lastEvent:r.lastEvent}):null,e==="history"?s(En,{lastEvent:r.lastEvent}):null,e==="doctor"?s(Cn,{lastEvent:r.lastEvent}):null]}),s("div",{className:"live-region","aria-live":"polite","aria-atomic":"true",children:r.lastEvent===null?"":t("dashboard.app.live-region.received",{type:r.lastEvent.type})})]})}function yt({title:t,subtitle:e}){const{t:a}=D();return s("section",{className:"view",children:[s("div",{className:"view-header",children:s("div",{children:[s("h1",{className:"view-title",children:t}),s("p",{className:"view-subtitle",children:e})]})}),s("div",{className:"empty-card module-placeholder",children:[s("strong",{children:a("dashboard.module-placeholder.coming-soon")}),s("p",{children:a("dashboard.module-placeholder.read-only")})]})]})}function Pn({connected:t,port:e,activeRoute:a,children:r}){return s("div",{className:`app-shell ${t?"is-connected":"is-disconnected"}`,"data-port":e,"data-route":a,children:r})}function wa(){switch(window.location.hash){case"#/topology":return"topology";case"#/forensic":return"forensic";case"#/semantic":return"semantic";case"#/ledger":return"ledger";case"#/locks":return"locks";case"#/timeline":return"timeline";case"#/history":return"history";case"#/doctor":return"doctor";case"#/rules":return"rules";default:return"topology"}}function xa(){const t=Number.parseInt(window.location.port,10);return Number.isFinite(t)?t:7373}const ur=document.getElementById("app");if(ur===null)throw new Error("Fabric Dashboard root element #app was not found.");vr(s(Ln,{}),ur);
|