opalserve 3.0.1 → 3.1.0
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/LICENSE +21 -21
- package/README.md +568 -545
- package/assets/logo.svg +51 -51
- package/dist/cli/commands/admin.js +6 -6
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +9 -2
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui/banner.d.ts.map +1 -1
- package/dist/cli/ui/banner.js +15 -14
- package/dist/cli/ui/banner.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/core/server-manager.d.ts.map +1 -1
- package/dist/core/server-manager.js +2 -1
- package/dist/core/server-manager.js.map +1 -1
- package/dist/dashboard/assets/charts-CKTlvUso.js +68 -0
- package/dist/dashboard/assets/icons-DciuKSzL.js +131 -0
- package/dist/dashboard/assets/index-BrOv-3xx.css +1 -0
- package/dist/dashboard/assets/index-DnqqzxX6.js +33 -0
- package/dist/dashboard/assets/react-BJczIp53.js +28 -0
- package/dist/dashboard/index.html +17 -14
- package/dist/integrations/github.js +3 -3
- package/dist/integrations/slack.js +1 -1
- package/dist/monitoring/tracker.js +13 -13
- package/dist/server/mcp-gateway.d.ts.map +1 -1
- package/dist/server/mcp-gateway.js +2 -1
- package/dist/server/mcp-gateway.js.map +1 -1
- package/dist/server/routes/context.js +1 -1
- package/dist/server/routes/health.d.ts.map +1 -1
- package/dist/server/routes/health.js +2 -1
- package/dist/server/routes/health.js.map +1 -1
- package/dist/server/routes/stats.js +6 -6
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +132 -129
- package/dist/storage/database.js.map +1 -1
- package/package.json +91 -91
- package/dist/dashboard/assets/index-BNOtcUPs.js +0 -257
- package/dist/dashboard/assets/index-Duwp34GW.css +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var qr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ct(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var he={exports:{}},E={};/**
|
|
2
|
+
* @license React
|
|
3
|
+
* react.production.js
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/var Le;function ft(){if(Le)return E;Le=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),u=Symbol.for("react.consumer"),s=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),o=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),y=Symbol.iterator;function R(i){return i===null||typeof i!="object"?null:(i=y&&i[y]||i["@@iterator"],typeof i=="function"?i:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,g={};function m(i,p,S){this.props=i,this.context=p,this.refs=g,this.updater=S||C}m.prototype.isReactComponent={},m.prototype.setState=function(i,p){if(typeof i!="object"&&typeof i!="function"&&i!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,i,p,"setState")},m.prototype.forceUpdate=function(i){this.updater.enqueueForceUpdate(this,i,"forceUpdate")};function _(){}_.prototype=m.prototype;function x(i,p,S){this.props=i,this.context=p,this.refs=g,this.updater=S||C}var $=x.prototype=new _;$.constructor=x,v($,m.prototype),$.isPureReactComponent=!0;var O=Array.isArray;function D(){}var b={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function W(i,p,S){var w=S.ref;return{$$typeof:e,type:i,key:p,ref:w!==void 0?w:null,props:S}}function J(i,p){return W(i.type,p,i.props)}function X(i){return typeof i=="object"&&i!==null&&i.$$typeof===e}function de(i){var p={"=":"=0",":":"=2"};return"$"+i.replace(/[=:]/g,function(S){return p[S]})}var Q=/\/+/g;function z(i,p){return typeof i=="object"&&i!==null&&i.key!=null?de(""+i.key):p.toString(36)}function H(i){switch(i.status){case"fulfilled":return i.value;case"rejected":throw i.reason;default:switch(typeof i.status=="string"?i.then(D,D):(i.status="pending",i.then(function(p){i.status==="pending"&&(i.status="fulfilled",i.value=p)},function(p){i.status==="pending"&&(i.status="rejected",i.reason=p)})),i.status){case"fulfilled":return i.value;case"rejected":throw i.reason}}throw i}function G(i,p,S,w,P){var T=typeof i;(T==="undefined"||T==="boolean")&&(i=null);var L=!1;if(i===null)L=!0;else switch(T){case"bigint":case"string":case"number":L=!0;break;case"object":switch(i.$$typeof){case e:case t:L=!0;break;case d:return L=i._init,G(L(i._payload),p,S,w,P)}}if(L)return P=P(i),L=w===""?"."+z(i,0):w,O(P)?(S="",L!=null&&(S=L.replace(Q,"$&/")+"/"),G(P,p,S,"",function(st){return st})):P!=null&&(X(P)&&(P=J(P,S+(P.key==null||i&&i.key===P.key?"":(""+P.key).replace(Q,"$&/")+"/")+L)),p.push(P)),1;L=0;var U=w===""?".":w+":";if(O(i))for(var N=0;N<i.length;N++)w=i[N],T=U+z(w,N),L+=G(w,p,S,T,P);else if(N=R(i),typeof N=="function")for(i=N.call(i),N=0;!(w=i.next()).done;)w=w.value,T=U+z(w,N++),L+=G(w,p,S,T,P);else if(T==="object"){if(typeof i.then=="function")return G(H(i),p,S,w,P);throw p=String(i),Error("Objects are not valid as a React child (found: "+(p==="[object Object]"?"object with keys {"+Object.keys(i).join(", ")+"}":p)+"). If you meant to render a collection of children, use an array instead.")}return L}function ae(i,p,S){if(i==null)return i;var w=[],P=0;return G(i,w,"","",function(T){return p.call(S,T,P++)}),w}function ut(i){if(i._status===-1){var p=i._result;p=p(),p.then(function(S){(i._status===0||i._status===-1)&&(i._status=1,i._result=S)},function(S){(i._status===0||i._status===-1)&&(i._status=2,i._result=S)}),i._status===-1&&(i._status=0,i._result=p)}if(i._status===1)return i._result.default;throw i._result}var Te=typeof reportError=="function"?reportError:function(i){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var p=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof i=="object"&&i!==null&&typeof i.message=="string"?String(i.message):String(i),error:i});if(!window.dispatchEvent(p))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",i);return}console.error(i)},lt={map:ae,forEach:function(i,p,S){ae(i,function(){p.apply(this,arguments)},S)},count:function(i){var p=0;return ae(i,function(){p++}),p},toArray:function(i){return ae(i,function(p){return p})||[]},only:function(i){if(!X(i))throw Error("React.Children.only expected to receive a single React element child.");return i}};return E.Activity=h,E.Children=lt,E.Component=m,E.Fragment=n,E.Profiler=a,E.PureComponent=x,E.StrictMode=r,E.Suspense=l,E.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=b,E.__COMPILER_RUNTIME={__proto__:null,c:function(i){return b.H.useMemoCache(i)}},E.cache=function(i){return function(){return i.apply(null,arguments)}},E.cacheSignal=function(){return null},E.cloneElement=function(i,p,S){if(i==null)throw Error("The argument must be a React element, but you passed "+i+".");var w=v({},i.props),P=i.key;if(p!=null)for(T in p.key!==void 0&&(P=""+p.key),p)!j.call(p,T)||T==="key"||T==="__self"||T==="__source"||T==="ref"&&p.ref===void 0||(w[T]=p[T]);var T=arguments.length-2;if(T===1)w.children=S;else if(1<T){for(var L=Array(T),U=0;U<T;U++)L[U]=arguments[U+2];w.children=L}return W(i.type,P,w)},E.createContext=function(i){return i={$$typeof:s,_currentValue:i,_currentValue2:i,_threadCount:0,Provider:null,Consumer:null},i.Provider=i,i.Consumer={$$typeof:u,_context:i},i},E.createElement=function(i,p,S){var w,P={},T=null;if(p!=null)for(w in p.key!==void 0&&(T=""+p.key),p)j.call(p,w)&&w!=="key"&&w!=="__self"&&w!=="__source"&&(P[w]=p[w]);var L=arguments.length-2;if(L===1)P.children=S;else if(1<L){for(var U=Array(L),N=0;N<L;N++)U[N]=arguments[N+2];P.children=U}if(i&&i.defaultProps)for(w in L=i.defaultProps,L)P[w]===void 0&&(P[w]=L[w]);return W(i,T,P)},E.createRef=function(){return{current:null}},E.forwardRef=function(i){return{$$typeof:f,render:i}},E.isValidElement=X,E.lazy=function(i){return{$$typeof:d,_payload:{_status:-1,_result:i},_init:ut}},E.memo=function(i,p){return{$$typeof:o,type:i,compare:p===void 0?null:p}},E.startTransition=function(i){var p=b.T,S={};b.T=S;try{var w=i(),P=b.S;P!==null&&P(S,w),typeof w=="object"&&w!==null&&typeof w.then=="function"&&w.then(D,Te)}catch(T){Te(T)}finally{p!==null&&S.types!==null&&(p.types=S.types),b.T=p}},E.unstable_useCacheRefresh=function(){return b.H.useCacheRefresh()},E.use=function(i){return b.H.use(i)},E.useActionState=function(i,p,S){return b.H.useActionState(i,p,S)},E.useCallback=function(i,p){return b.H.useCallback(i,p)},E.useContext=function(i){return b.H.useContext(i)},E.useDebugValue=function(){},E.useDeferredValue=function(i,p){return b.H.useDeferredValue(i,p)},E.useEffect=function(i,p){return b.H.useEffect(i,p)},E.useEffectEvent=function(i){return b.H.useEffectEvent(i)},E.useId=function(){return b.H.useId()},E.useImperativeHandle=function(i,p,S){return b.H.useImperativeHandle(i,p,S)},E.useInsertionEffect=function(i,p){return b.H.useInsertionEffect(i,p)},E.useLayoutEffect=function(i,p){return b.H.useLayoutEffect(i,p)},E.useMemo=function(i,p){return b.H.useMemo(i,p)},E.useOptimistic=function(i,p){return b.H.useOptimistic(i,p)},E.useReducer=function(i,p,S){return b.H.useReducer(i,p,S)},E.useRef=function(i){return b.H.useRef(i)},E.useState=function(i){return b.H.useState(i)},E.useSyncExternalStore=function(i,p,S){return b.H.useSyncExternalStore(i,p,S)},E.useTransition=function(){return b.H.useTransition()},E.version="19.2.5",E}var ke;function Fe(){return ke||(ke=1,he.exports=ft()),he.exports}var c=Fe();const zr=ct(c);var pe={exports:{}},A={};/**
|
|
10
|
+
* @license React
|
|
11
|
+
* react-dom.production.js
|
|
12
|
+
*
|
|
13
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the MIT license found in the
|
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
|
17
|
+
*/var Oe;function dt(){if(Oe)return A;Oe=1;var e=Fe();function t(l){var o="https://react.dev/errors/"+l;if(1<arguments.length){o+="?args[]="+encodeURIComponent(arguments[1]);for(var d=2;d<arguments.length;d++)o+="&args[]="+encodeURIComponent(arguments[d])}return"Minified React error #"+l+"; visit "+o+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function n(){}var r={d:{f:n,r:function(){throw Error(t(522))},D:n,C:n,L:n,m:n,X:n,S:n,M:n},p:0,findDOMNode:null},a=Symbol.for("react.portal");function u(l,o,d){var h=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:a,key:h==null?null:""+h,children:l,containerInfo:o,implementation:d}}var s=e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function f(l,o){if(l==="font")return"";if(typeof o=="string")return o==="use-credentials"?o:""}return A.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=r,A.createPortal=function(l,o){var d=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!o||o.nodeType!==1&&o.nodeType!==9&&o.nodeType!==11)throw Error(t(299));return u(l,o,null,d)},A.flushSync=function(l){var o=s.T,d=r.p;try{if(s.T=null,r.p=2,l)return l()}finally{s.T=o,r.p=d,r.d.f()}},A.preconnect=function(l,o){typeof l=="string"&&(o?(o=o.crossOrigin,o=typeof o=="string"?o==="use-credentials"?o:"":void 0):o=null,r.d.C(l,o))},A.prefetchDNS=function(l){typeof l=="string"&&r.d.D(l)},A.preinit=function(l,o){if(typeof l=="string"&&o&&typeof o.as=="string"){var d=o.as,h=f(d,o.crossOrigin),y=typeof o.integrity=="string"?o.integrity:void 0,R=typeof o.fetchPriority=="string"?o.fetchPriority:void 0;d==="style"?r.d.S(l,typeof o.precedence=="string"?o.precedence:void 0,{crossOrigin:h,integrity:y,fetchPriority:R}):d==="script"&&r.d.X(l,{crossOrigin:h,integrity:y,fetchPriority:R,nonce:typeof o.nonce=="string"?o.nonce:void 0})}},A.preinitModule=function(l,o){if(typeof l=="string")if(typeof o=="object"&&o!==null){if(o.as==null||o.as==="script"){var d=f(o.as,o.crossOrigin);r.d.M(l,{crossOrigin:d,integrity:typeof o.integrity=="string"?o.integrity:void 0,nonce:typeof o.nonce=="string"?o.nonce:void 0})}}else o==null&&r.d.M(l)},A.preload=function(l,o){if(typeof l=="string"&&typeof o=="object"&&o!==null&&typeof o.as=="string"){var d=o.as,h=f(d,o.crossOrigin);r.d.L(l,d,{crossOrigin:h,integrity:typeof o.integrity=="string"?o.integrity:void 0,nonce:typeof o.nonce=="string"?o.nonce:void 0,type:typeof o.type=="string"?o.type:void 0,fetchPriority:typeof o.fetchPriority=="string"?o.fetchPriority:void 0,referrerPolicy:typeof o.referrerPolicy=="string"?o.referrerPolicy:void 0,imageSrcSet:typeof o.imageSrcSet=="string"?o.imageSrcSet:void 0,imageSizes:typeof o.imageSizes=="string"?o.imageSizes:void 0,media:typeof o.media=="string"?o.media:void 0})}},A.preloadModule=function(l,o){if(typeof l=="string")if(o){var d=f(o.as,o.crossOrigin);r.d.m(l,{as:typeof o.as=="string"&&o.as!=="script"?o.as:void 0,crossOrigin:d,integrity:typeof o.integrity=="string"?o.integrity:void 0})}else r.d.m(l)},A.requestFormReset=function(l){r.d.r(l)},A.unstable_batchedUpdates=function(l,o){return l(o)},A.useFormState=function(l,o,d){return s.H.useFormState(l,o,d)},A.useFormStatus=function(){return s.H.useHostTransitionStatus()},A.version="19.2.5",A}var $e;function Gr(){if($e)return pe.exports;$e=1;function e(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),pe.exports=dt(),pe.exports}/**
|
|
18
|
+
* react-router v7.14.2
|
|
19
|
+
*
|
|
20
|
+
* Copyright (c) Remix Software Inc.
|
|
21
|
+
*
|
|
22
|
+
* This source code is licensed under the MIT license found in the
|
|
23
|
+
* LICENSE.md file in the root directory of this source tree.
|
|
24
|
+
*
|
|
25
|
+
* @license MIT
|
|
26
|
+
*/var Ae="popstate";function De(e){return typeof e=="object"&&e!=null&&"pathname"in e&&"search"in e&&"hash"in e&&"state"in e&&"key"in e}function ht(e={}){function t(r,a){var o;let u=(o=a.state)==null?void 0:o.masked,{pathname:s,search:f,hash:l}=u||r.location;return ve("",{pathname:s,search:f,hash:l},a.state&&a.state.usr||null,a.state&&a.state.key||"default",u?{pathname:r.location.pathname,search:r.location.search,hash:r.location.hash}:void 0)}function n(r,a){return typeof a=="string"?a:ee(a)}return mt(t,n,null,e)}function k(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function F(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function pt(){return Math.random().toString(36).substring(2,10)}function Ne(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.unstable_mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function ve(e,t,n=null,r,a){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof t=="string"?K(t):t,state:n,key:t&&t.key||r||pt(),unstable_mask:a}}function ee({pathname:e="/",search:t="",hash:n=""}){return t&&t!=="?"&&(e+=t.charAt(0)==="?"?t:"?"+t),n&&n!=="#"&&(e+=n.charAt(0)==="#"?n:"#"+n),e}function K(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function mt(e,t,n,r={}){let{window:a=document.defaultView,v5Compat:u=!1}=r,s=a.history,f="POP",l=null,o=d();o==null&&(o=0,s.replaceState({...s.state,idx:o},""));function d(){return(s.state||{idx:null}).idx}function h(){f="POP";let g=d(),m=g==null?null:g-o;o=g,l&&l({action:f,location:v.location,delta:m})}function y(g,m){f="PUSH";let _=De(g)?g:ve(v.location,g,m);o=d()+1;let x=Ne(_,o),$=v.createHref(_.unstable_mask||_);try{s.pushState(x,"",$)}catch(O){if(O instanceof DOMException&&O.name==="DataCloneError")throw O;a.location.assign($)}u&&l&&l({action:f,location:v.location,delta:1})}function R(g,m){f="REPLACE";let _=De(g)?g:ve(v.location,g,m);o=d();let x=Ne(_,o),$=v.createHref(_.unstable_mask||_);s.replaceState(x,"",$),u&&l&&l({action:f,location:v.location,delta:0})}function C(g){return yt(g)}let v={get action(){return f},get location(){return e(a,s)},listen(g){if(l)throw new Error("A history only accepts one active listener");return a.addEventListener(Ae,h),l=g,()=>{a.removeEventListener(Ae,h),l=null}},createHref(g){return t(a,g)},createURL:C,encodeLocation(g){let m=C(g);return{pathname:m.pathname,search:m.search,hash:m.hash}},push:y,replace:R,go(g){return s.go(g)}};return v}function yt(e,t=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),k(n,"No window.location.(origin|href) available to create URL");let r=typeof e=="string"?e:ee(e);return r=r.replace(/ $/,"%20"),!t&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function Be(e,t,n="/"){return gt(e,t,n,!1)}function gt(e,t,n,r){let a=typeof t=="string"?K(t):t,u=Y(a.pathname||"/",n);if(u==null)return null;let s=je(e);vt(s);let f=null;for(let l=0;f==null&&l<s.length;++l){let o=Lt(u);f=Pt(s[l],o,r)}return f}function je(e,t=[],n=[],r="",a=!1){let u=(s,f,l=a,o)=>{let d={relativePath:o===void 0?s.path||"":o,caseSensitive:s.caseSensitive===!0,childrenIndex:f,route:s};if(d.relativePath.startsWith("/")){if(!d.relativePath.startsWith(r)&&l)return;k(d.relativePath.startsWith(r),`Absolute route path "${d.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),d.relativePath=d.relativePath.slice(r.length)}let h=M([r,d.relativePath]),y=n.concat(d);s.children&&s.children.length>0&&(k(s.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${h}".`),je(s.children,t,y,h,l)),!(s.path==null&&!s.index)&&t.push({path:h,score:xt(h,s.index),routesMeta:y})};return e.forEach((s,f)=>{var l;if(s.path===""||!((l=s.path)!=null&&l.includes("?")))u(s,f);else for(let o of We(s.path))u(s,f,!0,o)}),t}function We(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,a=n.endsWith("?"),u=n.replace(/\?$/,"");if(r.length===0)return a?[u,""]:[u];let s=We(r.join("/")),f=[];return f.push(...s.map(l=>l===""?u:[u,l].join("/"))),a&&f.push(...s),f.map(l=>e.startsWith("/")&&l===""?"/":l)}function vt(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:bt(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var Rt=/^:[\w-]+$/,Et=3,wt=2,Ct=1,St=10,_t=-2,Ie=e=>e==="*";function xt(e,t){let n=e.split("/"),r=n.length;return n.some(Ie)&&(r+=_t),t&&(r+=wt),n.filter(a=>!Ie(a)).reduce((a,u)=>a+(Rt.test(u)?Et:u===""?Ct:St),r)}function bt(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function Pt(e,t,n=!1){let{routesMeta:r}=e,a={},u="/",s=[];for(let f=0;f<r.length;++f){let l=r[f],o=f===r.length-1,d=u==="/"?t:t.slice(u.length)||"/",h=le({path:l.relativePath,caseSensitive:l.caseSensitive,end:o},d),y=l.route;if(!h&&o&&n&&!r[r.length-1].route.index&&(h=le({path:l.relativePath,caseSensitive:l.caseSensitive,end:!1},d)),!h)return null;Object.assign(a,h.params),s.push({params:a,pathname:M([u,h.pathname]),pathnameBase:At(M([u,h.pathnameBase])),route:y}),h.pathnameBase!=="/"&&(u=M([u,h.pathnameBase]))}return s}function le(e,t){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=Tt(e.path,e.caseSensitive,e.end),a=t.match(n);if(!a)return null;let u=a[0],s=u.replace(/(.)\/+$/,"$1"),f=a.slice(1);return{params:r.reduce((o,{paramName:d,isOptional:h},y)=>{if(d==="*"){let C=f[y]||"";s=u.slice(0,u.length-C.length).replace(/(.)\/+$/,"$1")}const R=f[y];return h&&!R?o[d]=void 0:o[d]=(R||"").replace(/%2F/g,"/"),o},{}),pathname:u,pathnameBase:s,pattern:e}}function Tt(e,t=!1,n=!0){F(e==="*"||!e.endsWith("*")||e.endsWith("/*"),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,"/*")}".`);let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,f,l,o,d)=>{if(r.push({paramName:f,isOptional:l!=null}),l){let h=d.charAt(o+s.length);return h&&h!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function Lt(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return F(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function Y(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}var kt=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Ot(e,t="/"){let{pathname:n,search:r="",hash:a=""}=typeof e=="string"?K(e):e,u;return n?(n=qe(n),n.startsWith("/")?u=Me(n.substring(1),"/"):u=Me(n,t)):u=t,{pathname:u,search:Dt(r),hash:Nt(a)}}function Me(e,t){let n=se(t).split("/");return e.split("/").forEach(a=>{a===".."?n.length>1&&n.pop():a!=="."&&n.push(a)}),n.length>1?n.join("/"):"/"}function me(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function $t(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function Ye(e){let t=$t(e);return t.map((n,r)=>r===t.length-1?n.pathname:n.pathnameBase)}function Ee(e,t,n,r=!1){let a;typeof e=="string"?a=K(e):(a={...e},k(!a.pathname||!a.pathname.includes("?"),me("?","pathname","search",a)),k(!a.pathname||!a.pathname.includes("#"),me("#","pathname","hash",a)),k(!a.search||!a.search.includes("#"),me("#","search","hash",a)));let u=e===""||a.pathname==="",s=u?"/":a.pathname,f;if(s==null)f=n;else{let h=t.length-1;if(!r&&s.startsWith("..")){let y=s.split("/");for(;y[0]==="..";)y.shift(),h-=1;a.pathname=y.join("/")}f=h>=0?t[h]:"/"}let l=Ot(a,f),o=s&&s!=="/"&&s.endsWith("/"),d=(u||s===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(o||d)&&(l.pathname+="/"),l}var qe=e=>e.replace(/\/\/+/g,"/"),M=e=>qe(e.join("/")),se=e=>e.replace(/\/+$/,""),At=e=>se(e).replace(/^\/*/,"/"),Dt=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Nt=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e,It=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||"",this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Mt(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}function Ht(e){let t=e.map(n=>n.route.path).filter(Boolean);return M(t)||"/"}var ze=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Ge(e,t){let n=e;if(typeof n!="string"||!kt.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,a=!1;if(ze)try{let u=new URL(window.location.href),s=n.startsWith("//")?new URL(u.protocol+n):new URL(n),f=Y(s.pathname,t);s.origin===u.origin&&f!=null?n=f+s.search+s.hash:a=!0}catch{F(!1,`<Link to="${n}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:a,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Ke=["POST","PUT","PATCH","DELETE"];new Set(Ke);var Ut=["GET",...Ke];new Set(Ut);var V=c.createContext(null);V.displayName="DataRouter";var ce=c.createContext(null);ce.displayName="DataRouterState";var Ve=c.createContext(!1);function Ft(){return c.useContext(Ve)}var Je=c.createContext({isTransitioning:!1});Je.displayName="ViewTransition";var Bt=c.createContext(new Map);Bt.displayName="Fetchers";var jt=c.createContext(null);jt.displayName="Await";var I=c.createContext(null);I.displayName="Navigation";var te=c.createContext(null);te.displayName="Location";var B=c.createContext({outlet:null,matches:[],isDataRoute:!1});B.displayName="Route";var we=c.createContext(null);we.displayName="RouteError";var Xe="REACT_ROUTER_ERROR",Wt="REDIRECT",Yt="ROUTE_ERROR_RESPONSE";function qt(e){if(e.startsWith(`${Xe}:${Wt}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t=="object"&&t&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.location=="string"&&typeof t.reloadDocument=="boolean"&&typeof t.replace=="boolean")return t}catch{}}function zt(e){if(e.startsWith(`${Xe}:${Yt}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t=="object"&&t&&typeof t.status=="number"&&typeof t.statusText=="string")return new It(t.status,t.statusText,t.data)}catch{}}function Gt(e,{relative:t}={}){k(re(),"useHref() may be used only in the context of a <Router> component.");let{basename:n,navigator:r}=c.useContext(I),{hash:a,pathname:u,search:s}=ne(e,{relative:t}),f=u;return n!=="/"&&(f=u==="/"?n:M([n,u])),r.createHref({pathname:f,search:s,hash:a})}function re(){return c.useContext(te)!=null}function q(){return k(re(),"useLocation() may be used only in the context of a <Router> component."),c.useContext(te).location}var Qe="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Ze(e){c.useContext(I).static||c.useLayoutEffect(e)}function Kt(){let{isDataRoute:e}=c.useContext(B);return e?sr():Vt()}function Vt(){k(re(),"useNavigate() may be used only in the context of a <Router> component.");let e=c.useContext(V),{basename:t,navigator:n}=c.useContext(I),{matches:r}=c.useContext(B),{pathname:a}=q(),u=JSON.stringify(Ye(r)),s=c.useRef(!1);return Ze(()=>{s.current=!0}),c.useCallback((l,o={})=>{if(F(s.current,Qe),!s.current)return;if(typeof l=="number"){n.go(l);return}let d=Ee(l,JSON.parse(u),a,o.relative==="path");e==null&&t!=="/"&&(d.pathname=d.pathname==="/"?t:M([t,d.pathname])),(o.replace?n.replace:n.push)(d,o.state,o)},[t,n,u,a,e])}var Jt=c.createContext(null);function Xt(e){let t=c.useContext(B).outlet;return c.useMemo(()=>t&&c.createElement(Jt.Provider,{value:e},t),[t,e])}function ne(e,{relative:t}={}){let{matches:n}=c.useContext(B),{pathname:r}=q(),a=JSON.stringify(Ye(n));return c.useMemo(()=>Ee(e,JSON.parse(a),r,t==="path"),[e,a,r,t])}function Qt(e,t){return et(e,t)}function et(e,t,n){var g;k(re(),"useRoutes() may be used only in the context of a <Router> component.");let{navigator:r}=c.useContext(I),{matches:a}=c.useContext(B),u=a[a.length-1],s=u?u.params:{},f=u?u.pathname:"/",l=u?u.pathnameBase:"/",o=u&&u.route;{let m=o&&o.path||"";rt(f,!o||m.endsWith("*")||m.endsWith("*?"),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${f}" (under <Route path="${m}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
|
|
27
|
+
|
|
28
|
+
Please change the parent <Route path="${m}"> to <Route path="${m==="/"?"*":`${m}/*`}">.`)}let d=q(),h;if(t){let m=typeof t=="string"?K(t):t;k(l==="/"||((g=m.pathname)==null?void 0:g.startsWith(l)),`When overriding the location using \`<Routes location>\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${l}" but pathname "${m.pathname}" was given in the \`location\` prop.`),h=m}else h=d;let y=h.pathname||"/",R=y;if(l!=="/"){let m=l.replace(/^\//,"").split("/");R="/"+y.replace(/^\//,"").split("/").slice(m.length).join("/")}let C=Be(e,{pathname:R});F(o||C!=null,`No routes matched location "${h.pathname}${h.search}${h.hash}" `),F(C==null||C[C.length-1].route.element!==void 0||C[C.length-1].route.Component!==void 0||C[C.length-1].route.lazy!==void 0,`Matched leaf route at location "${h.pathname}${h.search}${h.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`);let v=nr(C&&C.map(m=>Object.assign({},m,{params:Object.assign({},s,m.params),pathname:M([l,r.encodeLocation?r.encodeLocation(m.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:m.pathname]),pathnameBase:m.pathnameBase==="/"?l:M([l,r.encodeLocation?r.encodeLocation(m.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:m.pathnameBase])})),a,n);return t&&v?c.createElement(te.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",unstable_mask:void 0,...h},navigationType:"POP"}},v):v}function Zt(){let e=lr(),t=Mt(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r="rgba(200,200,200, 0.5)",a={padding:"0.5rem",backgroundColor:r},u={padding:"2px 4px",backgroundColor:r},s=null;return console.error("Error handled by React Router default ErrorBoundary:",e),s=c.createElement(c.Fragment,null,c.createElement("p",null,"💿 Hey developer 👋"),c.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",c.createElement("code",{style:u},"ErrorBoundary")," or"," ",c.createElement("code",{style:u},"errorElement")," prop on your route.")),c.createElement(c.Fragment,null,c.createElement("h2",null,"Unexpected Application Error!"),c.createElement("h3",{style:{fontStyle:"italic"}},t),n?c.createElement("pre",{style:a},n):null,s)}var er=c.createElement(Zt,null),tt=class extends c.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error("React Router caught the following error during render",e)}render(){let e=this.state.error;if(this.context&&typeof e=="object"&&e&&"digest"in e&&typeof e.digest=="string"){const n=zt(e.digest);n&&(e=n)}let t=e!==void 0?c.createElement(B.Provider,{value:this.props.routeContext},c.createElement(we.Provider,{value:e,children:this.props.component})):this.props.children;return this.context?c.createElement(tr,{error:e},t):t}};tt.contextType=Ve;var ye=new WeakMap;function tr({children:e,error:t}){let{basename:n}=c.useContext(I);if(typeof t=="object"&&t&&"digest"in t&&typeof t.digest=="string"){let r=qt(t.digest);if(r){let a=ye.get(t);if(a)throw a;let u=Ge(r.location,n);if(ze&&!ye.get(t))if(u.isExternal||r.reloadDocument)window.location.href=u.absoluteURL||u.to;else{const s=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(u.to,{replace:r.replace}));throw ye.set(t,s),s}return c.createElement("meta",{httpEquiv:"refresh",content:`0;url=${u.absoluteURL||u.to}`})}}return e}function rr({routeContext:e,match:t,children:n}){let r=c.useContext(V);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),c.createElement(B.Provider,{value:e},n)}function nr(e,t=[],n){let r=n==null?void 0:n.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let a=e,u=r==null?void 0:r.errors;if(u!=null){let d=a.findIndex(h=>h.route.id&&(u==null?void 0:u[h.route.id])!==void 0);k(d>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(u).join(",")}`),a=a.slice(0,Math.min(a.length,d+1))}let s=!1,f=-1;if(n&&r){s=r.renderFallback;for(let d=0;d<a.length;d++){let h=a[d];if((h.route.HydrateFallback||h.route.hydrateFallbackElement)&&(f=d),h.route.id){let{loaderData:y,errors:R}=r,C=h.route.loader&&!y.hasOwnProperty(h.route.id)&&(!R||R[h.route.id]===void 0);if(h.route.lazy||C){n.isStatic&&(s=!0),f>=0?a=a.slice(0,f+1):a=[a[0]];break}}}}let l=n==null?void 0:n.onError,o=r&&l?(d,h)=>{var y,R;l(d,{location:r.location,params:((R=(y=r.matches)==null?void 0:y[0])==null?void 0:R.params)??{},unstable_pattern:Ht(r.matches),errorInfo:h})}:void 0;return a.reduceRight((d,h,y)=>{let R,C=!1,v=null,g=null;r&&(R=u&&h.route.id?u[h.route.id]:void 0,v=h.route.errorElement||er,s&&(f<0&&y===0?(rt("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),C=!0,g=null):f===y&&(C=!0,g=h.route.hydrateFallbackElement||null)));let m=t.concat(a.slice(0,y+1)),_=()=>{let x;return R?x=v:C?x=g:h.route.Component?x=c.createElement(h.route.Component,null):h.route.element?x=h.route.element:x=d,c.createElement(rr,{match:h,routeContext:{outlet:d,matches:m,isDataRoute:r!=null},children:x})};return r&&(h.route.ErrorBoundary||h.route.errorElement||y===0)?c.createElement(tt,{location:r.location,revalidation:r.revalidation,component:v,error:R,children:_(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:o}):_()},null)}function Ce(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function ar(e){let t=c.useContext(V);return k(t,Ce(e)),t}function or(e){let t=c.useContext(ce);return k(t,Ce(e)),t}function ir(e){let t=c.useContext(B);return k(t,Ce(e)),t}function Se(e){let t=ir(e),n=t.matches[t.matches.length-1];return k(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function ur(){return Se("useRouteId")}function lr(){var r;let e=c.useContext(we),t=or("useRouteError"),n=Se("useRouteError");return e!==void 0?e:(r=t.errors)==null?void 0:r[n]}function sr(){let{router:e}=ar("useNavigate"),t=Se("useNavigate"),n=c.useRef(!1);return Ze(()=>{n.current=!0}),c.useCallback(async(a,u={})=>{F(n.current,Qe),n.current&&(typeof a=="number"?await e.navigate(a):await e.navigate(a,{fromRouteId:t,...u}))},[e,t])}var He={};function rt(e,t,n){!t&&!He[e]&&(He[e]=!0,F(!1,n))}c.memo(cr);function cr({routes:e,future:t,state:n,isStatic:r,onError:a}){return et(e,void 0,{state:n,isStatic:r,onError:a})}function Kr(e){return Xt(e.context)}function fr(e){k(!1,"A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.")}function dr({basename:e="/",children:t=null,location:n,navigationType:r="POP",navigator:a,static:u=!1,unstable_useTransitions:s}){k(!re(),"You cannot render a <Router> inside another <Router>. You should never have more than one in your app.");let f=e.replace(/^\/*/,"/"),l=c.useMemo(()=>({basename:f,navigator:a,static:u,unstable_useTransitions:s,future:{}}),[f,a,u,s]);typeof n=="string"&&(n=K(n));let{pathname:o="/",search:d="",hash:h="",state:y=null,key:R="default",unstable_mask:C}=n,v=c.useMemo(()=>{let g=Y(o,f);return g==null?null:{location:{pathname:g,search:d,hash:h,state:y,key:R,unstable_mask:C},navigationType:r}},[f,o,d,h,y,R,r,C]);return F(v!=null,`<Router basename="${f}"> is not able to match the URL "${o}${d}${h}" because it does not start with the basename, so the <Router> won't render anything.`),v==null?null:c.createElement(I.Provider,{value:l},c.createElement(te.Provider,{children:t,value:v}))}function Vr({children:e,location:t}){return Qt(Re(e),t)}function Re(e,t=[]){let n=[];return c.Children.forEach(e,(r,a)=>{if(!c.isValidElement(r))return;let u=[...t,a];if(r.type===c.Fragment){n.push.apply(n,Re(r.props.children,u));return}k(r.type===fr,`[${typeof r.type=="string"?r.type:r.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),k(!r.props.index||!r.props.children,"An index route cannot have child routes.");let s={id:r.props.id||u.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(s.children=Re(r.props.children,u)),n.push(s)}),n}var ie="get",ue="application/x-www-form-urlencoded";function fe(e){return typeof HTMLElement<"u"&&e instanceof HTMLElement}function hr(e){return fe(e)&&e.tagName.toLowerCase()==="button"}function pr(e){return fe(e)&&e.tagName.toLowerCase()==="form"}function mr(e){return fe(e)&&e.tagName.toLowerCase()==="input"}function yr(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function gr(e,t){return e.button===0&&(!t||t==="_self")&&!yr(e)}var oe=null;function vr(){if(oe===null)try{new FormData(document.createElement("form"),0),oe=!1}catch{oe=!0}return oe}var Rr=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function ge(e){return e!=null&&!Rr.has(e)?(F(!1,`"${e}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${ue}"`),null):e}function Er(e,t){let n,r,a,u,s;if(pr(e)){let f=e.getAttribute("action");r=f?Y(f,t):null,n=e.getAttribute("method")||ie,a=ge(e.getAttribute("enctype"))||ue,u=new FormData(e)}else if(hr(e)||mr(e)&&(e.type==="submit"||e.type==="image")){let f=e.form;if(f==null)throw new Error('Cannot submit a <button> or <input type="submit"> without a <form>');let l=e.getAttribute("formaction")||f.getAttribute("action");if(r=l?Y(l,t):null,n=e.getAttribute("formmethod")||f.getAttribute("method")||ie,a=ge(e.getAttribute("formenctype"))||ge(f.getAttribute("enctype"))||ue,u=new FormData(f,e),!vr()){let{name:o,type:d,value:h}=e;if(d==="image"){let y=o?`${o}.`:"";u.append(`${y}x`,"0"),u.append(`${y}y`,"0")}else o&&u.append(o,h)}}else{if(fe(e))throw new Error('Cannot submit element that is not <form>, <button>, or <input type="submit|image">');n=ie,r=null,a=ue,s=e}return u&&a==="text/plain"&&(s=u,u=void 0),{action:r,method:n.toLowerCase(),encType:a,formData:u,body:s}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function _e(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function nt(e,t,n,r){let a=typeof e=="string"?new URL(e,typeof window>"u"?"server://singlefetch/":window.location.origin):e;return n?a.pathname.endsWith("/")?a.pathname=`${a.pathname}_.${r}`:a.pathname=`${a.pathname}.${r}`:a.pathname==="/"?a.pathname=`_root.${r}`:t&&Y(a.pathname,t)==="/"?a.pathname=`${se(t)}/_root.${r}`:a.pathname=`${se(a.pathname)}.${r}`,a}async function wr(e,t){if(e.id in t)return t[e.id];try{let n=await import(e.module);return t[e.id]=n,n}catch(n){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(n),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function Cr(e){return e==null?!1:e.href==null?e.rel==="preload"&&typeof e.imageSrcSet=="string"&&typeof e.imageSizes=="string":typeof e.rel=="string"&&typeof e.href=="string"}async function Sr(e,t,n){let r=await Promise.all(e.map(async a=>{let u=t.routes[a.route.id];if(u){let s=await wr(u,n);return s.links?s.links():[]}return[]}));return Pr(r.flat(1).filter(Cr).filter(a=>a.rel==="stylesheet"||a.rel==="preload").map(a=>a.rel==="stylesheet"?{...a,rel:"prefetch",as:"style"}:{...a,rel:"prefetch"}))}function Ue(e,t,n,r,a,u){let s=(l,o)=>n[o]?l.route.id!==n[o].route.id:!0,f=(l,o)=>{var d;return n[o].pathname!==l.pathname||((d=n[o].route.path)==null?void 0:d.endsWith("*"))&&n[o].params["*"]!==l.params["*"]};return u==="assets"?t.filter((l,o)=>s(l,o)||f(l,o)):u==="data"?t.filter((l,o)=>{var h;let d=r.routes[l.route.id];if(!d||!d.hasLoader)return!1;if(s(l,o)||f(l,o))return!0;if(l.route.shouldRevalidate){let y=l.route.shouldRevalidate({currentUrl:new URL(a.pathname+a.search+a.hash,window.origin),currentParams:((h=n[0])==null?void 0:h.params)||{},nextUrl:new URL(e,window.origin),nextParams:l.params,defaultShouldRevalidate:!0});if(typeof y=="boolean")return y}return!0}):[]}function _r(e,t,{includeHydrateFallback:n}={}){return xr(e.map(r=>{let a=t.routes[r.route.id];if(!a)return[];let u=[a.module];return a.clientActionModule&&(u=u.concat(a.clientActionModule)),a.clientLoaderModule&&(u=u.concat(a.clientLoaderModule)),n&&a.hydrateFallbackModule&&(u=u.concat(a.hydrateFallbackModule)),a.imports&&(u=u.concat(a.imports)),u}).flat(1))}function xr(e){return[...new Set(e)]}function br(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}function Pr(e,t){let n=new Set;return new Set(t),e.reduce((r,a)=>{let u=JSON.stringify(br(a));return n.has(u)||(n.add(u),r.push({key:u,link:a})),r},[])}function xe(){let e=c.useContext(V);return _e(e,"You must render this element inside a <DataRouterContext.Provider> element"),e}function Tr(){let e=c.useContext(ce);return _e(e,"You must render this element inside a <DataRouterStateContext.Provider> element"),e}var be=c.createContext(void 0);be.displayName="FrameworkContext";function Pe(){let e=c.useContext(be);return _e(e,"You must render this element inside a <HydratedRouter> element"),e}function Lr(e,t){let n=c.useContext(be),[r,a]=c.useState(!1),[u,s]=c.useState(!1),{onFocus:f,onBlur:l,onMouseEnter:o,onMouseLeave:d,onTouchStart:h}=t,y=c.useRef(null);c.useEffect(()=>{if(e==="render"&&s(!0),e==="viewport"){let v=m=>{m.forEach(_=>{s(_.isIntersecting)})},g=new IntersectionObserver(v,{threshold:.5});return y.current&&g.observe(y.current),()=>{g.disconnect()}}},[e]),c.useEffect(()=>{if(r){let v=setTimeout(()=>{s(!0)},100);return()=>{clearTimeout(v)}}},[r]);let R=()=>{a(!0)},C=()=>{a(!1),s(!1)};return n?e!=="intent"?[u,y,{}]:[u,y,{onFocus:Z(f,R),onBlur:Z(l,C),onMouseEnter:Z(o,R),onMouseLeave:Z(d,C),onTouchStart:Z(h,R)}]:[!1,y,{}]}function Z(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function kr({page:e,...t}){let n=Ft(),{router:r}=xe(),a=c.useMemo(()=>Be(r.routes,e,r.basename),[r.routes,e,r.basename]);return a?n?c.createElement($r,{page:e,matches:a,...t}):c.createElement(Ar,{page:e,matches:a,...t}):null}function Or(e){let{manifest:t,routeModules:n}=Pe(),[r,a]=c.useState([]);return c.useEffect(()=>{let u=!1;return Sr(e,t,n).then(s=>{u||a(s)}),()=>{u=!0}},[e,t,n]),r}function $r({page:e,matches:t,...n}){let r=q(),{future:a}=Pe(),{basename:u}=xe(),s=c.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let f=nt(e,u,a.unstable_trailingSlashAwareDataRequests,"rsc"),l=!1,o=[];for(let d of t)typeof d.route.shouldRevalidate=="function"?l=!0:o.push(d.route.id);return l&&o.length>0&&f.searchParams.set("_routes",o.join(",")),[f.pathname+f.search]},[u,a.unstable_trailingSlashAwareDataRequests,e,r,t]);return c.createElement(c.Fragment,null,s.map(f=>c.createElement("link",{key:f,rel:"prefetch",as:"fetch",href:f,...n})))}function Ar({page:e,matches:t,...n}){let r=q(),{future:a,manifest:u,routeModules:s}=Pe(),{basename:f}=xe(),{loaderData:l,matches:o}=Tr(),d=c.useMemo(()=>Ue(e,t,o,u,r,"data"),[e,t,o,u,r]),h=c.useMemo(()=>Ue(e,t,o,u,r,"assets"),[e,t,o,u,r]),y=c.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let v=new Set,g=!1;if(t.forEach(_=>{var $;let x=u.routes[_.route.id];!x||!x.hasLoader||(!d.some(O=>O.route.id===_.route.id)&&_.route.id in l&&(($=s[_.route.id])!=null&&$.shouldRevalidate)||x.hasClientLoader?g=!0:v.add(_.route.id))}),v.size===0)return[];let m=nt(e,f,a.unstable_trailingSlashAwareDataRequests,"data");return g&&v.size>0&&m.searchParams.set("_routes",t.filter(_=>v.has(_.route.id)).map(_=>_.route.id).join(",")),[m.pathname+m.search]},[f,a.unstable_trailingSlashAwareDataRequests,l,r,u,d,t,e,s]),R=c.useMemo(()=>_r(h,u),[h,u]),C=Or(h);return c.createElement(c.Fragment,null,y.map(v=>c.createElement("link",{key:v,rel:"prefetch",as:"fetch",href:v,...n})),R.map(v=>c.createElement("link",{key:v,rel:"modulepreload",href:v,...n})),C.map(({key:v,link:g})=>c.createElement("link",{key:v,nonce:n.nonce,...g,crossOrigin:g.crossOrigin??n.crossOrigin})))}function Dr(...e){return t=>{e.forEach(n=>{typeof n=="function"?n(t):n!=null&&(n.current=t)})}}var Nr=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{Nr&&(window.__reactRouterVersion="7.14.2")}catch{}function Jr({basename:e,children:t,unstable_useTransitions:n,window:r}){let a=c.useRef();a.current==null&&(a.current=ht({window:r,v5Compat:!0}));let u=a.current,[s,f]=c.useState({action:u.action,location:u.location}),l=c.useCallback(o=>{n===!1?f(o):c.startTransition(()=>f(o))},[n]);return c.useLayoutEffect(()=>u.listen(l),[u,l]),c.createElement(dr,{basename:e,children:t,location:s.location,navigationType:s.action,navigator:u,unstable_useTransitions:n})}var at=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ot=c.forwardRef(function({onClick:t,discover:n="render",prefetch:r="none",relative:a,reloadDocument:u,replace:s,unstable_mask:f,state:l,target:o,to:d,preventScrollReset:h,viewTransition:y,unstable_defaultShouldRevalidate:R,...C},v){let{basename:g,navigator:m,unstable_useTransitions:_}=c.useContext(I),x=typeof d=="string"&&at.test(d),$=Ge(d,g);d=$.to;let O=Gt(d,{relative:a}),D=q(),b=null;if(f){let H=Ee(f,[],D.unstable_mask?D.unstable_mask.pathname:"/",!0);g!=="/"&&(H.pathname=H.pathname==="/"?g:M([g,H.pathname])),b=m.createHref(H)}let[j,W,J]=Lr(r,C),X=Ur(d,{replace:s,unstable_mask:f,state:l,target:o,preventScrollReset:h,relative:a,viewTransition:y,unstable_defaultShouldRevalidate:R,unstable_useTransitions:_});function de(H){t&&t(H),H.defaultPrevented||X(H)}let Q=!($.isExternal||u),z=c.createElement("a",{...C,...J,href:(Q?b:void 0)||$.absoluteURL||O,onClick:Q?de:t,ref:Dr(v,W),target:o,"data-discover":!x&&n==="render"?"true":void 0});return j&&!x?c.createElement(c.Fragment,null,z,c.createElement(kr,{page:O})):z});ot.displayName="Link";var Ir=c.forwardRef(function({"aria-current":t="page",caseSensitive:n=!1,className:r="",end:a=!1,style:u,to:s,viewTransition:f,children:l,...o},d){let h=ne(s,{relative:o.relative}),y=q(),R=c.useContext(ce),{navigator:C,basename:v}=c.useContext(I),g=R!=null&&Yr(h)&&f===!0,m=C.encodeLocation?C.encodeLocation(h).pathname:h.pathname,_=y.pathname,x=R&&R.navigation&&R.navigation.location?R.navigation.location.pathname:null;n||(_=_.toLowerCase(),x=x?x.toLowerCase():null,m=m.toLowerCase()),x&&v&&(x=Y(x,v)||x);const $=m!=="/"&&m.endsWith("/")?m.length-1:m.length;let O=_===m||!a&&_.startsWith(m)&&_.charAt($)==="/",D=x!=null&&(x===m||!a&&x.startsWith(m)&&x.charAt(m.length)==="/"),b={isActive:O,isPending:D,isTransitioning:g},j=O?t:void 0,W;typeof r=="function"?W=r(b):W=[r,O?"active":null,D?"pending":null,g?"transitioning":null].filter(Boolean).join(" ");let J=typeof u=="function"?u(b):u;return c.createElement(ot,{...o,"aria-current":j,className:W,ref:d,style:J,to:s,viewTransition:f},typeof l=="function"?l(b):l)});Ir.displayName="NavLink";var Mr=c.forwardRef(({discover:e="render",fetcherKey:t,navigate:n,reloadDocument:r,replace:a,state:u,method:s=ie,action:f,onSubmit:l,relative:o,preventScrollReset:d,viewTransition:h,unstable_defaultShouldRevalidate:y,...R},C)=>{let{unstable_useTransitions:v}=c.useContext(I),g=jr(),m=Wr(f,{relative:o}),_=s.toLowerCase()==="get"?"get":"post",x=typeof f=="string"&&at.test(f),$=O=>{if(l&&l(O),O.defaultPrevented)return;O.preventDefault();let D=O.nativeEvent.submitter,b=(D==null?void 0:D.getAttribute("formmethod"))||s,j=()=>g(D||O.currentTarget,{fetcherKey:t,method:b,navigate:n,replace:a,state:u,relative:o,preventScrollReset:d,viewTransition:h,unstable_defaultShouldRevalidate:y});v&&n!==!1?c.startTransition(()=>j()):j()};return c.createElement("form",{ref:C,method:_,action:m,onSubmit:r?l:$,...R,"data-discover":!x&&e==="render"?"true":void 0})});Mr.displayName="Form";function Hr(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function it(e){let t=c.useContext(V);return k(t,Hr(e)),t}function Ur(e,{target:t,replace:n,unstable_mask:r,state:a,preventScrollReset:u,relative:s,viewTransition:f,unstable_defaultShouldRevalidate:l,unstable_useTransitions:o}={}){let d=Kt(),h=q(),y=ne(e,{relative:s});return c.useCallback(R=>{if(gr(R,t)){R.preventDefault();let C=n!==void 0?n:ee(h)===ee(y),v=()=>d(e,{replace:C,unstable_mask:r,state:a,preventScrollReset:u,relative:s,viewTransition:f,unstable_defaultShouldRevalidate:l});o?c.startTransition(()=>v()):v()}},[h,d,y,n,r,a,t,e,u,s,f,l,o])}var Fr=0,Br=()=>`__${String(++Fr)}__`;function jr(){let{router:e}=it("useSubmit"),{basename:t}=c.useContext(I),n=ur(),r=e.fetch,a=e.navigate;return c.useCallback(async(u,s={})=>{let{action:f,method:l,encType:o,formData:d,body:h}=Er(u,t);if(s.navigate===!1){let y=s.fetcherKey||Br();await r(y,n,s.action||f,{unstable_defaultShouldRevalidate:s.unstable_defaultShouldRevalidate,preventScrollReset:s.preventScrollReset,formData:d,body:h,formMethod:s.method||l,formEncType:s.encType||o,flushSync:s.flushSync})}else await a(s.action||f,{unstable_defaultShouldRevalidate:s.unstable_defaultShouldRevalidate,preventScrollReset:s.preventScrollReset,formData:d,body:h,formMethod:s.method||l,formEncType:s.encType||o,replace:s.replace,state:s.state,fromRouteId:n,flushSync:s.flushSync,viewTransition:s.viewTransition})},[r,a,t,n])}function Wr(e,{relative:t}={}){let{basename:n}=c.useContext(I),r=c.useContext(B);k(r,"useFormAction must be used inside a RouteContext");let[a]=r.matches.slice(-1),u={...ne(e||".",{relative:t})},s=q();if(e==null){u.search=s.search;let f=new URLSearchParams(u.search),l=f.getAll("index");if(l.some(d=>d==="")){f.delete("index"),l.filter(h=>h).forEach(h=>f.append("index",h));let d=f.toString();u.search=d?`?${d}`:""}}return(!e||e===".")&&a.route.index&&(u.search=u.search?u.search.replace(/^\?/,"?index&"):"?index"),n!=="/"&&(u.pathname=u.pathname==="/"?n:M([n,u.pathname])),ee(u)}function Yr(e,{relative:t}={}){let n=c.useContext(Je);k(n!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:r}=it("useViewTransitionState"),a=ne(e,{relative:t});if(!n.isTransitioning)return!1;let u=Y(n.currentLocation.pathname,r)||n.currentLocation.pathname,s=Y(n.nextLocation.pathname,r)||n.nextLocation.pathname;return le(a.pathname,s)!=null||le(a.pathname,u)!=null}export{Jr as B,Ir as N,Kr as O,zr as R,Fe as a,Gr as b,qr as c,Vr as d,fr as e,ct as g,c as r};
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>OpalServe Dashboard</title>
|
|
7
|
-
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>💠</text></svg>" />
|
|
8
|
-
<script type="module" crossorigin src="/dashboard/assets/index-
|
|
9
|
-
<link rel="
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<
|
|
13
|
-
</
|
|
14
|
-
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>OpalServe Dashboard</title>
|
|
7
|
+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>💠</text></svg>" />
|
|
8
|
+
<script type="module" crossorigin src="/dashboard/assets/index-DnqqzxX6.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/dashboard/assets/react-BJczIp53.js">
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/dashboard/assets/icons-DciuKSzL.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/dashboard/assets/charts-CKTlvUso.js">
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/dashboard/assets/index-BrOv-3xx.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body class="bg-gray-950 text-gray-100">
|
|
15
|
+
<div id="root"></div>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -25,7 +25,7 @@ export function handleGitHubWebhook(payload, db) {
|
|
|
25
25
|
.map(c => `- ${c.message} (${c.author.name})`)
|
|
26
26
|
.join('\n');
|
|
27
27
|
const content = `# Push to ${push.repository.full_name}\n\nBranch: ${push.ref}\n\n## Commits\n${commitSummary}`;
|
|
28
|
-
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
28
|
+
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
29
29
|
VALUES (?, ?, ?, 'text/markdown', ?, '["github","push"]', datetime('now'), datetime('now'))`, [
|
|
30
30
|
crypto.randomUUID(),
|
|
31
31
|
`Push to ${push.repository.full_name} (${push.ref})`,
|
|
@@ -38,7 +38,7 @@ export function handleGitHubWebhook(payload, db) {
|
|
|
38
38
|
if (data.pull_request && data.action) {
|
|
39
39
|
const pr = data;
|
|
40
40
|
const content = `# PR: ${pr.pull_request.title}\n\nAction: ${pr.action}\nRepo: ${pr.repository.full_name}\nAuthor: ${pr.pull_request.user.login}\n\n${pr.pull_request.body || ''}`;
|
|
41
|
-
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
41
|
+
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
42
42
|
VALUES (?, ?, ?, 'text/markdown', ?, '["github","pull-request"]', datetime('now'), datetime('now'))`, [
|
|
43
43
|
crypto.randomUUID(),
|
|
44
44
|
`PR: ${pr.pull_request.title}`,
|
|
@@ -51,7 +51,7 @@ export function handleGitHubWebhook(payload, db) {
|
|
|
51
51
|
if (data.issue && data.action) {
|
|
52
52
|
const issue = data;
|
|
53
53
|
const content = `# Issue: ${issue.issue.title}\n\nAction: ${issue.action}\nRepo: ${issue.repository.full_name}\nAuthor: ${issue.issue.user.login}\n\n${issue.issue.body || ''}`;
|
|
54
|
-
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
54
|
+
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
55
55
|
VALUES (?, ?, ?, 'text/markdown', ?, '["github","issue"]', datetime('now'), datetime('now'))`, [
|
|
56
56
|
crypto.randomUUID(),
|
|
57
57
|
`Issue: ${issue.issue.title}`,
|
|
@@ -49,7 +49,7 @@ export function handleSlackEvent(event, db) {
|
|
|
49
49
|
// Only ingest substantial messages (more than 50 chars)
|
|
50
50
|
if (msg.text.length < 50)
|
|
51
51
|
return;
|
|
52
|
-
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
52
|
+
db.run(`INSERT INTO context_documents (id, title, content, content_type, source, tags, created_at, updated_at)
|
|
53
53
|
VALUES (?, ?, ?, 'text/plain', ?, '["slack","message"]', datetime('now'), datetime('now'))`, [
|
|
54
54
|
crypto.randomUUID(),
|
|
55
55
|
`Slack message from ${msg.user} in ${msg.channel}`,
|
|
@@ -11,7 +11,7 @@ export class UsageTracker {
|
|
|
11
11
|
this.db = db;
|
|
12
12
|
}
|
|
13
13
|
trackToolCall(opts) {
|
|
14
|
-
this.db.run(`INSERT INTO usage_events (team_id, user_id, event_type, server_name, tool_name, latency_ms, success, error)
|
|
14
|
+
this.db.run(`INSERT INTO usage_events (team_id, user_id, event_type, server_name, tool_name, latency_ms, success, error)
|
|
15
15
|
VALUES (?, ?, 'tool_call', ?, ?, ?, ?, ?)`, [
|
|
16
16
|
opts.teamId ?? null,
|
|
17
17
|
opts.userId ?? null,
|
|
@@ -23,7 +23,7 @@ export class UsageTracker {
|
|
|
23
23
|
]);
|
|
24
24
|
}
|
|
25
25
|
trackEvent(opts) {
|
|
26
|
-
this.db.run(`INSERT INTO usage_events (team_id, user_id, event_type, server_name, tool_name, success, metadata)
|
|
26
|
+
this.db.run(`INSERT INTO usage_events (team_id, user_id, event_type, server_name, tool_name, success, metadata)
|
|
27
27
|
VALUES (?, ?, ?, ?, ?, 1, ?)`, [
|
|
28
28
|
opts.teamId ?? null,
|
|
29
29
|
opts.userId ?? null,
|
|
@@ -37,12 +37,12 @@ export class UsageTracker {
|
|
|
37
37
|
const since = periodToSql(period);
|
|
38
38
|
const teamFilter = teamId ? ' AND team_id = ?' : '';
|
|
39
39
|
const params = teamId ? [teamId] : [];
|
|
40
|
-
const totals = this.db.get(`SELECT COUNT(*) as total, SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as errors
|
|
40
|
+
const totals = this.db.get(`SELECT COUNT(*) as total, SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as errors
|
|
41
41
|
FROM usage_events WHERE created_at >= ${since}${teamFilter}`, params);
|
|
42
|
-
const activeUsers = this.db.get(`SELECT COUNT(DISTINCT user_id) as count
|
|
42
|
+
const activeUsers = this.db.get(`SELECT COUNT(DISTINCT user_id) as count
|
|
43
43
|
FROM usage_events WHERE user_id IS NOT NULL AND created_at >= ${since}${teamFilter}`, params);
|
|
44
|
-
const topTools = this.db.all(`SELECT tool_name as name, COUNT(*) as count
|
|
45
|
-
FROM usage_events WHERE tool_name IS NOT NULL AND created_at >= ${since}${teamFilter}
|
|
44
|
+
const topTools = this.db.all(`SELECT tool_name as name, COUNT(*) as count
|
|
45
|
+
FROM usage_events WHERE tool_name IS NOT NULL AND created_at >= ${since}${teamFilter}
|
|
46
46
|
GROUP BY tool_name ORDER BY count DESC LIMIT 10`, params);
|
|
47
47
|
const total = totals?.total ?? 0;
|
|
48
48
|
const errors = totals?.errors ?? 0;
|
|
@@ -55,10 +55,10 @@ export class UsageTracker {
|
|
|
55
55
|
}
|
|
56
56
|
getUserStats(userId, period) {
|
|
57
57
|
const since = periodToSql(period);
|
|
58
|
-
const totals = this.db.get(`SELECT COUNT(*) as total, SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as errors
|
|
58
|
+
const totals = this.db.get(`SELECT COUNT(*) as total, SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as errors
|
|
59
59
|
FROM usage_events WHERE user_id = ? AND created_at >= ${since}`, [userId]);
|
|
60
|
-
const topTools = this.db.all(`SELECT tool_name as name, COUNT(*) as count
|
|
61
|
-
FROM usage_events WHERE user_id = ? AND tool_name IS NOT NULL AND created_at >= ${since}
|
|
60
|
+
const topTools = this.db.all(`SELECT tool_name as name, COUNT(*) as count
|
|
61
|
+
FROM usage_events WHERE user_id = ? AND tool_name IS NOT NULL AND created_at >= ${since}
|
|
62
62
|
GROUP BY tool_name ORDER BY count DESC LIMIT 10`, [userId]);
|
|
63
63
|
const total = totals?.total ?? 0;
|
|
64
64
|
const errors = totals?.errors ?? 0;
|
|
@@ -71,10 +71,10 @@ export class UsageTracker {
|
|
|
71
71
|
}
|
|
72
72
|
getServerStats(serverName, period) {
|
|
73
73
|
const since = periodToSql(period);
|
|
74
|
-
const row = this.db.get(`SELECT
|
|
75
|
-
COUNT(*) as calls,
|
|
76
|
-
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as errors,
|
|
77
|
-
COALESCE(AVG(latency_ms), 0) as avg_latency
|
|
74
|
+
const row = this.db.get(`SELECT
|
|
75
|
+
COUNT(*) as calls,
|
|
76
|
+
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as errors,
|
|
77
|
+
COALESCE(AVG(latency_ms), 0) as avg_latency
|
|
78
78
|
FROM usage_events WHERE server_name = ? AND created_at >= ${since}`, [serverName]);
|
|
79
79
|
return {
|
|
80
80
|
calls: row?.calls ?? 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-gateway.d.ts","sourceRoot":"","sources":["../../src/server/mcp-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-gateway.d.ts","sourceRoot":"","sources":["../../src/server/mcp-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,SAAS,CAAY;gBAET,QAAQ,EAAE,iBAAiB;IAU/C,OAAO,CAAC,iBAAiB;IA8CzB,OAAO,CAAC,kBAAkB;IAgDpB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnC,SAAS,IAAI,SAAS;CAGvB"}
|
|
@@ -2,13 +2,14 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { createLogger } from '../utils/logger.js';
|
|
5
|
+
import { VERSION } from '../constants.js';
|
|
5
6
|
const log = createLogger('mcp-gateway');
|
|
6
7
|
export class McpGateway {
|
|
7
8
|
registry;
|
|
8
9
|
mcpServer;
|
|
9
10
|
constructor(registry) {
|
|
10
11
|
this.registry = registry;
|
|
11
|
-
this.mcpServer = new McpServer({ name: 'opalserve', version:
|
|
12
|
+
this.mcpServer = new McpServer({ name: 'opalserve', version: VERSION }, { capabilities: { tools: {} } });
|
|
12
13
|
this.registerMetaTools();
|
|
13
14
|
this.registerProxyTools();
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-gateway.js","sourceRoot":"","sources":["../../src/server/mcp-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-gateway.js","sourceRoot":"","sources":["../../src/server/mcp-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAExC,MAAM,OAAO,UAAU;IAGD;IAFZ,SAAS,CAAY;IAE7B,YAAoB,QAA2B;QAA3B,aAAQ,GAAR,QAAQ,CAAmB;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAC5B,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;QAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,iBAAiB;QACvB,uCAAuC;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,kBAAkB,EAClB,oDAAoD,EACpD,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,EAChE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAChC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;4BACtB,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,cAAc,SAAS,EAAE;4BAClD,CAAC,CAAC,4BAA4B,KAAK,GAAG;qBACzC,CAAC;aACH,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,+CAA+C;QAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,mBAAmB,EACnB,6DAA6D,EAC7D,EAAE,EACF,KAAK,IAAI,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAChC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,SAAS,GAAG,CAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;4BACtB,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,gBAAgB,SAAS,EAAE;4BAC9C,CAAC,CAAC,uBAAuB;qBAC5B,CAAC;aACH,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,uDAAuD;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC;gBAC5E,CAAC,CAAC,IAAI,CAAC,WAAsC;gBAC7C,CAAC,CAAC,EAAE,CAAC;YAEP,qDAAqD;YACrD,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;YAC7E,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAa,CAAC;YAE1D,MAAM,QAAQ,GAAiC,EAAE,CAAC;YAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,0EAA0E;gBAC1E,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACpC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;oBACT,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,GAAG,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE,EAClC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAC7B,QAAQ,EACR,KAAK,EAAE,IAAI,EAAE,EAAE;oBACb,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAA+B,CAAC,CAAC;wBACrF,OAAO,MAAM,CAAC;oBAChB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBACvE,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;4BAC/D,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,+BAA+B,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -18,7 +18,7 @@ export function registerContextRoutes(app, registry) {
|
|
|
18
18
|
const membership = db.get('SELECT team_id FROM team_members WHERE user_id = ?', [userId]);
|
|
19
19
|
teamId = membership?.team_id ?? null;
|
|
20
20
|
}
|
|
21
|
-
db.run(`INSERT INTO context_documents (id, team_id, title, content, content_type, source, tags, uploaded_by, created_at, updated_at)
|
|
21
|
+
db.run(`INSERT INTO context_documents (id, team_id, title, content, content_type, source, tags, uploaded_by, created_at, updated_at)
|
|
22
22
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [id, teamId, title, content, contentType ?? 'text/markdown', source ?? null, JSON.stringify(tags ?? []), userId, now, now]);
|
|
23
23
|
const doc = {
|
|
24
24
|
id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/server/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/server/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAqB5F"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { VERSION } from '../../constants.js';
|
|
1
2
|
export function registerHealthRoutes(app, registry) {
|
|
2
3
|
app.get('/api/v1/health', async (_request, reply) => {
|
|
3
4
|
const servers = registry.listServers();
|
|
@@ -6,7 +7,7 @@ export function registerHealthRoutes(app, registry) {
|
|
|
6
7
|
ok: true,
|
|
7
8
|
data: {
|
|
8
9
|
status: 'running',
|
|
9
|
-
version:
|
|
10
|
+
version: VERSION,
|
|
10
11
|
uptime: process.uptime(),
|
|
11
12
|
servers: {
|
|
12
13
|
total: servers.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/server/routes/health.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/server/routes/health.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,GAAoB,EAAE,QAA2B;IACpF,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QAEnC,OAAO,KAAK,CAAC,IAAI,CAAC;YAChB,EAAE,EAAE,IAAI;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;gBACxB,OAAO,EAAE;oBACP,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;iBAChE;gBACD,KAAK,EAAE;oBACL,KAAK,EAAE,KAAK,CAAC,MAAM;iBACpB;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -24,8 +24,8 @@ export function registerStatsRoutes(app, registry) {
|
|
|
24
24
|
const totalCalls = totalRow?.count ?? 0;
|
|
25
25
|
const activeUsersRow = db.get(`SELECT COUNT(DISTINCT user_id) as count FROM usage_events WHERE created_at >= ${since} AND user_id IS NOT NULL`);
|
|
26
26
|
const activeUsers = activeUsersRow?.count ?? 0;
|
|
27
|
-
const topTools = db.all(`SELECT tool_name as name, COUNT(*) as count FROM usage_events
|
|
28
|
-
WHERE created_at >= ${since} AND tool_name IS NOT NULL
|
|
27
|
+
const topTools = db.all(`SELECT tool_name as name, COUNT(*) as count FROM usage_events
|
|
28
|
+
WHERE created_at >= ${since} AND tool_name IS NOT NULL
|
|
29
29
|
GROUP BY tool_name ORDER BY count DESC LIMIT 10`);
|
|
30
30
|
const errorRow = db.get(`SELECT COUNT(*) as count FROM usage_events WHERE created_at >= ${since} AND success = 0`);
|
|
31
31
|
const errorCount = errorRow?.count ?? 0;
|
|
@@ -51,8 +51,8 @@ export function registerStatsRoutes(app, registry) {
|
|
|
51
51
|
return reply.status(404).send({ ok: false, error: 'User not found' });
|
|
52
52
|
}
|
|
53
53
|
const totalRow = db.get(`SELECT COUNT(*) as count FROM usage_events WHERE user_id = ? AND created_at >= ${since}`, [id]);
|
|
54
|
-
const topTools = db.all(`SELECT tool_name as name, COUNT(*) as count FROM usage_events
|
|
55
|
-
WHERE user_id = ? AND created_at >= ${since} AND tool_name IS NOT NULL
|
|
54
|
+
const topTools = db.all(`SELECT tool_name as name, COUNT(*) as count FROM usage_events
|
|
55
|
+
WHERE user_id = ? AND created_at >= ${since} AND tool_name IS NOT NULL
|
|
56
56
|
GROUP BY tool_name ORDER BY count DESC LIMIT 10`, [id]);
|
|
57
57
|
const errorRow = db.get(`SELECT COUNT(*) as count FROM usage_events WHERE user_id = ? AND created_at >= ${since} AND success = 0`, [id]);
|
|
58
58
|
const totalCalls = totalRow?.count ?? 0;
|
|
@@ -74,8 +74,8 @@ export function registerStatsRoutes(app, registry) {
|
|
|
74
74
|
const { period } = request.query;
|
|
75
75
|
const since = parsePeriod(period ?? '7d');
|
|
76
76
|
const totalRow = db.get(`SELECT COUNT(*) as count FROM usage_events WHERE server_name = ? AND created_at >= ${since}`, [name]);
|
|
77
|
-
const topTools = db.all(`SELECT tool_name as name, COUNT(*) as count FROM usage_events
|
|
78
|
-
WHERE server_name = ? AND created_at >= ${since} AND tool_name IS NOT NULL
|
|
77
|
+
const topTools = db.all(`SELECT tool_name as name, COUNT(*) as count FROM usage_events
|
|
78
|
+
WHERE server_name = ? AND created_at >= ${since} AND tool_name IS NOT NULL
|
|
79
79
|
GROUP BY tool_name ORDER BY count DESC LIMIT 10`, [name]);
|
|
80
80
|
const errorRow = db.get(`SELECT COUNT(*) as count FROM usage_events WHERE server_name = ? AND created_at >= ${since} AND success = 0`, [name]);
|
|
81
81
|
const avgLatencyRow = db.get(`SELECT AVG(latency_ms) as avg_latency FROM usage_events WHERE server_name = ? AND created_at >= ${since} AND latency_ms IS NOT NULL`, [name]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAKxD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkJtH,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC,OAAO;WAKM,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,QAAQ,CAAC;AAKxD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkJtH,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC,OAAO;WAKM,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;WAiC1C,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAQ1C,IAAI,IAAI,IAAI;IAOZ,KAAK,IAAI,IAAI;IAKb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI;IAK1C,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI;IAY3E,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE;IAatE,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAS3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,GAAG,IAAI;IAMpF,aAAa,IAAI;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,EAAE;IAKvE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMnC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKnF,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOhG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,EAAE,GAAG,IAAI;IAY5I,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAKvC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE;IAKnD,WAAW,IAAI,WAAW,EAAE;IAK5B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAuB9E,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI7C,SAAS,IAAI,MAAM;IAOnB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,MAAM;IAad,QAAQ,IAAI,aAAa;CAG1B"}
|