@omniviewdev/runtime 0.1.10 → 0.2.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/dist/Client-BRYjLBXY.cjs +1 -0
- package/dist/{Client-DRRyPmcf.js → Client-RGYOEzh2.js} +312 -275
- package/dist/api.cjs +1 -1
- package/dist/api.d.ts +1 -0
- package/dist/api.js +95 -51
- package/dist/context/drawer/types.d.ts +1 -1
- package/dist/errors/types.d.ts +2 -0
- package/dist/hooks/connection/useConnectionStatus.d.ts +3 -3
- package/dist/hooks/connection/useConnections.d.ts +2 -2
- package/dist/hooks/resource/index.d.ts +2 -1
- package/dist/hooks/resource/useActiveSyncs.d.ts +2 -2
- package/dist/hooks/resource/useEditorSchemas.d.ts +2 -2
- package/dist/hooks/resource/useEventBatcher.d.ts +55 -0
- package/dist/hooks/resource/useResource.d.ts +9 -21
- package/dist/hooks/resource/useResourceActions.d.ts +3 -3
- package/dist/hooks/resource/useResourceGroups.d.ts +1 -1
- package/dist/hooks/resource/useResourceMutations.d.ts +14 -7
- package/dist/hooks/resource/useResourceSearch.d.ts +1 -1
- package/dist/hooks/resource/useResourceType.d.ts +1 -1
- package/dist/hooks/resource/useResourceTypes.d.ts +1 -1
- package/dist/hooks/resource/useResources.d.ts +14 -22
- package/dist/hooks/resource/useWatchState.d.ts +28 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1406 -1295
- package/dist/models.cjs +1 -1
- package/dist/models.js +1343 -972
- package/dist/types/index.d.ts +1 -1
- package/dist/types/watch.d.ts +29 -0
- package/dist/utils/activeSyncAggregator.d.ts +13 -8
- package/dist/utils/resourceKey.d.ts +12 -0
- package/dist/wailsjs/go/devserver/DevServerManager.d.ts +2 -0
- package/dist/wailsjs/go/models.d.ts +400 -214
- package/dist/wailsjs/go/plugin/pluginManager.d.ts +3 -1
- package/dist/wailsjs/go/pluginlog/Manager.d.ts +18 -0
- package/dist/wailsjs/go/resource/Client.d.ts +39 -23
- package/package.json +1 -1
- package/dist/Client-BtQwAB3N.cjs +0 -1
- package/dist/errors/parseAppError.test.d.ts +0 -1
- package/dist/hooks/resource/useInformerState.d.ts +0 -24
- package/dist/types/informer.d.ts +0 -49
- package/dist/utils/activeSyncAggregator.test.d.ts +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`);return{message:t||(e.title!=="Error"?e.title:"Operation failed"),status:"error",details:n,actions:(i=e.actions)==null?void 0:i.map(rt)}}function U(e,t,n){if(Ae(t))return;const r=q(t);e(st(r,n))}function A(e,t){return n=>{if(Ae(n))return;const r=q(n);e(st(r,r.title!=="Error"?r.title:t))}}function $t(e){const{children:t,pluginId:n}=e,[r,s]=d.useState({}),[i,o]=d.useState(new F.config.PluginMeta),[a,c]=d.useState(!1),[l,u]=d.useState(null);console.debug("[PluginContextProvider] render",{pluginId:n,metaLoaded:a,metaError:!!l});const h=()=>{n===void 0||n===""||(console.debug(`[PluginContextProvider] fetching settings for "${n}"`),m.PluginValues(n).then(p=>{console.debug(`[PluginContextProvider] settings loaded for "${n}"`,Object.keys(p)),s(p)}).catch(p=>{const C=q(p);console.error(`[PluginContextProvider] error fetching settings for "${n}":`,C.detail)}))},_=()=>{if(n===void 0||n===""){console.debug("[PluginContextProvider] skipping meta fetch — empty pluginId");return}console.debug(`[PluginContextProvider] fetching meta for "${n}"`),u(null),m.GetPluginMeta(n).then(p=>{console.debug(`[PluginContextProvider] meta loaded for "${n}"`,{name:p==null?void 0:p.name,version:p==null?void 0:p.version}),o(p),c(!0)}).catch(p=>{const C=q(p);console.error(`[PluginContextProvider] error fetching meta for "${n}":`,C.detail),u(C.detail),c(!1)})};return d.useEffect(()=>{console.debug(`[PluginContextProvider] useEffect — pluginId changed to "${n}"`),h(),_()},[n]),l?x.jsx("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center",padding:24},children:x.jsxs("div",{style:{maxWidth:480,width:"100%",border:"1px solid #7F1D1D",borderRadius:8,backgroundColor:"#1C1917",padding:20,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:[x.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[x.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"#EF4444",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[x.jsx("circle",{cx:"12",cy:"12",r:"10"}),x.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),x.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),x.jsx("span",{style:{fontSize:14,fontWeight:600,color:"#FECACA"},children:"Plugin failed to load"})]}),x.jsx("p",{style:{fontSize:13,color:"#A1A1AA",margin:"0 0 16px"},children:l}),x.jsx("button",{onClick:()=>_(),style:{background:"transparent",color:"#F87171",border:"1px solid #7F1D1D",borderRadius:6,padding:"6px 14px",fontSize:13,fontWeight:500,cursor:"pointer"},children:"Retry"})]})}):a?x.jsx(de.Provider,{value:{pluginId:n,settings:r,meta:i},children:t}):x.jsxs("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center"},children:[x.jsx("div",{style:{width:24,height:24,border:"2px solid #3F3F46",borderTopColor:"#A1A1AA",borderRadius:"50%",animation:"plugin-spin 0.8s linear infinite"}}),x.jsx("style",{children:"@keyframes plugin-spin { to { transform: rotate(360deg); } }"})]})}function fe(){const e=d.useContext(de);if(!e)throw new Error("usePluginContext must be used within a PluginContextProvider");return e}function qt(){return fe().settings}const Re=d.createContext(void 0),Qt=({children:e})=>{const[t,n]=d.useState({}),r=()=>{m.Values().then(i=>{console.log("Fetched settings:",i),n(i)}).catch(i=>{console.error("Error fetching settings:",i)})};d.useEffect(()=>{r()},[]);const s=()=>{r()};return x.jsx(Re.Provider,{value:{settings:t,reload:s},children:e})},ot={height:32,focused:0,tabs:[],createTab:()=>{},createTabs:()=>{},updateTab:()=>{},focusTab:()=>{},reorderTab:()=>{},closeTab:()=>{},closeTabs:()=>{},resizeDrawer:()=>{},closeDrawer:()=>{},fullscreenDrawer:()=>{}},it=d.createContext(ot),at=d.createContext(void 0),ct=d.createContext(void 0),Te=d.createContext(void 0),jt=3e4,Ut=({children:e})=>{const[t,n]=d.useState([]),r=d.useCallback(a=>{n(c=>[a,...c])},[]),s=d.useCallback((a,c)=>{n(l=>l.map(u=>u.id===a?{...u,...c}:u))},[]),i=d.useCallback(a=>{n(c=>c.filter(l=>l.id!==a))},[]);d.useEffect(()=>{const a=[];for(const c of t)if(c.status==="completed"||c.status==="error"){const l=Date.now()-(c.completedAt??c.startedAt),u=Math.max(0,jt-l);a.push(setTimeout(()=>i(c.id),u))}return()=>a.forEach(clearTimeout)},[t,i]);const o=d.useMemo(()=>({operations:t,addOperation:r,updateOperation:s,removeOperation:i}),[t,r,s,i]);return x.jsx(Te.Provider,{value:o,children:e})};var ve=function(e,t){return ve=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,r){n.__proto__=r}||function(n,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(n[s]=r[s])},ve(e,t)};function Gt(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");ve(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}var Ce="Invariant Violation",We=Object.setPrototypeOf,zt=We===void 0?function(e,t){return e.__proto__=t,e}:We,Kt=function(e){Gt(t,e);function t(n){n===void 0&&(n=Ce);var r=e.call(this,typeof n=="number"?Ce+": "+n+" (see https://github.com/apollographql/invariant-packages)":n)||this;return r.framesToPop=1,r.name=Ce,zt(r,t.prototype),r}return t}(Error);function be(e,t){if(!e)throw new Kt(t)}var ut=["debug","log","warn","error","silent"],Wt=ut.indexOf("log");function re(e){return function(){if(ut.indexOf(e)>=Wt){var t=console[e]||console.log;return t.apply(console,arguments)}}}(function(e){e.debug=re("debug"),e.log=re("log"),e.warn=re("warn"),e.error=re("error")})(be||(be={}));const lt=d.createContext(void 0),Me=()=>d.useContext(lt),Bt=e=>{const t=Me();return t==null?void 0:t.getExtensionPoint(e)},Ht=e=>{const t=Me(),n=t==null?void 0:t.getExtensionPoint(e);return n?n.provide({getCacheKey:()=>e}):[]},Yt=({registry:e,children:t})=>{const n=d.useRef(e);return d.useEffect(()=>{be(n.current===e,"You can't change the extension registry after it has been rendered")},[e]),x.jsx(lt.Provider,{value:n.current,children:d.Children.only(t)})},Be=e=>{if(!e||typeof e!="string")throw new TypeError(`extensionName is required to be a string and can't be: "${e}" (${typeof e})`);return e.trim()};class dt{constructor(t){L(this,"_settings");L(this,"_extensions",new Map);L(this,"_lookupCache",new Map);L(this,"_matchCache",new Map);L(this,"_matcher");const{matcher:n,...r}=t;this._settings=r,this._matcher=t.matcher}settings(){return this._settings}register(t){if(this._extensions.get(t.id))throw new Error(`Resource sidebar view with id ${t.id} already exists`);const n={...t,registeredAt:new Date,updatedAt:new Date,enabled:!0};this._extensions.set(t.id,n);const r=Array.from(this._matchCache.keys());for(const s of r)s.startsWith(t.plugin)&&this._matchCache.delete(s)}unregister(t){this._extensions.delete(t)}get(t){var n;return(n=this._extensions.get(t))==null?void 0:n.component}list(){return Array.from(this._extensions.values())}generateMatchCacheKey(t){return`${t.plugin}/${t.id}`}calculateMatches(t){if(!this._matcher)return Array.from(this._extensions.values());const n=[];for(const r of this._extensions.values()){const s=this.generateMatchCacheKey(r),i=this._matchCache.has(s);if(i&&this._matchCache.get(s)){n.push(r);continue}this._matcher(t,r)?(this._matchCache.set(s,!0),n.push(r)):i||this._matchCache.set(s,!1)}return n}preload(t){const n=this.calculateMatches(t),r=t.getCacheKey();this._lookupCache.set(r,n.map(s=>s.id))}provide(t){if(this._settings.disabled)return[];if(this._settings.mode==="single"){const i=this._extensions.get(this._settings.selected);return i?[i.component]:[]}const n=t.getCacheKey();let r=this._lookupCache.get(n);if(r){let i=r.map(o=>this._extensions.get(o)).filter(o=>!!o).map(o=>o.component);return this._settings.order&&(i=this.reorderComponents(i,r,this._settings.order)),i}r=this.calculateMatches(t).map(i=>i.id),this._lookupCache.set(n,r);let s=r.map(i=>this._extensions.get(i)).filter(i=>!!i).map(i=>i.component);return this._settings.order&&(s=this.reorderComponents(s,r,this._settings.order)),s}reorderComponents(t,n,r){const s=new Map(n.map((i,o)=>[i,t[o]]));return r.map(i=>s.get(i)).filter(i=>!!i)}reorder(t){const n=t.map(o=>this._extensions.get(o)).filter(o=>!!o),r=Array.from(this._extensions.values()).filter(o=>!t.includes(o.id)),s=[...n,...r];this._extensions.clear(),s.forEach(o=>this._extensions.set(o.id,o));const i=Array.from(this._lookupCache.keys());for(const o of i){const a=this._lookupCache.get(o);if(!a)continue;const c=a.filter(l=>t.includes(l));this._lookupCache.set(o,c)}}clearLookupCache(){this._lookupCache.clear()}clearMatchCache(){this._matchCache.clear()}clearAllCaches(){this.clearLookupCache(),this.clearMatchCache()}}class Jt{constructor({initialStores:t}){L(this,"store",{});t.forEach(n=>{this.addExtensionPoint(n)})}addExtensionPoint(t){let n=Be(t.id);if(console.log("validated",n),console.log("store",this.store),this.store[n]){console.warn(`Extension point ${n} already exists. Not adding again.`);return}this.store[n]=new dt(t)}getExtensionPoint(t){return t=Be(t),this.store[t]}listExtensionPointIds(){return Object.keys(this.store)}listExtensionPoints(){return Object.values(this.store).map(t=>t.settings())}}const ft=d.createContext(void 0),Vt={default:"info",info:"info",success:"success",warning:"warning",error:"error"},Xt=({children:e})=>{const{push:t}=Lt.useNotificationStack(),[n,r]=d.useState([]),s=o=>{r(a=>[...a,o])},i=(o,a,c)=>{const l=typeof o=="object";let u="",h="info",_,p=5e3,C;if(l){if(u=o.message,o.showOnce){if(n.includes(u))return;s(u)}h=o.status,_=o.details,p=o.autoHideDuration??5e3,C=o.actions}else u=o,h=a,_=c;t({severity:Vt[h]??"info",title:u,message:_,timeout:p,actions:C})};return x.jsx(ft.Provider,{value:{showSnackbar:i},children:e})},k=()=>{const e=d.useContext(ft);if(e===void 0)throw new Error("useCustomSnackbar must be used within a CustomSnackbarProvider");return e};function D(e){const t=d.useContext(de),n=(t==null?void 0:t.pluginId)??e;if(!n)throw new Error("pluginID must be provided either via PluginContext or as an explicit parameter");return n}const Zt=({pluginID:e,connectionID:t})=>{const n=D(e),r=g.useQueryClient(),{showSnackbar:s}=k(),i=[n,"connection","detail",t],{mutateAsync:o}=g.useMutation({mutationFn:async()=>m.StartConnection(n,t),onSuccess(h){r.setQueryData(i,h),r.invalidateQueries({queryKey:["EDITOR_SCHEMAS",n,t]})},onError:A(s,"Failed to start connection")}),{mutateAsync:a}=g.useMutation({mutationFn:async()=>m.StopConnection(n,t),onSuccess(h){r.setQueryData(i,h)},onError:A(s,"Failed to stop connection")}),{mutateAsync:c}=g.useMutation({mutationFn:async h=>m.UpdateConnection(n,h),onSuccess(h,{name:_}){s({message:`Connection ${_} successfully updated`,status:"success"}),r.setQueryData(i,u),r.setQueriesData({queryKey:[n,"connection","list"]},p=>p==null?void 0:p.map(C=>C.id===t?h:C))},onError:A(s,"Failed to update connection")}),{mutateAsync:l}=g.useMutation({mutationFn:async()=>m.RemoveConnection(n,t),onSuccess(){s({message:"Connection successfully removed",status:"success"}),r.setQueryData(i,void 0),r.setQueriesData({queryKey:[n,"connection","list"]},h=>h==null?void 0:h.filter(_=>_.id!==t))},onError:A(s,"Failed to remove connection")}),u=g.useQuery({queryKey:i,queryFn:async()=>m.GetConnection(n,t)});return{connection:u,startConnection:o,stopConnection:a,updateConnection:c,deleteConnection:l}},pt=e=>[e,"connection","list"],en=({plugin:e})=>{const t=D(e),n=g.useQueryClient(),{showSnackbar:r}=k(),s=pt(t),{mutateAsync:i}=g.useMutation({mutationFn:async l=>m.StartConnectionInformer(t,l.id),onError:A(r,"Failed to start connection informer")}),{mutateAsync:o}=g.useMutation({mutationFn:async l=>m.StopConnectionInformer(t,l.id),onError:A(r,"Failed to stop connection informer")}),a=d.useCallback(l=>{console.log("got update to connections",l),n.setQueryData(s,l)},[]);return d.useEffect(()=>{const l=I.EventsOn(`${t}/connection/sync`,a);return()=>{l()}},[]),{connections:g.useQuery({queryKey:s,queryFn:async()=>{try{return await m.ListConnections(t)}catch(l){console.log(l),A(r,"Failed to load connections")(l)}return[]},staleTime:3e4,placeholderData:g.keepPreviousData}),startInformer:i,stopInformer:o}},tn=({pluginID:e,connectionID:t})=>{const n=D(e),r=[n,"connection","namespaces",t];return{namespaces:g.useQuery({queryKey:r,queryFn:async()=>m.GetConnectionNamespaces(n,t)})}};var yt=(e=>(e[e.OnConnect=0]="OnConnect",e[e.OnFirstQuery=1]="OnFirstQuery",e[e.Never=2]="Never",e))(yt||{}),O=(e=>(e[e.Pending=0]="Pending",e[e.Syncing=1]="Syncing",e[e.Synced=2]="Synced",e[e.Error=3]="Error",e[e.Cancelled=4]="Cancelled",e))(O||{});function ht(e){const t=Object.values(e.states),n=t.length;let r=0,s=0;for(const a of t)a===O.Synced&&r++,a===O.Error&&s++;const i=t.filter(a=>a===O.Synced||a===O.Error||a===O.Cancelled).length,o=n>0?i/n:0;return{pluginID:e.pluginID,connectionID:e.connectionID,totalResources:n,syncedCount:r,errorCount:s,doneCount:i,progress:o}}function ae(e){return e.totalResources>0&&e.doneCount>=e.totalResources}function gt(e){return e.some(t=>!ae(t))}function mt(e){const t=e.reduce((r,s)=>r+s.totalResources,0);return t===0?0:e.reduce((r,s)=>r+s.doneCount,0)/t}function Ne(e){return`${e.pluginId}/${e.connection}`}function _t(e,t){const n=Ne(t);e.has(n)||e.set(n,{states:{},pluginID:t.pluginId,connectionID:t.connection});const r=e.get(n);return r.states[t.resourceKey]=t.state,r}function nn(){const[e,t]=d.useState(new Set),[n,r]=d.useState({}),[s,i]=d.useState(new Map),o=d.useRef(new Map);d.useEffect(()=>{m.ListAllConnections().then(y=>{y&&r(y)}).catch(()=>{})},[]),d.useEffect(()=>I.EventsOn("connection/status",E=>{const w=`${E.pluginID}/${E.connectionID}`;E.status==="DISCONNECTED"?(t(P=>{const f=new Set(P);return f.delete(w),f}),i(P=>{const f=new Map(P);return f.delete(w),f}),o.current.delete(w)):t(P=>{const f=new Set(P);return f.add(w),f}),m.ListAllConnections().then(P=>{P&&r(P)}).catch(()=>{})}),[]);const a=d.useCallback(y=>{const E=Ne(y);t(f=>{if(f.has(E))return f;const S=new Set(f);return S.add(E),S});const w=_t(o.current,y),P=ht(w);i(f=>{const S=new Map(f);return S.set(E,P),S})},[]);d.useEffect(()=>I.EventsOn("informer/STATE",a),[a]);const c=d.useCallback(async(y,E)=>{await m.StopConnection(y,E)},[]),l=d.useCallback(async(y,E)=>{await m.StartConnectionInformer(y,E)},[]),u=[];for(const y of e){const[E,w]=y.split("/",2),f=(n[E]??[]).find(N=>N.id===w),S=s.get(y),b=S!=null&&!ae(S),v=S!=null&&S.errorCount>0;u.push({pluginID:E,connectionID:w,name:(f==null?void 0:f.name)??w,avatar:(f==null?void 0:f.avatar)??"",isStarted:!0,sync:S,isSyncing:b,hasErrors:v})}const h=new Map;for(const y of u){const E=h.get(y.pluginID)??[];E.push(y),h.set(y.pluginID,E)}const _=Array.from(s.values()),p=u.filter(y=>y.isSyncing),C=u.filter(y=>y.hasErrors);return{entries:u,grouped:h,connectedCount:u.length,syncingCount:p.length,errorCount:C.length,hasSyncing:gt(_),aggregateProgress:mt(_),disconnect:c,retryInformer:l}}function rn(e,t){return window.go.data.Client.Get(e,t)}function sn(e,t,n){return window.go.data.Client.Set(e,t,n)}function on(e,t,n){const r=D(e),s=g.useQueryClient(),i=[r,"data",t],o=g.useQuery({queryKey:i,queryFn:async()=>{const c=await rn(r,t);return c??n}}),a=g.useMutation({mutationFn:async c=>{await sn(r,t,c)},onMutate:async c=>{await s.cancelQueries({queryKey:i});const l=s.getQueryData(i);return s.setQueryData(i,c),{previous:l}},onError:(c,l,u)=>{(u==null?void 0:u.previous)!==void 0&&s.setQueryData(i,u.previous)},onSettled:()=>{s.invalidateQueries({queryKey:i})}});return{data:o.data??n,update:async c=>{await a.mutateAsync(c)},isLoading:o.isLoading}}const an=()=>{const e=d.useContext(at);if(!e)throw new Error("useRightDrawer must be used within a RightDrawerProvider");return e},ke=()=>{const e=d.useContext(it);if(e===void 0)throw new Error("useBottomDrawer must be used within a BottomDrawerProvider");return e},cn=({pluginID:e})=>{const t=D(e),{showSnackbar:n}=k(),{createTab:r,updateTab:s}=ke();return{createSession:g.useMutation({mutationFn:async({connectionID:o,icon:a,label:c,opts:l})=>{const u=`pending-${crypto.randomUUID()}`;r({id:u,title:c??"Connecting...",variant:"terminal",icon:a??"LuSquareTerminal",properties:{status:"connecting",pluginID:t,connectionID:o,opts:{...l}}});const h=F.exec.SessionOptions.createFrom({command:["/bin/bash"],tty:!0,...l});try{const _=await m.CreateSession(t,o,h);s({id:u},{id:_.id,title:c??`Session ${_.id.substring(0,8)}`,properties:{status:"connected",pluginID:t,connectionID:o,opts:{...l}}})}catch(_){const p=q(_);s({id:u},{properties:{status:"error",error:p.detail,pluginID:t,connectionID:o,opts:{...l}}}),U(n,_,"Failed to start session")}}}).mutateAsync}},un=({pluginID:e})=>{const t=D(e),{showSnackbar:n}=k(),{createTab:r}=ke(),s=g.useMutation({mutationFn:async({connectionID:o,resourceKey:a,resourceID:c,resourceData:l,icon:u,label:h,target:_,follow:p=!0,tailLines:C=1e3,params:y})=>{const E=F.logs.CreateSessionOptions.createFrom({resource_key:a,resource_id:c,resource_data:l,options:F.logs.LogSessionOptions.createFrom({target:_??"",follow:p,include_previous:!1,include_timestamps:!0,tail_lines:C,since_seconds:0,limit_bytes:0,include_source_events:!0,params:y??{}})}),w=await m.CreateSession$1(t,o,E);return r({id:w.id,title:h??`Logs ${w.id.substring(0,8)}`,variant:"logs",icon:u??"LuLogs"}),w},onError:A(n,"Failed to start log session")}),i=g.useMutation({mutationFn:async o=>{await m.CloseSession(o)},onError:A(n,"Failed to close log session")});return{createLogSession:s.mutateAsync,closeLogSession:i.mutateAsync}},ln=()=>g.useQuery({queryKey:["metric","providers"],queryFn:m.GetProviders,staleTime:3e4}),Ct=e=>g.useQuery({queryKey:["metric","providers",e],queryFn:()=>m.GetProvidersForResource(e),enabled:!!e,staleTime:3e4}),dn=e=>{var E,w;const{connectionID:t,resourceKey:n,resourceID:r,resourceNamespace:s="",resourceData:i={},metricIDs:o=[],shape:a=0,timeRange:c,refreshInterval:l=0,enabled:u=!0}=e,{data:h,isLoading:_}=Ct(n),p=h??[],C=c?Math.max(Math.floor((c.end.getTime()-c.start.getTime())/250),15e3)*1e6:0,y=g.useQuery({queryKey:["metric","query",t,n,r,s,o,a,(E=c==null?void 0:c.start)==null?void 0:E.getTime(),(w=c==null?void 0:c.end)==null?void 0:w.getTime()],queryFn:()=>m.QueryAll(t,n,r,s,i,o,a,(c==null?void 0:c.start)??new Date(0),(c==null?void 0:c.end)??new Date(0),C),enabled:u&&!!t&&!!n&&(n.startsWith("cluster::")||!!r)&&p.length>0,refetchInterval:l>0?l:void 0,staleTime:5e3,placeholderData:g.keepPreviousData});return{data:y.data??void 0,providers:p,isLoading:_||y.isLoading,error:y.error,refetch:y.refetch}},fn=e=>{const{pluginID:t,connectionID:n,resourceKey:r,resourceID:s,resourceNamespace:i="",resourceData:o={},metricIDs:a=[],interval:c=1e4,enabled:l=!0}=e,u=D(t),[h,_]=d.useState(null),[p,C]=d.useState(null),[y,E]=d.useState(!1),[w,P]=d.useState(null),f=d.useRef(null),S=d.useCallback(async()=>{if(!(!l||!u||!n||!r||!s))try{const v=await m.Subscribe(u,n,{resource_key:r,resource_id:s,resource_namespace:i,resource_data:o,metric_ids:a,interval:c*1e6});C(v),E(!0),P(null);const N=I.EventsOn(`core/metrics/data/${v}`,B=>{try{const $=JSON.parse(B);$.results&&_($.results)}catch($){console.error("Failed to parse metric stream data:",$)}}),ne=I.EventsOn(`core/metrics/error/${v}`,B=>{try{const $=JSON.parse(B);P($.error||"Unknown error")}catch{P("Failed to parse metric stream error")}});f.current=()=>{N(),ne()}}catch(v){P(v instanceof Error?v.message:String(v))}},[u,n,r,s,i,a,c,l]),b=d.useCallback(async()=>{if(p)try{await m.Unsubscribe(p)}catch(v){console.error("Failed to unsubscribe:",v)}f.current&&(f.current(),f.current=null),C(null),E(!1)},[p]);return d.useEffect(()=>()=>{p&&m.Unsubscribe(p).catch(console.error),f.current&&f.current()},[p]),{data:h,subscriptionID:p,isStreaming:y,error:w,start:S,stop:b}},j=["networker","portforward","all-sessions"];function pn(){const{showSnackbar:e}=k(),t=g.useQueryClient(),n=g.useQuery({queryKey:[...j],queryFn:async()=>m.ListAllPortForwardSessions().catch(i=>{if(q(i).detail.includes("not found"))return[];throw i}),retry:!1});d.useEffect(()=>{const i=I.EventsOn("core/networker/portforward/created",()=>{t.invalidateQueries({queryKey:[...j]})}),o=I.EventsOn("core/networker/portforward/closed",()=>{t.invalidateQueries({queryKey:[...j]})});return()=>{i(),o()}},[t]);const r=n.data??[],s=g.useMutation({mutationFn:async i=>m.ClosePortForwardSession(i),onError:A(e,"Failed to close port forwarding session"),onSuccess:async()=>{await t.invalidateQueries({queryKey:[...j]})}});return{sessions:n,activeSessions:r,closeSession:s.mutateAsync,openInBrowser:i=>I.BrowserOpenURL(`http://localhost:${i}`)}}function yn({pluginID:e,connectionID:t,resourceID:n}){const r=D(e),s=["networker","portforward","sessions",r,t,n],{showSnackbar:i}=k(),o=g.useQueryClient(),a=g.useQuery({queryKey:s,queryFn:async()=>m.FindPortForwardSessions(r,t,F.networker.FindPortForwardSessionRequest.createFrom({resource_id:n,connection_id:t})).catch(u=>{const h=q(u);return h.detail.includes("not found")?[]:(i({message:"Failed to fetch port forward sessions",status:"error",details:h.detail}),[])}),retry:!1}),c=g.useMutation({mutationFn:async({opts:u})=>{const h=F.networker.PortForwardSessionOptions.createFrom({local_port:u.localPort||0,remote_port:u.remotePort,protocol:u.protocol||"TCP",connection_type:"RESOURCE",connection:{resource_data:u.resource,connection_id:t,plugin_id:r,resource_id:u.resourceId,resource_key:u.resourceKey},labels:u.labels??{},params:u.parameters??{}}),_=await m.StartResourcePortForwardingSession(r,t,h);return u.openInBrowser&&I.BrowserOpenURL(`http://localhost:${_.local_port}`),_},onError:A(i,"Failed to start port forwarding session"),onSuccess:async()=>{await Promise.all([o.invalidateQueries({queryKey:s}),o.invalidateQueries({queryKey:[...j]})])}}),l=g.useMutation({mutationFn:async({opts:u})=>m.ClosePortForwardSession(u.sessionID),onError:A(i,"Failed to close port forwarding session"),onSuccess:async()=>{await Promise.all([o.invalidateQueries({queryKey:s}),o.invalidateQueries({queryKey:[...j]})])}});return{sessions:a,forward:c.mutateAsync,close:l.mutateAsync}}const hn=()=>{const e=d.useContext(ct);if(!e)throw new Error("useConfirmationModal must be used within a ConfirmationModalProvider");return e},gn=({pluginID:e,connectionID:t,resourceKey:n,resourceID:r,namespace:s="",getParams:i={},updateParams:o={},deleteParams:a={}})=>{const c=D(e),l=g.useQueryClient(),{showSnackbar:u}=k(),h=["RESOURCE",c,t,n,r,s],{mutateAsync:_}=g.useMutation({mutationFn:async y=>m.Update(c,t,n,F.types.UpdateInput.createFrom({params:{...o,...y.params},input:{...o,...y.input},id:r,namespace:s})),onSuccess:async()=>{u(`Resource ${r} updated`,"success"),await l.invalidateQueries({queryKey:h})},onError:A(u,`Failed to update resource ${r}`)}),{mutateAsync:p}=g.useMutation({mutationFn:async y=>m.Delete(c,t,n,F.types.DeleteInput.createFrom({params:{...a,...y.params},input:{...a,...y.input},id:r,...y,namespace:s})),onSuccess:async()=>{u(`Resource ${r} deleted`,"success"),await l.invalidateQueries({queryKey:h})},onError:A(u,`Failed to delete resource ${r}`)});return{resource:g.useQuery({queryKey:h,queryFn:async()=>m.Get(c,t,n,F.types.GetInput.createFrom({params:i,id:r,namespace:s})),retry:!1}),update:_,remove:p}},mn=e=>{const t=["component",e.plugin,e.resource,e.area];return{component:g.useQuery({queryKey:t,queryFn:async()=>m.GetResourceAreaComponent(e)})}},_n=({pluginID:e,connectionID:t})=>{const n=D(e),r=[n,"resource_groups","list"];return{groups:g.useQuery({queryKey:r,queryFn:async()=>m.GetResourceGroups(n,t),retry:!1})}},Cn=({pluginID:e,connectionID:t,searches:n})=>{const r=D(e),s=o=>[r,t,o.key,o.namespaces,"list"];return g.useQueries({queries:n.map(o=>({queryKey:s(o),queryFn:async()=>m.List(r,t,o.key,F.types.ListInput.createFrom({params:{},order:{by:"name",direction:!0},pagination:{page:1,pageSize:200},namespaces:o.namespaces})).then(a=>(console.log(a.result),a.result&&o.postFilter?Object.values(a.result).filter(o.postFilter):Object.values(a.result||{}))),retry:!1}))})},Sn=({pluginID:e,resourceKey:t})=>{const n=D(e),r=[n,"resources",t];return{resourceType:g.useQuery({queryKey:r,queryFn:async()=>m.GetResourceType(n,t),retry:!1})}},wn=({pluginID:e,connectionID:t})=>{const n=D(e),r=[n,"resources","list"];return{types:g.useQuery({queryKey:r,queryFn:async()=>m.GetResourceTypes(n,t),retry:!1})}};var St=Symbol.for("immer-nothing"),He=Symbol.for("immer-draftable"),T=Symbol.for("immer-state"),En=process.env.NODE_ENV!=="production"?[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}]:[];function R(e,...t){if(process.env.NODE_ENV!=="production"){const n=En[e],r=typeof n=="function"?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Y=Object.getPrototypeOf;function J(e){return!!e&&!!e[T]}function G(e){var t;return e?wt(e)||Array.isArray(e)||!!e[He]||!!((t=e.constructor)!=null&&t[He])||ye(e)||he(e):!1}var vn=Object.prototype.constructor.toString();function wt(e){if(!e||typeof e!="object")return!1;const t=Y(e);if(t===null)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object?!0:typeof n=="function"&&Function.toString.call(n)===vn}function ce(e,t){pe(e)===0?Reflect.ownKeys(e).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function pe(e){const t=e[T];return t?t.type_:Array.isArray(e)?1:ye(e)?2:he(e)?3:0}function Pe(e,t){return pe(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function Et(e,t,n){const r=pe(e);r===2?e.set(t,n):r===3?e.add(n):e[t]=n}function bn(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function ye(e){return e instanceof Map}function he(e){return e instanceof Set}function Q(e){return e.copy_||e.base_}function xe(e,t){if(ye(e))return new Map(e);if(he(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=wt(e);if(t===!0||t==="class_only"&&!n){const r=Object.getOwnPropertyDescriptors(e);delete r[T];let s=Reflect.ownKeys(r);for(let i=0;i<s.length;i++){const o=s[i],a=r[o];a.writable===!1&&(a.writable=!0,a.configurable=!0),(a.get||a.set)&&(r[o]={configurable:!0,writable:!0,enumerable:a.enumerable,value:e[o]})}return Object.create(Y(e),r)}else{const r=Y(e);if(r!==null&&n)return{...e};const s=Object.create(r);return Object.assign(s,e)}}function Le(e,t=!1){return ge(e)||J(e)||!G(e)||(pe(e)>1&&(e.set=e.add=e.clear=e.delete=Pn),Object.freeze(e),t&&Object.entries(e).forEach(([n,r])=>Le(r,!0))),e}function Pn(){R(2)}function ge(e){return Object.isFrozen(e)}var xn={};function z(e){const t=xn[e];return t||R(0,e),t}var Z;function vt(){return Z}function Dn(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Ye(e,t){t&&(z("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function De(e){Fe(e),e.drafts_.forEach(Fn),e.drafts_=null}function Fe(e){e===Z&&(Z=e.parent_)}function Je(e){return Z=Dn(Z,e)}function Fn(e){const t=e[T];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Ve(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return e!==void 0&&e!==n?(n[T].modified_&&(De(t),R(4)),G(e)&&(e=ue(t,e),t.parent_||le(t,e)),t.patches_&&z("Patches").generateReplacementPatches_(n[T].base_,e,t.patches_,t.inversePatches_)):e=ue(t,n,[]),De(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==St?e:void 0}function ue(e,t,n){if(ge(t))return t;const r=t[T];if(!r)return ce(t,(s,i)=>Xe(e,r,t,s,i,n)),t;if(r.scope_!==e)return t;if(!r.modified_)return le(e,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;const s=r.copy_;let i=s,o=!1;r.type_===3&&(i=new Set(s),s.clear(),o=!0),ce(i,(a,c)=>Xe(e,r,s,a,c,n,o)),le(e,s,!1),n&&e.patches_&&z("Patches").generatePatches_(r,n,e.patches_,e.inversePatches_)}return r.copy_}function Xe(e,t,n,r,s,i,o){if(process.env.NODE_ENV!=="production"&&s===n&&R(5),J(s)){const a=i&&t&&t.type_!==3&&!Pe(t.assigned_,r)?i.concat(r):void 0,c=ue(e,s,a);if(Et(n,r,c),J(c))e.canAutoFreeze_=!1;else return}else o&&n.add(s);if(G(s)&&!ge(s)){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;ue(e,s),(!t||!t.scope_.parent_)&&typeof r!="symbol"&&Object.prototype.propertyIsEnumerable.call(n,r)&&le(e,s)}}function le(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Le(t,n)}function In(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:vt(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let s=r,i=$e;n&&(s=[r],i=ee);const{revoke:o,proxy:a}=Proxy.revocable(s,i);return r.draft_=a,r.revoke_=o,a}var $e={get(e,t){if(t===T)return e;const n=Q(e);if(!Pe(n,t))return On(e,n,t);const r=n[t];return e.finalized_||!G(r)?r:r===Se(e.base_,t)?(we(e),e.copy_[t]=Oe(r,e)):r},has(e,t){return t in Q(e)},ownKeys(e){return Reflect.ownKeys(Q(e))},set(e,t,n){const r=bt(Q(e),t);if(r!=null&&r.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const s=Se(Q(e),t),i=s==null?void 0:s[T];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(bn(n,s)&&(n!==void 0||Pe(e.base_,t)))return!0;we(e),Ie(e)}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty(e,t){return Se(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,we(e),Ie(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const n=Q(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:r.enumerable,value:n[t]}},defineProperty(){R(11)},getPrototypeOf(e){return Y(e.base_)},setPrototypeOf(){R(12)}},ee={};ce($e,(e,t)=>{ee[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});ee.deleteProperty=function(e,t){return process.env.NODE_ENV!=="production"&&isNaN(parseInt(t))&&R(13),ee.set.call(this,e,t,void 0)};ee.set=function(e,t,n){return process.env.NODE_ENV!=="production"&&t!=="length"&&isNaN(parseInt(t))&&R(14),$e.set.call(this,e[0],t,n,e[0])};function Se(e,t){const n=e[T];return(n?Q(n):e)[t]}function On(e,t,n){var s;const r=bt(t,n);return r?"value"in r?r.value:(s=r.get)==null?void 0:s.call(e.draft_):void 0}function bt(e,t){if(!(t in e))return;let n=Y(e);for(;n;){const r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Y(n)}}function Ie(e){e.modified_||(e.modified_=!0,e.parent_&&Ie(e.parent_))}function we(e){e.copy_||(e.copy_=xe(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var An=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(t,n,r)=>{if(typeof t=="function"&&typeof n!="function"){const i=n;n=t;const o=this;return function(c=i,...l){return o.produce(c,u=>n.call(this,u,...l))}}typeof n!="function"&&R(6),r!==void 0&&typeof r!="function"&&R(7);let s;if(G(t)){const i=Je(this),o=Oe(t,void 0);let a=!0;try{s=n(o),a=!1}finally{a?De(i):Fe(i)}return Ye(i,r),Ve(s,i)}else if(!t||typeof t!="object"){if(s=n(t),s===void 0&&(s=t),s===St&&(s=void 0),this.autoFreeze_&&Le(s,!0),r){const i=[],o=[];z("Patches").generateReplacementPatches_(t,s,i,o),r(i,o)}return s}else R(1,t)},this.produceWithPatches=(t,n)=>{if(typeof t=="function")return(o,...a)=>this.produceWithPatches(o,c=>t(c,...a));let r,s;return[this.produce(t,n,(o,a)=>{r=o,s=a}),r,s]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy)}createDraft(e){G(e)||R(8),J(e)&&(e=Rn(e));const t=Je(this),n=Oe(e,void 0);return n[T].isManual_=!0,Fe(t),n}finishDraft(e,t){const n=e&&e[T];(!n||!n.isManual_)&&R(9);const{scope_:r}=n;return Ye(r,t),Ve(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const s=t[n];if(s.path.length===0&&s.op==="replace"){e=s.value;break}}n>-1&&(t=t.slice(n+1));const r=z("Patches").applyPatches_;return J(e)?r(e,t):this.produce(e,s=>r(s,t))}};function Oe(e,t){const n=ye(e)?z("MapSet").proxyMap_(e,t):he(e)?z("MapSet").proxySet_(e,t):In(e,t);return(t?t.scope_:vt()).drafts_.push(n),n}function Rn(e){return J(e)||R(10,e),Pt(e)}function Pt(e){if(!G(e)||ge(e))return e;const t=e[T];let n;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=xe(e,t.scope_.immer_.useStrictShallowCopy_)}else n=xe(e,!0);return ce(n,(r,s)=>{Et(n,r,Pt(s))}),t&&(t.finalized_=!1),n}var M=new An,oe=M.produce;M.produceWithPatches.bind(M);M.setAutoFreeze.bind(M);M.setUseStrictShallowCopy.bind(M);M.applyPatches.bind(M);M.createDraft.bind(M);M.finishDraft.bind(M);var se=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Tn(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Mn="Expected a function",xt="__lodash_hash_undefined__",Nn="[object Function]",kn="[object GeneratorFunction]",Ln="[object Symbol]",$n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,qn=/^\w*$/,Qn=/^\./,jn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Un=/[\\^$.*+?()[\]{}|]/g,Gn=/\\(\\)?/g,zn=/^\[object .+?Constructor\]$/,Kn=typeof se=="object"&&se&&se.Object===Object&&se,Wn=typeof self=="object"&&self&&self.Object===Object&&self,qe=Kn||Wn||Function("return this")();function Bn(e,t){return e==null?void 0:e[t]}function Hn(e){var t=!1;if(e!=null&&typeof e.toString!="function")try{t=!!(e+"")}catch{}return t}var Yn=Array.prototype,Jn=Function.prototype,Dt=Object.prototype,Ee=qe["__core-js_shared__"],Ze=function(){var e=/[^.]+$/.exec(Ee&&Ee.keys&&Ee.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),Ft=Jn.toString,Qe=Dt.hasOwnProperty,It=Dt.toString,Vn=RegExp("^"+Ft.call(Qe).replace(Un,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),et=qe.Symbol,Xn=Yn.splice,Zn=Ot(qe,"Map"),te=Ot(Object,"create"),tt=et?et.prototype:void 0,nt=tt?tt.toString:void 0;function K(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function er(){this.__data__=te?te(null):{}}function tr(e){return this.has(e)&&delete this.__data__[e]}function nr(e){var t=this.__data__;if(te){var n=t[e];return n===xt?void 0:n}return Qe.call(t,e)?t[e]:void 0}function rr(e){var t=this.__data__;return te?t[e]!==void 0:Qe.call(t,e)}function sr(e,t){var n=this.__data__;return n[e]=te&&t===void 0?xt:t,this}K.prototype.clear=er;K.prototype.delete=tr;K.prototype.get=nr;K.prototype.has=rr;K.prototype.set=sr;function V(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function or(){this.__data__=[]}function ir(e){var t=this.__data__,n=me(t,e);if(n<0)return!1;var r=t.length-1;return n==r?t.pop():Xn.call(t,n,1),!0}function ar(e){var t=this.__data__,n=me(t,e);return n<0?void 0:t[n][1]}function cr(e){return me(this.__data__,e)>-1}function ur(e,t){var n=this.__data__,r=me(n,e);return r<0?n.push([e,t]):n[r][1]=t,this}V.prototype.clear=or;V.prototype.delete=ir;V.prototype.get=ar;V.prototype.has=cr;V.prototype.set=ur;function W(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function lr(){this.__data__={hash:new K,map:new(Zn||V),string:new K}}function dr(e){return _e(this,e).delete(e)}function fr(e){return _e(this,e).get(e)}function pr(e){return _e(this,e).has(e)}function yr(e,t){return _e(this,e).set(e,t),this}W.prototype.clear=lr;W.prototype.delete=dr;W.prototype.get=fr;W.prototype.has=pr;W.prototype.set=yr;function me(e,t){for(var n=e.length;n--;)if(Pr(e[n][0],t))return n;return-1}function hr(e,t){t=Cr(t,e)?[t]:_r(t);for(var n=0,r=t.length;e!=null&&n<r;)e=e[vr(t[n++])];return n&&n==r?e:void 0}function gr(e){if(!Rt(e)||wr(e))return!1;var t=xr(e)||Hn(e)?Vn:zn;return t.test(br(e))}function mr(e){if(typeof e=="string")return e;if(Ue(e))return nt?nt.call(e):"";var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}function _r(e){return At(e)?e:Er(e)}function _e(e,t){var n=e.__data__;return Sr(t)?n[typeof t=="string"?"string":"hash"]:n.map}function Ot(e,t){var n=Bn(e,t);return gr(n)?n:void 0}function Cr(e,t){if(At(e))return!1;var n=typeof e;return n=="number"||n=="symbol"||n=="boolean"||e==null||Ue(e)?!0:qn.test(e)||!$n.test(e)||t!=null&&e in Object(t)}function Sr(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}function wr(e){return!!Ze&&Ze in e}var Er=je(function(e){e=Fr(e);var t=[];return Qn.test(e)&&t.push(""),e.replace(jn,function(n,r,s,i){t.push(s?i.replace(Gn,"$1"):r||n)}),t});function vr(e){if(typeof e=="string"||Ue(e))return e;var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}function br(e){if(e!=null){try{return Ft.call(e)}catch{}try{return e+""}catch{}}return""}function je(e,t){if(typeof e!="function"||t&&typeof t!="function")throw new TypeError(Mn);var n=function(){var r=arguments,s=t?t.apply(this,r):r[0],i=n.cache;if(i.has(s))return i.get(s);var o=e.apply(this,r);return n.cache=i.set(s,o),o};return n.cache=new(je.Cache||W),n}je.Cache=W;function Pr(e,t){return e===t||e!==e&&t!==t}var At=Array.isArray;function xr(e){var t=Rt(e)?It.call(e):"";return t==Nn||t==kn}function Rt(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function Dr(e){return!!e&&typeof e=="object"}function Ue(e){return typeof e=="symbol"||Dr(e)&&It.call(e)==Ln}function Fr(e){return e==null?"":mr(e)}function Ir(e,t,n){var r=e==null?void 0:hr(e,t);return r===void 0?n:r}var Or=Ir;const H=Tn(Or),Ar=({pluginID:e,connectionID:t,resourceKey:n,idAccessor:r,namespaces:s=[],listParams:i={},createParams:o={}})=>{const a=D(e),c=g.useQueryClient(),{showSnackbar:l}=k(),u=[a,t,n,s,"list"],h=(f,S)=>[a,t,n,S,f],{mutateAsync:_}=g.useMutation({mutationFn:async f=>m.Create(a,t,n,F.types.CreateInput.createFrom({params:f.params||o,input:f.input,namespaces:s})),onSuccess:async f=>{var v,N,ne,B,$,Ge,ze,Ke;let S="";(v=f.result.metadata)!=null&&v.name?S=f.result.metadata.name:(N=f.result)!=null&&N.id?S=(ne=f.result)==null?void 0:ne.id:(B=f.result)!=null&&B.name?S=($=f.result)==null?void 0:$.name:(Ge=f.result)!=null&&Ge.ID?S=(ze=f.result)==null?void 0:ze.ID:(Ke=f.result)!=null&&Ke.Name&&(S=f.result.Name);const b=S?`Resource ${S} created`:"Resource created";l(b,"success"),await c.invalidateQueries({queryKey:u})},onError:A(l,"Failed to create resource")}),p=g.useQuery({queryKey:u,queryFn:async()=>m.List(a,t,n,F.types.ListInput.createFrom({params:i,order:{by:"name",direction:!0},pagination:{page:1,pageSize:200},namespaces:s})),placeholderData:(f,S)=>f,retry:!1}),C=d.useCallback(f=>{r&&(c.setQueryData(u,S=>oe(S,b=>{if(b||(b=F.types.ListResult.createFrom({result:[],success:!0,pagination:{}})),b.result.findIndex(N=>H(f.data,r)===H(N,r))===-1){b.result.push(f.data);return}})),c.setQueryData(h(f.id,f.namespace),{result:f.data}))},[]),y=d.useCallback(f=>{r&&(c.setQueryData(u,S=>oe(S,b=>{b||(b=F.types.ListResult.createFrom({result:[],success:!0,pagination:{}}));const v=b.result.findIndex(N=>H(f.newData,r)===H(N,r));if(v!==-1){b.result[v]=f.newData;return}})),c.setQueryData(h(f.id,f.namespace),{result:f.newData}))},[]),E=d.useCallback(f=>{r&&c.setQueryData(u,S=>oe(S,b=>{if(!b)return;const v=b.result.findIndex(N=>H(f.data,r)===H(N,r));if(v!==-1){b.result.splice(v,1);return}}))},[]);d.useEffect(()=>{if(!r)return;let f=!1;m.SubscribeResource(a,t,n).then(()=>{f||c.invalidateQueries({queryKey:u})});const S=I.EventsOn(`${a}/${t}/${n}/ADD`,C),b=I.EventsOn(`${a}/${t}/${n}/UPDATE`,y),v=I.EventsOn(`${a}/${t}/${n}/DELETE`,E);return()=>{f=!0,S(),b(),v(),m.UnsubscribeResource(a,t,n)}},[a,t,n]);const[w,P]=d.useState(O.Pending);return d.useEffect(()=>I.EventsOn(`${a}/${t}/informer/STATE`,S=>{S.resourceKey===n&&P(S.state)}),[a,t,n]),{resources:p,create:_,informerState:w,isSyncing:w===O.Syncing,isSynced:w===O.Synced,informerError:w===O.Error}},Rr=({pluginID:e})=>{const t=D(e),{showSnackbar:n}=k(),r=g.useMutation({mutationFn:async({opts:o,input:a})=>m.Create(t,o.connectionID,o.resourceKey,F.types.CreateInput.createFrom({params:{...o.params,...a.params},input:{...o.params,...a.input},id:o.resourceID,namespace:o.namespace})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} created`,"success")},onError(o,{opts:a}){U(n,o,`Failed to create resource ${a.resourceID}`)}}),s=g.useMutation({mutationFn:async({opts:o,input:a})=>m.Update(t,o.connectionID,o.resourceKey,F.types.UpdateInput.createFrom({params:{...o.params,...a.params},input:{...o.params,...a.input},id:o.resourceID,namespace:o.namespace})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} updated`,"success")},onError(o,{opts:a}){U(n,o,`Failed to update resource ${a.resourceID}`)}}),i=g.useMutation({mutationFn:async({opts:o,input:a})=>m.Delete(t,o.connectionID,o.resourceKey,F.types.DeleteInput.createFrom({...a,params:{...o.params,...a.params},input:{...o.params,...a.input},id:o.resourceID,namespace:o.namespace})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} deleted`,"success")},onError(o,{opts:a}){U(n,o,`Failed to delete resource ${a.resourceID}`)}});return{create:r.mutateAsync,update:s.mutateAsync,remove:i.mutateAsync}},Tr=({pluginID:e,connectionID:t,resourceKey:n,enabled:r=!0})=>{const s=D(e),i=g.useQuery({queryKey:["RESOURCE_ACTIONS",s,t,n],queryFn:()=>m.GetActions(s,t,n),enabled:r&&!!s&&!!t&&!!n,staleTime:5*60*1e3});return{actions:i.data??[],isLoading:i.isLoading,error:i.error}},Mr=({pluginID:e,connectionID:t,resourceKey:n})=>{const r=D(e),s=g.useQueryClient(),{showSnackbar:i}=k(),o=g.useMutation({mutationFn:async({actionID:a,id:c="",namespace:l="",params:u={}})=>m.ExecuteAction(r,t,n,a,F.types.ActionInput.createFrom({id:c,namespace:l,params:u})),onSuccess:a=>{a.message&&i(a.message,"success"),s.invalidateQueries({queryKey:["RESOURCES",r,t,n]})},onError:(a,c)=>{U(i,a,`Failed to execute action "${c.actionID}"`)}});return{executeAction:o.mutateAsync,isExecuting:o.isPending,error:o.error}},Nr=({pluginID:e,connectionID:t,enabled:n=!0})=>{const r=D(e),s=g.useQuery({queryKey:["EDITOR_SCHEMAS",r,t],queryFn:()=>m.GetEditorSchemas(r,t),enabled:n&&!!r&&!!t,staleTime:10*60*1e3,retry:1});return{schemas:s.data??[],isLoading:s.isLoading,error:s.error,refetch:s.refetch}},kr=({pluginID:e,connectionID:t,enabled:n=!0})=>{const r=D(e),s=g.useQueryClient(),i=[r,t,"informer-state"],o=g.useQuery({queryKey:i,queryFn:()=>m.GetInformerState(r,t),enabled:n&&!!r&&!!t});d.useEffect(()=>!n||!r||!t?void 0:I.EventsOn(`${r}/${t}/informer/STATE`,u=>{s.setQueryData(i,h=>h&&oe(h,_=>{_.resources[u.resourceKey]=u.state,_.resourceCounts[u.resourceKey]=u.resourceCount;let p=0,C=0;for(const y of Object.values(_.resources))y===O.Synced&&p++,y===O.Error&&C++;_.syncedCount=p,_.errorCount=C}))}),[r,t,n]);const a=o.data;let c=0;if(a!=null&&a.resources)for(const l of Object.values(a.resources))(l===O.Synced||l===O.Error||l===O.Cancelled)&&c++;return{summary:o,getResourceState:l=>a==null?void 0:a.resources[l],isFullySynced:a?a.totalResources>0&&c===a.totalResources:!1,syncProgress:a&&a.totalResources>0?c/a.totalResources:0,errorCount:(a==null?void 0:a.errorCount)??0}},Lr=()=>{const[e,t]=d.useState(new Map),n=d.useRef(new Map),r=d.useRef(new Map),s=d.useCallback(l=>{const u=Ne(l),h=_t(n.current,l),_=ht(h);if(t(p=>{const C=new Map(p);return C.set(u,_),C}),r.current.has(u)&&(clearTimeout(r.current.get(u)),r.current.delete(u)),ae(_)){const p=setTimeout(()=>{t(C=>{const y=new Map(C);return y.delete(u),y}),n.current.delete(u),r.current.delete(u)},5e3);r.current.set(u,p)}},[]);d.useEffect(()=>{const l=I.EventsOn("informer/STATE",s);return()=>{l();for(const u of r.current.values())clearTimeout(u)}},[s]);const i=Array.from(e.values()),o=gt(i),a=i.find(l=>!ae(l))??i[0]??null,c=mt(i);return{syncs:i,hasSyncing:o,primarySync:a,aggregateProgress:c}},Tt=()=>{const e=d.useContext(Te);if(!e)throw new Error("useOperations must be used within an OperationsProvider");return e},$r=({pluginID:e,connectionID:t,resourceKey:n})=>{const r=D(e),{showSnackbar:s}=k(),{addOperation:i,updateOperation:o}=Tt(),a=d.useRef([]);return d.useEffect(()=>()=>{a.current.forEach(l=>l())},[]),{startStreamAction:d.useCallback(async({actionID:l,id:u,namespace:h,label:_,params:p={}})=>{try{const C=await m.StreamAction(r,t,n,l,F.types.ActionInput.createFrom({id:u,namespace:h,params:p}));i({id:C,label:_,resourceKey:n,resourceName:u,namespace:h,connectionID:t,status:"running",startedAt:Date.now()});const y=`action/stream/${C}`,E=I.EventsOn(y,w=>{var P,f,S,b;switch(w.type){case"progress":{const v=w.data??{};o(C,{message:v.message,progress:v.ready!==void 0&&v.desired!==void 0?{ready:v.ready,desired:v.desired}:void 0});break}case"complete":o(C,{status:"completed",message:((P=w.data)==null?void 0:P.message)??"Completed",completedAt:Date.now()}),s(((f=w.data)==null?void 0:f.message)??_+" completed","success"),I.EventsOff(y);break;case"error":o(C,{status:"error",message:((S=w.data)==null?void 0:S.message)??"Failed",completedAt:Date.now()}),s(((b=w.data)==null?void 0:b.message)??_+" failed","error"),I.EventsOff(y);break}});return a.current.push(()=>{E(),I.EventsOff(y)}),C}catch(C){throw U(s,C,`Failed to start "${l}"`),C}},[r,t,n,i,o,s])}},qr=()=>{const e=d.useContext(Re);if(!e)throw new Error("useSettings must be used within a SettingsProvider");return e},Qr=({to:e,withinContext:t,...n})=>{const{meta:r}=fe();r.id||console.error("Link used outside of a plugin context");const s=`/_plugin/${r.id}${e.startsWith("/")?"":"/"}${e}`;return d.useMemo(()=>x.jsx(X.Link,{style:{textDecoration:"none",color:"inherit"},...n,to:s}),[n,s])};function jr(){const e=X.useNavigate(),t=X.useLocation(),{meta:n}=fe();n.id||console.error("usePluginRouter used outside of a plugin context");const r=`/_plugin/${n.id}`,s=t.pathname.startsWith(r)?t.pathname.slice(r.length)||"/":t.pathname,i=(o,a)=>{const{...c}=a??{};o.startsWith("/")?e(`${r}${o}`,c):e(o,c)};return d.useMemo(()=>({location:t,navigate:i,pluginPath:s}),[t.pathname])}class Ur{}class Gr{constructor(){L(this,"_extensions");L(this,"root");L(this,"pages");L(this,"_routes")}get extensions(){return this._extensions||[]}get Routes(){var t;if(!this._routes&&this.root)return[{path:"",index:!0,Component:this.root}];if(!((t=this._routes)!=null&&t.length))throw new Error("cannot use plugin without a root page or router");return this._routes}get Window(){if(!this._routes&&this.root)return x.jsx(this.root,{});const t=X.createMemoryRouter(this._routes||[]);return x.jsx(X.RouterProvider,{router:t})}registerExtensionPoints(t){return this._extensions=t||[],this}setRootPage(t){return this.root=t,this}withPage(t,n){return this.pages||(this.pages={}),this.pages[t]?(console.warn("Cannot register page with the same name. Please use a different name."),this):(this.pages[t]=n,this)}withRoutes(t){return this._routes=t,this}}var Mt=(e=>(e.MISSING_MANIFEST="MISSING_MANIFEST",e.MISSING_PLUGIN="MISSING_PLUGIN",e.MISSING_ENTRYPOINT="MISSING_ENTRYPOINT",e))(Mt||{});exports.ALL_SESSIONS_KEY=j;exports.BottomDrawerContext=it;exports.ConfirmationModalContext=ct;exports.ErrorTypes=ie;exports.ExtensionPointRegistry=Jt;exports.ExtensionPointStore=dt;exports.ExtensionProvider=Yt;exports.InformerResourceState=O;exports.InformerSyncPolicy=yt;exports.Link=Qr;exports.OperationsContext=Te;exports.OperationsProvider=Ut;exports.PluginContext=de;exports.PluginContextProvider=$t;exports.PluginErrorCode=Mt;exports.PluginWindow=Gr;exports.PluginWindowRootProps=Ur;exports.RightDrawerContext=at;exports.SettingsContext=Re;exports.SettingsProvider=Qt;exports.SnackbarProvider=Xt;exports.actionToSnackbar=rt;exports.connectionListQueryKey=pt;exports.createErrorHandler=A;exports.defaultState=ot;exports.isCancelledError=Ae;exports.parseAppError=q;exports.showAppError=U;exports.useActiveSyncs=Lr;exports.useBottomDrawer=ke;exports.useConfirmationModal=hn;exports.useConnection=Zt;exports.useConnectionNamespaces=tn;exports.useConnectionStatus=nn;exports.useConnections=en;exports.useEditorSchemas=Nr;exports.useExec=cn;exports.useExecuteAction=Mr;exports.useExtensionPoint=Bt;exports.useExtensionPointComponents=Ht;exports.useExtensionRegistry=Me;exports.useInformerState=kr;exports.useLogs=un;exports.useMetricProviders=ln;exports.useMetricProvidersForResource=Ct;exports.useMetricStream=fn;exports.useOperations=Tt;exports.usePluginContext=fe;exports.usePluginData=on;exports.usePluginRouter=jr;exports.usePluginSettings=qt;exports.usePortForwardSessions=pn;exports.useResolvedPluginId=D;exports.useResource=gn;exports.useResourceActions=Tr;exports.useResourceAreaComponent=mn;exports.useResourceGroups=_n;exports.useResourceMetrics=dn;exports.useResourceMutations=Rr;exports.useResourcePortForwarder=yn;exports.useResourceSearch=Cn;exports.useResourceType=Sn;exports.useResourceTypes=wn;exports.useResources=Ar;exports.useRightDrawer=an;exports.useSettings=qr;exports.useSnackbar=k;exports.useStreamAction=$r;
|
|
1
|
+
"use strict";var Tt=Object.defineProperty;var Nt=(e,t,n)=>t in e?Tt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var L=(e,t,n)=>Nt(e,typeof t!="symbol"?t+"":t,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),d=require("react"),Z=require("react-router-dom"),E=require("./Client-BRYjLBXY.cjs"),x=require("./models.cjs"),_=require("@tanstack/react-query"),kt=require("@omniviewdev/ui/feedback"),O=require("./runtime.cjs"),ue=d.createContext(void 0),k={PLUGIN_NOT_FOUND:"omniview:plugin/not-found",PLUGIN_NOT_LOADED:"omniview:plugin/not-loaded",PLUGIN_ALREADY_LOADED:"omniview:plugin/already-loaded",PLUGIN_INSTALL_FAILED:"omniview:plugin/install-failed",PLUGIN_LOAD_FAILED:"omniview:plugin/load-failed",PLUGIN_BUILD_FAILED:"omniview:plugin/build-failed",SETTINGS_MISSING_CONFIG:"omniview:settings/missing-config",SETTINGS_INVALID_CONFIG:"omniview:settings/invalid-config",RESOURCE_NOT_FOUND:"omniview:resource/not-found",RESOURCE_FORBIDDEN:"omniview:resource/forbidden",RESOURCE_UNAUTHORIZED:"omniview:resource/unauthorized",RESOURCE_CONFLICT:"omniview:resource/conflict",RESOURCE_TIMEOUT:"omniview:resource/timeout",CONNECTION_NOT_FOUND:"omniview:connection/not-found",CONNECTION_FAILED:"omniview:connection/failed",RESOURCE_CONNECTION_ERROR:"omniview:resource/connection-error",RESOURCE_CERTIFICATE_ERROR:"omniview:resource/certificate-error",SESSION_NOT_FOUND:"omniview:session/not-found",SESSION_FAILED:"omniview:session/failed",CANCELLED:"omniview:cancelled",INTERNAL:"omniview:internal",VALIDATION:"omniview:validation",NOT_IMPLEMENTED:"omniview:not-implemented"};function Mt(e){switch(e){case"NOT_FOUND":return{typeUri:k.RESOURCE_NOT_FOUND,status:404};case"FORBIDDEN":return{typeUri:k.RESOURCE_FORBIDDEN,status:403};case"UNAUTHORIZED":return{typeUri:k.RESOURCE_UNAUTHORIZED,status:401};case"CONFLICT":case"ALREADY_EXISTS":return{typeUri:k.RESOURCE_CONFLICT,status:409};case"TIMEOUT":return{typeUri:k.RESOURCE_TIMEOUT,status:408};case"CONNECTION_ERROR":return{typeUri:k.RESOURCE_CONNECTION_ERROR,status:503};case"CERTIFICATE_ERROR":return{typeUri:k.RESOURCE_CERTIFICATE_ERROR,status:502};default:return{typeUri:k.INTERNAL,status:500}}}function $(e){if(e==null)return{type:k.INTERNAL,title:"Unknown error",status:500,detail:"An unknown error occurred."};let t;if(typeof e=="string"?t=e:e instanceof Error?t=e.message:t=String(e),t.startsWith("{"))try{const n=JSON.parse(t);if(typeof n.type=="string"&&typeof n.title=="string"&&typeof n.status=="number"&&typeof n.detail=="string")return n;if(typeof n.code=="string"&&typeof n.title=="string"&&typeof n.message=="string"){const{typeUri:r,status:s}=Mt(n.code);return{type:r,title:n.title,status:s,detail:n.message,suggestions:Array.isArray(n.suggestions)?n.suggestions:void 0}}}catch{}return{type:k.INTERNAL,title:"Error",status:500,detail:t}}function Fe(e){return e==null?!1:(typeof e=="string"?e:e instanceof Error?e.message:String(e))==="cancelled"?!0:$(e).type===k.CANCELLED}function et(e){switch(e.type){case"navigate":return{label:e.label,onClick:()=>{window.location.hash=e.target??""}};case"open-url":return{label:e.label,onClick:()=>{window.open(e.target,"_blank")}};case"copy":return{label:e.label,onClick:()=>{navigator.clipboard.writeText(e.target??"")}};case"retry":return{label:e.label,onClick:()=>{}};default:return{label:e.label,onClick:()=>{}}}}function tt(e,t){var s,o;const n=[e.detail,...((s=e.suggestions)==null?void 0:s.map(i=>`• ${i}`))??[]].join(`
|
|
2
|
+
`);return{message:t||(e.title!=="Error"?e.title:"Operation failed"),status:"error",details:n,actions:(o=e.actions)==null?void 0:o.map(et)}}function G(e,t,n){if(Fe(t))return;const r=$(t);e(tt(r,n))}function I(e,t){return n=>{if(Fe(n))return;const r=$(n);e(tt(r,r.title!=="Error"?r.title:t))}}function Lt(e){const{children:t,pluginId:n}=e,[r,s]=d.useState({}),[o,i]=d.useState(new x.config.PluginMeta),[a,u]=d.useState(!1),[l,c]=d.useState(null);console.debug("[PluginContextProvider] render",{pluginId:n,metaLoaded:a,metaError:!!l});const m=()=>{n===void 0||n===""||(console.debug(`[PluginContextProvider] fetching settings for "${n}"`),E.PluginValues(n).then(f=>{console.debug(`[PluginContextProvider] settings loaded for "${n}"`,Object.keys(f)),s(f)}).catch(f=>{const g=$(f);console.error(`[PluginContextProvider] error fetching settings for "${n}":`,g.detail)}))},p=()=>{if(n===void 0||n===""){console.debug("[PluginContextProvider] skipping meta fetch — empty pluginId");return}console.debug(`[PluginContextProvider] fetching meta for "${n}"`),c(null),E.GetPluginMeta(n).then(f=>{console.debug(`[PluginContextProvider] meta loaded for "${n}"`,{name:f==null?void 0:f.name,version:f==null?void 0:f.version}),i(f),u(!0)}).catch(f=>{const g=$(f);console.error(`[PluginContextProvider] error fetching meta for "${n}":`,g.detail),c(g.detail),u(!1)})};return d.useEffect(()=>{console.debug(`[PluginContextProvider] useEffect — pluginId changed to "${n}"`),m(),p()},[n]),l?R.jsx("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center",padding:24},children:R.jsxs("div",{style:{maxWidth:480,width:"100%",border:"1px solid #7F1D1D",borderRadius:8,backgroundColor:"#1C1917",padding:20,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:[R.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[R.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"#EF4444",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[R.jsx("circle",{cx:"12",cy:"12",r:"10"}),R.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),R.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),R.jsx("span",{style:{fontSize:14,fontWeight:600,color:"#FECACA"},children:"Plugin failed to load"})]}),R.jsx("p",{style:{fontSize:13,color:"#A1A1AA",margin:"0 0 16px"},children:l}),R.jsx("button",{onClick:()=>p(),style:{background:"transparent",color:"#F87171",border:"1px solid #7F1D1D",borderRadius:6,padding:"6px 14px",fontSize:13,fontWeight:500,cursor:"pointer"},children:"Retry"})]})}):a?R.jsx(ue.Provider,{value:{pluginId:n,settings:r,meta:o},children:t}):R.jsxs("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center"},children:[R.jsx("div",{style:{width:24,height:24,border:"2px solid #3F3F46",borderTopColor:"#A1A1AA",borderRadius:"50%",animation:"plugin-spin 0.8s linear infinite"}}),R.jsx("style",{children:"@keyframes plugin-spin { to { transform: rotate(360deg); } }"})]})}function le(){const e=d.useContext(ue);if(!e)throw new Error("usePluginContext must be used within a PluginContextProvider");return e}function $t(){return le().settings}const Ae=d.createContext(void 0),Ut=({children:e})=>{const[t,n]=d.useState({}),r=()=>{E.Values().then(o=>{console.log("Fetched settings:",o),n(o)}).catch(o=>{console.error("Error fetching settings:",o)})};d.useEffect(()=>{r()},[]);const s=()=>{r()};return R.jsx(Ae.Provider,{value:{settings:t,reload:s},children:e})},nt={height:32,focused:0,tabs:[],createTab:()=>{},createTabs:()=>{},updateTab:()=>{},focusTab:()=>{},reorderTab:()=>{},closeTab:()=>{},closeTabs:()=>{},resizeDrawer:()=>{},closeDrawer:()=>{},fullscreenDrawer:()=>{}},rt=d.createContext(nt),st=d.createContext(void 0),ot=d.createContext(void 0),Te=d.createContext(void 0),qt=3e4,jt=({children:e})=>{const[t,n]=d.useState([]),r=d.useCallback(a=>{n(u=>[a,...u])},[]),s=d.useCallback((a,u)=>{n(l=>l.map(c=>c.id===a?{...c,...u}:c))},[]),o=d.useCallback(a=>{n(u=>u.filter(l=>l.id!==a))},[]);d.useEffect(()=>{const a=[];for(const u of t)if(u.status==="completed"||u.status==="error"){const l=Date.now()-(u.completedAt??u.startedAt),c=Math.max(0,qt-l);a.push(setTimeout(()=>o(u.id),c))}return()=>a.forEach(clearTimeout)},[t,o]);const i=d.useMemo(()=>({operations:t,addOperation:r,updateOperation:s,removeOperation:o}),[t,r,s,o]);return R.jsx(Te.Provider,{value:i,children:e})};var we=function(e,t){return we=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,r){n.__proto__=r}||function(n,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(n[s]=r[s])},we(e,t)};function Qt(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");we(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}var _e="Invariant Violation",Ge=Object.setPrototypeOf,Gt=Ge===void 0?function(e,t){return e.__proto__=t,e}:Ge,Kt=function(e){Qt(t,e);function t(n){n===void 0&&(n=_e);var r=e.call(this,typeof n=="number"?_e+": "+n+" (see https://github.com/apollographql/invariant-packages)":n)||this;return r.framesToPop=1,r.name=_e,Gt(r,t.prototype),r}return t}(Error);function be(e,t){if(!e)throw new Kt(t)}var it=["debug","log","warn","error","silent"],zt=it.indexOf("log");function re(e){return function(){if(it.indexOf(e)>=zt){var t=console[e]||console.log;return t.apply(console,arguments)}}}(function(e){e.debug=re("debug"),e.log=re("log"),e.warn=re("warn"),e.error=re("error")})(be||(be={}));const at=d.createContext(void 0),Ne=()=>d.useContext(at),Wt=e=>{const t=Ne();return t==null?void 0:t.getExtensionPoint(e)},Bt=e=>{const t=Ne(),n=t==null?void 0:t.getExtensionPoint(e);return n?n.provide({getCacheKey:()=>e}):[]},Ht=({registry:e,children:t})=>{const n=d.useRef(e);return d.useEffect(()=>{be(n.current===e,"You can't change the extension registry after it has been rendered")},[e]),R.jsx(at.Provider,{value:n.current,children:d.Children.only(t)})},Ke=e=>{if(!e||typeof e!="string")throw new TypeError(`extensionName is required to be a string and can't be: "${e}" (${typeof e})`);return e.trim()};class ct{constructor(t){L(this,"_settings");L(this,"_extensions",new Map);L(this,"_lookupCache",new Map);L(this,"_matchCache",new Map);L(this,"_matcher");const{matcher:n,...r}=t;this._settings=r,this._matcher=t.matcher}settings(){return this._settings}register(t){if(this._extensions.get(t.id))throw new Error(`Resource sidebar view with id ${t.id} already exists`);const n={...t,registeredAt:new Date,updatedAt:new Date,enabled:!0};this._extensions.set(t.id,n);const r=Array.from(this._matchCache.keys());for(const s of r)s.startsWith(t.plugin)&&this._matchCache.delete(s)}unregister(t){this._extensions.delete(t)}get(t){var n;return(n=this._extensions.get(t))==null?void 0:n.component}list(){return Array.from(this._extensions.values())}generateMatchCacheKey(t){return`${t.plugin}/${t.id}`}calculateMatches(t){if(!this._matcher)return Array.from(this._extensions.values());const n=[];for(const r of this._extensions.values()){const s=this.generateMatchCacheKey(r),o=this._matchCache.has(s);if(o&&this._matchCache.get(s)){n.push(r);continue}this._matcher(t,r)?(this._matchCache.set(s,!0),n.push(r)):o||this._matchCache.set(s,!1)}return n}preload(t){const n=this.calculateMatches(t),r=t.getCacheKey();this._lookupCache.set(r,n.map(s=>s.id))}provide(t){if(this._settings.disabled)return[];if(this._settings.mode==="single"){const o=this._extensions.get(this._settings.selected);return o?[o.component]:[]}const n=t.getCacheKey();let r=this._lookupCache.get(n);if(r){let o=r.map(i=>this._extensions.get(i)).filter(i=>!!i).map(i=>i.component);return this._settings.order&&(o=this.reorderComponents(o,r,this._settings.order)),o}r=this.calculateMatches(t).map(o=>o.id),this._lookupCache.set(n,r);let s=r.map(o=>this._extensions.get(o)).filter(o=>!!o).map(o=>o.component);return this._settings.order&&(s=this.reorderComponents(s,r,this._settings.order)),s}reorderComponents(t,n,r){const s=new Map(n.map((o,i)=>[o,t[i]]));return r.map(o=>s.get(o)).filter(o=>!!o)}reorder(t){const n=t.map(i=>this._extensions.get(i)).filter(i=>!!i),r=Array.from(this._extensions.values()).filter(i=>!t.includes(i.id)),s=[...n,...r];this._extensions.clear(),s.forEach(i=>this._extensions.set(i.id,i));const o=Array.from(this._lookupCache.keys());for(const i of o){const a=this._lookupCache.get(i);if(!a)continue;const u=a.filter(l=>t.includes(l));this._lookupCache.set(i,u)}}clearLookupCache(){this._lookupCache.clear()}clearMatchCache(){this._matchCache.clear()}clearAllCaches(){this.clearLookupCache(),this.clearMatchCache()}}class Yt{constructor({initialStores:t}){L(this,"store",{});t.forEach(n=>{this.addExtensionPoint(n)})}addExtensionPoint(t){let n=Ke(t.id);if(console.log("validated",n),console.log("store",this.store),this.store[n]){console.warn(`Extension point ${n} already exists. Not adding again.`);return}this.store[n]=new ct(t)}getExtensionPoint(t){return t=Ke(t),this.store[t]}listExtensionPointIds(){return Object.keys(this.store)}listExtensionPoints(){return Object.values(this.store).map(t=>t.settings())}}const ut=d.createContext(void 0),Jt={default:"info",info:"info",success:"success",warning:"warning",error:"error"},Vt=({children:e})=>{const{push:t}=kt.useNotificationStack(),[n,r]=d.useState([]),s=i=>{r(a=>[...a,i])},o=(i,a,u)=>{const l=typeof i=="object";let c="",m="info",p,f=5e3,g;if(l){if(c=i.message,i.showOnce){if(n.includes(c))return;s(c)}m=i.status,p=i.details,f=i.autoHideDuration??5e3,g=i.actions}else c=i,m=a,p=u;t({severity:Jt[m]??"info",title:c,message:p,timeout:f,actions:g})};return R.jsx(ut.Provider,{value:{showSnackbar:o},children:e})},M=()=>{const e=d.useContext(ut);if(e===void 0)throw new Error("useCustomSnackbar must be used within a CustomSnackbarProvider");return e};function D(e){const t=d.useContext(ue),n=(t==null?void 0:t.pluginId)??e;if(!n)throw new Error("pluginID must be provided either via PluginContext or as an explicit parameter");return n}const Xt=({pluginID:e,connectionID:t})=>{const n=D(e),r=_.useQueryClient(),{showSnackbar:s}=M(),o=[n,"connection","detail",t],{mutateAsync:i}=_.useMutation({mutationFn:async()=>E.StartConnection(n,t),onSuccess(m){r.setQueryData(o,m),r.invalidateQueries({queryKey:["EDITOR_SCHEMAS",n,t]})},onError:I(s,"Failed to start connection")}),{mutateAsync:a}=_.useMutation({mutationFn:async()=>E.StopConnection(n,t),onSuccess(m){r.setQueryData(o,m)},onError:I(s,"Failed to stop connection")}),{mutateAsync:u}=_.useMutation({mutationFn:async m=>E.UpdateConnection(n,m),onSuccess(m,{name:p}){s({message:`Connection ${p} successfully updated`,status:"success"}),r.setQueryData(o,c),r.setQueriesData({queryKey:[n,"connection","list"]},f=>f==null?void 0:f.map(g=>g.id===t?m:g))},onError:I(s,"Failed to update connection")}),{mutateAsync:l}=_.useMutation({mutationFn:async()=>E.RemoveConnection(n,t),onSuccess(){s({message:"Connection successfully removed",status:"success"}),r.setQueryData(o,void 0),r.setQueriesData({queryKey:[n,"connection","list"]},m=>m==null?void 0:m.filter(p=>p.id!==t))},onError:I(s,"Failed to remove connection")}),c=_.useQuery({queryKey:o,queryFn:async()=>E.GetConnection(n,t)});return{connection:c,startConnection:i,stopConnection:a,updateConnection:u,deleteConnection:l}},lt=e=>[e,"connection","list"],Zt=({plugin:e})=>{const t=D(e),n=_.useQueryClient(),{showSnackbar:r}=M(),s=lt(t),{mutateAsync:o}=_.useMutation({mutationFn:async l=>E.StartConnectionWatch(t,l.id),onError:I(r,"Failed to start connection watch")}),{mutateAsync:i}=_.useMutation({mutationFn:async l=>E.StopConnectionWatch(t,l.id),onError:I(r,"Failed to stop connection watch")}),a=d.useCallback(l=>{console.log("got update to connections",l),n.setQueryData(s,l)},[]);return d.useEffect(()=>{const l=O.EventsOn(`${t}/connection/sync`,a);return()=>{l()}},[]),{connections:_.useQuery({queryKey:s,queryFn:async()=>{try{return await E.ListConnections(t)}catch(l){console.log(l),I(r,"Failed to load connections")(l)}return[]},staleTime:3e4,placeholderData:_.keepPreviousData}),startWatch:o,stopWatch:i}},en=({pluginID:e,connectionID:t})=>{const n=D(e),r=[n,"connection","namespaces",t];return{namespaces:_.useQuery({queryKey:r,queryFn:async()=>E.GetConnectionNamespaces(n,t)})}},b=x.resource.WatchState,tn=x.resource.SyncPolicy;function ve(e){const t=Object.values(e.states),n=t.length;let r=0,s=0,o=0,i=0;for(const c of t)c===b.SYNCED&&r++,(c===b.ERROR||c===b.FAILED)&&s++,c===b.FORBIDDEN&&o++,c===b.SKIPPED&&i++;const a=n-i,u=t.filter(c=>c===b.SYNCED||c===b.ERROR||c===b.STOPPED||c===b.FAILED||c===b.FORBIDDEN).length,l=a>0?u/a:0;return{pluginID:e.pluginID,connectionID:e.connectionID,totalResources:n,watchedTotal:a,syncedCount:r,errorCount:s,forbiddenCount:o,skippedCount:i,doneCount:u,progress:l}}function oe(e){return e.watchedTotal>0&&e.doneCount>=e.watchedTotal}function dt(e){return e.some(t=>!oe(t))}function ft(e){const t=e.reduce((r,s)=>r+s.watchedTotal,0);return t===0?0:e.reduce((r,s)=>r+s.doneCount,0)/t}function ke(e){return`${e.pluginId}/${e.connection}`}function pt(e,t){const n=ke(t);e.has(n)||e.set(n,{states:{},pluginID:t.pluginId,connectionID:t.connection});const r=e.get(n);return r.states[t.resourceKey]=t.state,r}function nn(){const[e,t]=d.useState(new Set),[n,r]=d.useState({}),[s,o]=d.useState(new Map),i=d.useRef(new Map);d.useEffect(()=>{E.GetAllConnectionStates().then(h=>{if(!h)return;const C={},y=new Set,w=new Map;for(const[S,v]of Object.entries(h)){C[S]=v.map(F=>F.connection);for(const F of v){if(!F.started)continue;const P=`${S}/${F.connection.id}`;y.add(P);const U={pluginID:S,connectionID:F.connection.id,states:{}};if(F.resources)for(const[me,X]of Object.entries(F.resources))U.states[me]=X;i.current.set(P,U),w.set(P,ve(U))}}r(C),t(y),o(w)}).catch(()=>{})},[]),d.useEffect(()=>O.EventsOn("connection/status",C=>{const y=`${C.pluginID}/${C.connectionID}`;C.status==="DISCONNECTED"?(t(w=>{const S=new Set(w);return S.delete(y),S}),o(w=>{const S=new Map(w);return S.delete(y),S}),i.current.delete(y)):t(w=>{const S=new Set(w);return S.add(y),S}),E.ListAllConnections().then(w=>{w&&r(w)}).catch(()=>{})}),[]);const a=d.useCallback(h=>{const C=ke(h);t(S=>{if(S.has(C))return S;const v=new Set(S);return v.add(C),v});const y=pt(i.current,h),w=ve(y);o(S=>{const v=new Map(S);return v.set(C,w),v})},[]);d.useEffect(()=>O.EventsOn("watch/STATE",a),[a]);const u=d.useCallback(async(h,C)=>{await E.StopConnection(h,C)},[]),l=d.useCallback(async(h,C)=>{await E.StartConnectionWatch(h,C)},[]),c=[];for(const h of e){const[C,y]=h.split("/",2),S=(n[C]??[]).find(U=>U.id===y),v=s.get(h),F=v!=null&&!oe(v),P=v!=null&&v.errorCount>0;c.push({pluginID:C,connectionID:y,name:(S==null?void 0:S.name)??y,avatar:(S==null?void 0:S.avatar)??"",isStarted:!0,sync:v,isSyncing:F,hasErrors:P})}const m=new Map;for(const h of c){const C=m.get(h.pluginID)??[];C.push(h),m.set(h.pluginID,C)}const p=Array.from(s.values()),f=c.filter(h=>h.isSyncing),g=c.filter(h=>h.hasErrors);return{entries:c,grouped:m,connectedCount:c.length,syncingCount:f.length,errorCount:g.length,hasSyncing:dt(p),aggregateProgress:ft(p),disconnect:u,retryWatch:l}}function rn(e,t){return window.go.data.Client.Get(e,t)}function sn(e,t,n){return window.go.data.Client.Set(e,t,n)}function on(e,t,n){const r=D(e),s=_.useQueryClient(),o=[r,"data",t],i=_.useQuery({queryKey:o,queryFn:async()=>{const u=await rn(r,t);return u??n}}),a=_.useMutation({mutationFn:async u=>{await sn(r,t,u)},onMutate:async u=>{await s.cancelQueries({queryKey:o});const l=s.getQueryData(o);return s.setQueryData(o,u),{previous:l}},onError:(u,l,c)=>{(c==null?void 0:c.previous)!==void 0&&s.setQueryData(o,c.previous)},onSettled:()=>{s.invalidateQueries({queryKey:o})}});return{data:i.data??n,update:async u=>{await a.mutateAsync(u)},isLoading:i.isLoading}}const an=()=>{const e=d.useContext(st);if(!e)throw new Error("useRightDrawer must be used within a RightDrawerProvider");return e},Me=()=>{const e=d.useContext(rt);if(e===void 0)throw new Error("useBottomDrawer must be used within a BottomDrawerProvider");return e},cn=({pluginID:e})=>{const t=D(e),{showSnackbar:n}=M(),{createTab:r,updateTab:s}=Me();return{createSession:_.useMutation({mutationFn:async({connectionID:i,icon:a,label:u,opts:l})=>{const c=`pending-${crypto.randomUUID()}`;r({id:c,title:u??"Connecting...",variant:"terminal",icon:a??"LuSquareTerminal",properties:{status:"connecting",pluginID:t,connectionID:i,opts:{...l}}});const m=x.exec.SessionOptions.createFrom({command:["/bin/bash"],tty:!0,...l});try{const p=await E.CreateSession(t,i,m);s({id:c},{id:p.id,title:u??`Session ${p.id.substring(0,8)}`,properties:{status:"connected",pluginID:t,connectionID:i,opts:{...l}}})}catch(p){const f=$(p);s({id:c},{properties:{status:"error",error:f.detail,pluginID:t,connectionID:i,opts:{...l}}}),G(n,p,"Failed to start session")}}}).mutateAsync}},un=({pluginID:e})=>{const t=D(e),{showSnackbar:n}=M(),{createTab:r}=Me(),s=_.useMutation({mutationFn:async({connectionID:i,resourceKey:a,resourceID:u,resourceData:l,icon:c,label:m,target:p,follow:f=!0,tailLines:g=1e3,params:h})=>{const C=x.logs.CreateSessionOptions.createFrom({resource_key:a,resource_id:u,resource_data:l,options:x.logs.LogSessionOptions.createFrom({target:p??"",follow:f,include_previous:!1,include_timestamps:!0,tail_lines:g,since_seconds:0,limit_bytes:0,include_source_events:!0,params:h??{}})}),y=await E.CreateSession$1(t,i,C);return r({id:y.id,title:m??`Logs ${y.id.substring(0,8)}`,variant:"logs",icon:c??"LuLogs"}),y},onError:I(n,"Failed to start log session")}),o=_.useMutation({mutationFn:async i=>{await E.CloseSession(i)},onError:I(n,"Failed to close log session")});return{createLogSession:s.mutateAsync,closeLogSession:o.mutateAsync}},ln=()=>_.useQuery({queryKey:["metric","providers"],queryFn:E.GetProviders,staleTime:3e4}),yt=e=>_.useQuery({queryKey:["metric","providers",e],queryFn:()=>E.GetProvidersForResource(e),enabled:!!e,staleTime:3e4}),dn=e=>{var C,y;const{connectionID:t,resourceKey:n,resourceID:r,resourceNamespace:s="",resourceData:o={},metricIDs:i=[],shape:a=0,timeRange:u,refreshInterval:l=0,enabled:c=!0}=e,{data:m,isLoading:p}=yt(n),f=m??[],g=u?Math.max(Math.floor((u.end.getTime()-u.start.getTime())/250),15e3)*1e6:0,h=_.useQuery({queryKey:["metric","query",t,n,r,s,i,a,(C=u==null?void 0:u.start)==null?void 0:C.getTime(),(y=u==null?void 0:u.end)==null?void 0:y.getTime()],queryFn:()=>E.QueryAll(t,n,r,s,o,i,a,(u==null?void 0:u.start)??new Date(0),(u==null?void 0:u.end)??new Date(0),g),enabled:c&&!!t&&!!n&&(n.startsWith("cluster::")||!!r)&&f.length>0,refetchInterval:l>0?l:void 0,staleTime:5e3,placeholderData:_.keepPreviousData});return{data:h.data??void 0,providers:f,isLoading:p||h.isLoading,error:h.error,refetch:h.refetch}},fn=e=>{const{pluginID:t,connectionID:n,resourceKey:r,resourceID:s,resourceNamespace:o="",resourceData:i={},metricIDs:a=[],interval:u=1e4,enabled:l=!0}=e,c=D(t),[m,p]=d.useState(null),[f,g]=d.useState(null),[h,C]=d.useState(!1),[y,w]=d.useState(null),S=d.useRef(null),v=d.useCallback(async()=>{if(!(!l||!c||!n||!r||!s))try{const P=await E.Subscribe(c,n,{resource_key:r,resource_id:s,resource_namespace:o,resource_data:i,metric_ids:a,interval:u*1e6});g(P),C(!0),w(null);const U=O.EventsOn(`core/metrics/data/${P}`,X=>{try{const q=JSON.parse(X);q.results&&p(q.results)}catch(q){console.error("Failed to parse metric stream data:",q)}}),me=O.EventsOn(`core/metrics/error/${P}`,X=>{try{const q=JSON.parse(X);w(q.error||"Unknown error")}catch{w("Failed to parse metric stream error")}});S.current=()=>{U(),me()}}catch(P){w(P instanceof Error?P.message:String(P))}},[c,n,r,s,o,a,u,l]),F=d.useCallback(async()=>{if(f)try{await E.Unsubscribe(f)}catch(P){console.error("Failed to unsubscribe:",P)}S.current&&(S.current(),S.current=null),g(null),C(!1)},[f]);return d.useEffect(()=>()=>{f&&E.Unsubscribe(f).catch(console.error),S.current&&S.current()},[f]),{data:m,subscriptionID:f,isStreaming:h,error:y,start:v,stop:F}},Q=["networker","portforward","all-sessions"];function pn(){const{showSnackbar:e}=M(),t=_.useQueryClient(),n=_.useQuery({queryKey:[...Q],queryFn:async()=>E.ListAllPortForwardSessions().catch(o=>{if($(o).detail.includes("not found"))return[];throw o}),retry:!1});d.useEffect(()=>{const o=O.EventsOn("core/networker/portforward/created",()=>{t.invalidateQueries({queryKey:[...Q]})}),i=O.EventsOn("core/networker/portforward/closed",()=>{t.invalidateQueries({queryKey:[...Q]})});return()=>{o(),i()}},[t]);const r=n.data??[],s=_.useMutation({mutationFn:async o=>E.ClosePortForwardSession(o),onError:I(e,"Failed to close port forwarding session"),onSuccess:async()=>{await t.invalidateQueries({queryKey:[...Q]})}});return{sessions:n,activeSessions:r,closeSession:s.mutateAsync,openInBrowser:o=>O.BrowserOpenURL(`http://localhost:${o}`)}}function yn({pluginID:e,connectionID:t,resourceID:n}){const r=D(e),s=["networker","portforward","sessions",r,t,n],{showSnackbar:o}=M(),i=_.useQueryClient(),a=_.useQuery({queryKey:s,queryFn:async()=>E.FindPortForwardSessions(r,t,x.networker.FindPortForwardSessionRequest.createFrom({resource_id:n,connection_id:t})).catch(c=>{const m=$(c);return m.detail.includes("not found")?[]:(o({message:"Failed to fetch port forward sessions",status:"error",details:m.detail}),[])}),retry:!1}),u=_.useMutation({mutationFn:async({opts:c})=>{const m=x.networker.PortForwardSessionOptions.createFrom({local_port:c.localPort||0,remote_port:c.remotePort,protocol:c.protocol||"TCP",connection_type:"RESOURCE",connection:{resource_data:c.resource,connection_id:t,plugin_id:r,resource_id:c.resourceId,resource_key:c.resourceKey},labels:c.labels??{},params:c.parameters??{}}),p=await E.StartResourcePortForwardingSession(r,t,m);return c.openInBrowser&&O.BrowserOpenURL(`http://localhost:${p.local_port}`),p},onError:I(o,"Failed to start port forwarding session"),onSuccess:async()=>{await Promise.all([i.invalidateQueries({queryKey:s}),i.invalidateQueries({queryKey:[...Q]})])}}),l=_.useMutation({mutationFn:async({opts:c})=>E.ClosePortForwardSession(c.sessionID),onError:I(o,"Failed to close port forwarding session"),onSuccess:async()=>{await Promise.all([i.invalidateQueries({queryKey:s}),i.invalidateQueries({queryKey:[...Q]})])}});return{sessions:a,forward:u.mutateAsync,close:l.mutateAsync}}const hn=()=>{const e=d.useContext(ot);if(!e)throw new Error("useConfirmationModal must be used within a ConfirmationModalProvider");return e},gn=({pluginID:e,connectionID:t,resourceKey:n,resourceID:r,namespace:s=""})=>{const o=D(e),i=_.useQueryClient(),{showSnackbar:a}=M(),u=["RESOURCE",o,t,n,r,s],{mutateAsync:l}=_.useMutation({mutationFn:async p=>E.Update(o,t,n,x.resource.UpdateInput.createFrom({input:p.input,id:r,namespace:s})),onSuccess:async()=>{a(`Resource ${r} updated`,"success"),await i.invalidateQueries({queryKey:u})},onError:I(a,`Failed to update resource ${r}`)}),{mutateAsync:c}=_.useMutation({mutationFn:async(p={})=>E.Delete(o,t,n,x.resource.DeleteInput.createFrom({id:r,namespace:s,gracePeriodSeconds:p.gracePeriodSeconds})),onSuccess:async()=>{a(`Resource ${r} deleted`,"success"),await i.invalidateQueries({queryKey:u})},onError:I(a,`Failed to delete resource ${r}`)});return{resource:_.useQuery({queryKey:u,queryFn:async()=>E.Get(o,t,n,x.resource.GetInput.createFrom({id:r,namespace:s})),retry:!1}),update:l,remove:c}},mn=e=>{const t=["component",e.plugin,e.resource,e.area];return{component:_.useQuery({queryKey:t,queryFn:async()=>E.GetResourceAreaComponent(e)})}},_n=({pluginID:e,connectionID:t})=>{const n=D(e),r=[n,"resource_groups","list"];return{groups:_.useQuery({queryKey:r,queryFn:async()=>E.GetResourceGroups(n,t),retry:!1})}},En=({pluginID:e,connectionID:t,searches:n})=>{const r=D(e),s=i=>[r,t,i.key,i.namespaces,"list"];return _.useQueries({queries:n.map(i=>({queryKey:s(i),queryFn:async()=>E.List(r,t,i.key,x.resource.ListInput.createFrom({order:[{field:"name",descending:!1}],pagination:{page:1,pageSize:200},namespaces:i.namespaces})).then(a=>(console.log(a.result),a.result&&i.postFilter?Object.values(a.result).filter(i.postFilter):Object.values(a.result||{}))),retry:!1}))})},Cn=({pluginID:e,resourceKey:t})=>{const n=D(e),r=[n,"resources",t];return{resourceType:_.useQuery({queryKey:r,queryFn:async()=>E.GetResourceType(n,t),retry:!1})}},Sn=({pluginID:e,connectionID:t})=>{const n=D(e),r=[n,"resources","list"];return{types:_.useQuery({queryKey:r,queryFn:async()=>E.GetResourceTypes(n,t),retry:!1})}};var ht=Symbol.for("immer-nothing"),ze=Symbol.for("immer-draftable"),T=Symbol.for("immer-state"),wn=process.env.NODE_ENV!=="production"?[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}]:[];function A(e,...t){if(process.env.NODE_ENV!=="production"){const n=wn[e],r=typeof n=="function"?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Y=Object.getPrototypeOf;function J(e){return!!e&&!!e[T]}function K(e){var t;return e?gt(e)||Array.isArray(e)||!!e[ze]||!!((t=e.constructor)!=null&&t[ze])||fe(e)||pe(e):!1}var bn=Object.prototype.constructor.toString();function gt(e){if(!e||typeof e!="object")return!1;const t=Y(e);if(t===null)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;return n===Object?!0:typeof n=="function"&&Function.toString.call(n)===bn}function ie(e,t){de(e)===0?Reflect.ownKeys(e).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function de(e){const t=e[T];return t?t.type_:Array.isArray(e)?1:fe(e)?2:pe(e)?3:0}function Pe(e,t){return de(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function mt(e,t,n){const r=de(e);r===2?e.set(t,n):r===3?e.add(n):e[t]=n}function vn(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function fe(e){return e instanceof Map}function pe(e){return e instanceof Set}function j(e){return e.copy_||e.base_}function Re(e,t){if(fe(e))return new Map(e);if(pe(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=gt(e);if(t===!0||t==="class_only"&&!n){const r=Object.getOwnPropertyDescriptors(e);delete r[T];let s=Reflect.ownKeys(r);for(let o=0;o<s.length;o++){const i=s[o],a=r[i];a.writable===!1&&(a.writable=!0,a.configurable=!0),(a.get||a.set)&&(r[i]={configurable:!0,writable:!0,enumerable:a.enumerable,value:e[i]})}return Object.create(Y(e),r)}else{const r=Y(e);if(r!==null&&n)return{...e};const s=Object.create(r);return Object.assign(s,e)}}function Le(e,t=!1){return ye(e)||J(e)||!K(e)||(de(e)>1&&(e.set=e.add=e.clear=e.delete=Pn),Object.freeze(e),t&&Object.entries(e).forEach(([n,r])=>Le(r,!0))),e}function Pn(){A(2)}function ye(e){return Object.isFrozen(e)}var Rn={};function z(e){const t=Rn[e];return t||A(0,e),t}var ee;function _t(){return ee}function Dn(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function We(e,t){t&&(z("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function De(e){Oe(e),e.drafts_.forEach(On),e.drafts_=null}function Oe(e){e===ee&&(ee=e.parent_)}function Be(e){return ee=Dn(ee,e)}function On(e){const t=e[T];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function He(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return e!==void 0&&e!==n?(n[T].modified_&&(De(t),A(4)),K(e)&&(e=ae(t,e),t.parent_||ce(t,e)),t.patches_&&z("Patches").generateReplacementPatches_(n[T].base_,e,t.patches_,t.inversePatches_)):e=ae(t,n,[]),De(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==ht?e:void 0}function ae(e,t,n){if(ye(t))return t;const r=t[T];if(!r)return ie(t,(s,o)=>Ye(e,r,t,s,o,n)),t;if(r.scope_!==e)return t;if(!r.modified_)return ce(e,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;const s=r.copy_;let o=s,i=!1;r.type_===3&&(o=new Set(s),s.clear(),i=!0),ie(o,(a,u)=>Ye(e,r,s,a,u,n,i)),ce(e,s,!1),n&&e.patches_&&z("Patches").generatePatches_(r,n,e.patches_,e.inversePatches_)}return r.copy_}function Ye(e,t,n,r,s,o,i){if(process.env.NODE_ENV!=="production"&&s===n&&A(5),J(s)){const a=o&&t&&t.type_!==3&&!Pe(t.assigned_,r)?o.concat(r):void 0,u=ae(e,s,a);if(mt(n,r,u),J(u))e.canAutoFreeze_=!1;else return}else i&&n.add(s);if(K(s)&&!ye(s)){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;ae(e,s),(!t||!t.scope_.parent_)&&typeof r!="symbol"&&Object.prototype.propertyIsEnumerable.call(n,r)&&ce(e,s)}}function ce(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Le(t,n)}function xn(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:_t(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let s=r,o=$e;n&&(s=[r],o=te);const{revoke:i,proxy:a}=Proxy.revocable(s,o);return r.draft_=a,r.revoke_=i,a}var $e={get(e,t){if(t===T)return e;const n=j(e);if(!Pe(n,t))return In(e,n,t);const r=n[t];return e.finalized_||!K(r)?r:r===Ee(e.base_,t)?(Ce(e),e.copy_[t]=Ie(r,e)):r},has(e,t){return t in j(e)},ownKeys(e){return Reflect.ownKeys(j(e))},set(e,t,n){const r=Et(j(e),t);if(r!=null&&r.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const s=Ee(j(e),t),o=s==null?void 0:s[T];if(o&&o.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(vn(n,s)&&(n!==void 0||Pe(e.base_,t)))return!0;Ce(e),xe(e)}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty(e,t){return Ee(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,Ce(e),xe(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const n=j(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:r.enumerable,value:n[t]}},defineProperty(){A(11)},getPrototypeOf(e){return Y(e.base_)},setPrototypeOf(){A(12)}},te={};ie($e,(e,t)=>{te[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});te.deleteProperty=function(e,t){return process.env.NODE_ENV!=="production"&&isNaN(parseInt(t))&&A(13),te.set.call(this,e,t,void 0)};te.set=function(e,t,n){return process.env.NODE_ENV!=="production"&&t!=="length"&&isNaN(parseInt(t))&&A(14),$e.set.call(this,e[0],t,n,e[0])};function Ee(e,t){const n=e[T];return(n?j(n):e)[t]}function In(e,t,n){var s;const r=Et(t,n);return r?"value"in r?r.value:(s=r.get)==null?void 0:s.call(e.draft_):void 0}function Et(e,t){if(!(t in e))return;let n=Y(e);for(;n;){const r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Y(n)}}function xe(e){e.modified_||(e.modified_=!0,e.parent_&&xe(e.parent_))}function Ce(e){e.copy_||(e.copy_=Re(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Fn=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(t,n,r)=>{if(typeof t=="function"&&typeof n!="function"){const o=n;n=t;const i=this;return function(u=o,...l){return i.produce(u,c=>n.call(this,c,...l))}}typeof n!="function"&&A(6),r!==void 0&&typeof r!="function"&&A(7);let s;if(K(t)){const o=Be(this),i=Ie(t,void 0);let a=!0;try{s=n(i),a=!1}finally{a?De(o):Oe(o)}return We(o,r),He(s,o)}else if(!t||typeof t!="object"){if(s=n(t),s===void 0&&(s=t),s===ht&&(s=void 0),this.autoFreeze_&&Le(s,!0),r){const o=[],i=[];z("Patches").generateReplacementPatches_(t,s,o,i),r(o,i)}return s}else A(1,t)},this.produceWithPatches=(t,n)=>{if(typeof t=="function")return(i,...a)=>this.produceWithPatches(i,u=>t(u,...a));let r,s;return[this.produce(t,n,(i,a)=>{r=i,s=a}),r,s]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy)}createDraft(e){K(e)||A(8),J(e)&&(e=An(e));const t=Be(this),n=Ie(e,void 0);return n[T].isManual_=!0,Oe(t),n}finishDraft(e,t){const n=e&&e[T];(!n||!n.isManual_)&&A(9);const{scope_:r}=n;return We(r,t),He(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const s=t[n];if(s.path.length===0&&s.op==="replace"){e=s.value;break}}n>-1&&(t=t.slice(n+1));const r=z("Patches").applyPatches_;return J(e)?r(e,t):this.produce(e,s=>r(s,t))}};function Ie(e,t){const n=fe(e)?z("MapSet").proxyMap_(e,t):pe(e)?z("MapSet").proxySet_(e,t):xn(e,t);return(t?t.scope_:_t()).drafts_.push(n),n}function An(e){return J(e)||A(10,e),Ct(e)}function Ct(e){if(!K(e)||ye(e))return e;const t=e[T];let n;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Re(e,t.scope_.immer_.useStrictShallowCopy_)}else n=Re(e,!0);return ie(n,(r,s)=>{mt(n,r,Ct(s))}),t&&(t.finalized_=!1),n}var N=new Fn,St=N.produce;N.produceWithPatches.bind(N);N.setAutoFreeze.bind(N);N.setUseStrictShallowCopy.bind(N);N.applyPatches.bind(N);N.createDraft.bind(N);N.finishDraft.bind(N);var se=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Tn(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Nn="Expected a function",wt="__lodash_hash_undefined__",kn="[object Function]",Mn="[object GeneratorFunction]",Ln="[object Symbol]",$n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Un=/^\w*$/,qn=/^\./,jn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Qn=/[\\^$.*+?()[\]{}|]/g,Gn=/\\(\\)?/g,Kn=/^\[object .+?Constructor\]$/,zn=typeof se=="object"&&se&&se.Object===Object&&se,Wn=typeof self=="object"&&self&&self.Object===Object&&self,Ue=zn||Wn||Function("return this")();function Bn(e,t){return e==null?void 0:e[t]}function Hn(e){var t=!1;if(e!=null&&typeof e.toString!="function")try{t=!!(e+"")}catch{}return t}var Yn=Array.prototype,Jn=Function.prototype,bt=Object.prototype,Se=Ue["__core-js_shared__"],Je=function(){var e=/[^.]+$/.exec(Se&&Se.keys&&Se.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),vt=Jn.toString,qe=bt.hasOwnProperty,Pt=bt.toString,Vn=RegExp("^"+vt.call(qe).replace(Qn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ve=Ue.Symbol,Xn=Yn.splice,Zn=Rt(Ue,"Map"),ne=Rt(Object,"create"),Xe=Ve?Ve.prototype:void 0,Ze=Xe?Xe.toString:void 0;function W(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function er(){this.__data__=ne?ne(null):{}}function tr(e){return this.has(e)&&delete this.__data__[e]}function nr(e){var t=this.__data__;if(ne){var n=t[e];return n===wt?void 0:n}return qe.call(t,e)?t[e]:void 0}function rr(e){var t=this.__data__;return ne?t[e]!==void 0:qe.call(t,e)}function sr(e,t){var n=this.__data__;return n[e]=ne&&t===void 0?wt:t,this}W.prototype.clear=er;W.prototype.delete=tr;W.prototype.get=nr;W.prototype.has=rr;W.prototype.set=sr;function V(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function or(){this.__data__=[]}function ir(e){var t=this.__data__,n=he(t,e);if(n<0)return!1;var r=t.length-1;return n==r?t.pop():Xn.call(t,n,1),!0}function ar(e){var t=this.__data__,n=he(t,e);return n<0?void 0:t[n][1]}function cr(e){return he(this.__data__,e)>-1}function ur(e,t){var n=this.__data__,r=he(n,e);return r<0?n.push([e,t]):n[r][1]=t,this}V.prototype.clear=or;V.prototype.delete=ir;V.prototype.get=ar;V.prototype.has=cr;V.prototype.set=ur;function B(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function lr(){this.__data__={hash:new W,map:new(Zn||V),string:new W}}function dr(e){return ge(this,e).delete(e)}function fr(e){return ge(this,e).get(e)}function pr(e){return ge(this,e).has(e)}function yr(e,t){return ge(this,e).set(e,t),this}B.prototype.clear=lr;B.prototype.delete=dr;B.prototype.get=fr;B.prototype.has=pr;B.prototype.set=yr;function he(e,t){for(var n=e.length;n--;)if(Pr(e[n][0],t))return n;return-1}function hr(e,t){t=Er(t,e)?[t]:_r(t);for(var n=0,r=t.length;e!=null&&n<r;)e=e[br(t[n++])];return n&&n==r?e:void 0}function gr(e){if(!Ot(e)||Sr(e))return!1;var t=Rr(e)||Hn(e)?Vn:Kn;return t.test(vr(e))}function mr(e){if(typeof e=="string")return e;if(Qe(e))return Ze?Ze.call(e):"";var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}function _r(e){return Dt(e)?e:wr(e)}function ge(e,t){var n=e.__data__;return Cr(t)?n[typeof t=="string"?"string":"hash"]:n.map}function Rt(e,t){var n=Bn(e,t);return gr(n)?n:void 0}function Er(e,t){if(Dt(e))return!1;var n=typeof e;return n=="number"||n=="symbol"||n=="boolean"||e==null||Qe(e)?!0:Un.test(e)||!$n.test(e)||t!=null&&e in Object(t)}function Cr(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}function Sr(e){return!!Je&&Je in e}var wr=je(function(e){e=Or(e);var t=[];return qn.test(e)&&t.push(""),e.replace(jn,function(n,r,s,o){t.push(s?o.replace(Gn,"$1"):r||n)}),t});function br(e){if(typeof e=="string"||Qe(e))return e;var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}function vr(e){if(e!=null){try{return vt.call(e)}catch{}try{return e+""}catch{}}return""}function je(e,t){if(typeof e!="function"||t&&typeof t!="function")throw new TypeError(Nn);var n=function(){var r=arguments,s=t?t.apply(this,r):r[0],o=n.cache;if(o.has(s))return o.get(s);var i=e.apply(this,r);return n.cache=o.set(s,i),i};return n.cache=new(je.Cache||B),n}je.Cache=B;function Pr(e,t){return e===t||e!==e&&t!==t}var Dt=Array.isArray;function Rr(e){var t=Ot(e)?Pt.call(e):"";return t==kn||t==Mn}function Ot(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function Dr(e){return!!e&&typeof e=="object"}function Qe(e){return typeof e=="symbol"||Dr(e)&&Pt.call(e)==Ln}function Or(e){return e==null?"":mr(e)}function xr(e,t,n){var r=e==null?void 0:hr(e,t);return r===void 0?n:r}var Ir=xr;const H=Tn(Ir);function xt(e,t,n){return St(e??{result:[],success:!0,totalCount:0},s=>{for(const o of t)switch(o.type){case"ADD":{s.result.findIndex(a=>H(o.payload.data,n)===H(a,n))===-1&&s.result.push(o.payload.data);break}case"UPDATE":{const i=s.result.findIndex(a=>H(o.payload.data,n)===H(a,n));i!==-1&&(s.result[i]=o.payload.data);break}case"DELETE":{const i=s.result.findIndex(a=>H(o.payload.data,n)===H(a,n));i!==-1&&s.result.splice(i,1);break}}})}function It(e,t,n,r,s,o){const i=(o==null?void 0:o.syncWindowMs)??500,a=d.useRef([]),u=d.useRef(null),l=d.useRef(null),c=d.useRef(s);c.current=s;const m=d.useCallback(()=>{const f=a.current;if(a.current=[],u.current=null,l.current=null,!(f.length===0||!r)){e.setQueryData(t,g=>xt(g,f,r));for(const g of f)(g.type==="ADD"||g.type==="UPDATE")&&e.setQueryData(n(g.payload.id,g.payload.namespace),{result:g.payload.data})}},[e,t,n,r]),p=d.useCallback(f=>{a.current.push(f),!(u.current!==null||l.current!==null)&&(c.current===1?u.current=setTimeout(m,i):l.current=requestAnimationFrame(m))},[m,i]);return d.useEffect(()=>()=>{u.current!==null&&(clearTimeout(u.current),u.current=null),l.current!==null&&(cancelAnimationFrame(l.current),l.current=null)},[]),p}const Fr=({pluginID:e,connectionID:t,resourceKey:n,idAccessor:r,namespaces:s})=>{const o=D(e),i=_.useQueryClient(),{showSnackbar:a}=M(),u=d.useMemo(()=>s??[],[s]),l=d.useMemo(()=>[o,t,n,u,"list"],[o,t,n,u]),c=d.useCallback((C,y)=>[o,t,n,y,C],[o,t,n]),{mutateAsync:m}=_.useMutation({mutationFn:async C=>E.Create(o,t,n,x.resource.CreateInput.createFrom({input:C.input,namespace:C.namespace??(u.length===1?u[0]:"")})),onSuccess:async C=>{var v;const y=C.result;let w="";(v=y==null?void 0:y.metadata)!=null&&v.name?w=y.metadata.name:y!=null&&y.id?w=y.id:y!=null&&y.name?w=y.name:y!=null&&y.ID?w=y.ID:y!=null&&y.Name&&(w=y.Name);const S=w?`Resource ${w} created`:"Resource created";a(S,"success"),await i.invalidateQueries({queryKey:l})},onError:I(a,"Failed to create resource")}),p=_.useQuery({queryKey:l,queryFn:async()=>E.List(o,t,n,x.resource.ListInput.createFrom({order:[{field:"name",descending:!1}],pagination:{page:1,pageSize:200},namespaces:u})),placeholderData:(C,y)=>C,retry:!1}),[f,g]=d.useState(b.IDLE);d.useEffect(()=>O.EventsOn(`${o}/${t}/watch/STATE`,y=>{y.resourceKey===n&&g(y.state)}),[o,t,n]);const h=It(i,l,c,r,f);return d.useEffect(()=>{if(!r)return;E.SubscribeResource(o,t,n);const C=O.EventsOn(`${o}/${t}/${n}/ADD`,S=>h({type:"ADD",payload:S})),y=O.EventsOn(`${o}/${t}/${n}/UPDATE`,S=>h({type:"UPDATE",payload:S})),w=O.EventsOn(`${o}/${t}/${n}/DELETE`,S=>h({type:"DELETE",payload:S}));return()=>{C(),y(),w(),E.UnsubscribeResource(o,t,n)}},[o,t,n,h]),{resources:p,create:m,watchState:f,isSyncing:f===b.SYNCING,isSynced:f===b.SYNCED,watchError:f===b.ERROR}},Ar=({pluginID:e})=>{const t=D(e),{showSnackbar:n}=M(),r=_.useMutation({mutationFn:async({opts:i,input:a})=>E.Create(t,i.connectionID,i.resourceKey,x.resource.CreateInput.createFrom({input:a.input,namespace:a.namespace??i.namespace??""})),onSuccess:(i,{opts:a})=>{n(`Resource ${a.resourceID} created`,"success")},onError(i,{opts:a}){G(n,i,`Failed to create resource ${a.resourceID}`)}}),s=_.useMutation({mutationFn:async({opts:i,input:a})=>E.Update(t,i.connectionID,i.resourceKey,x.resource.UpdateInput.createFrom({input:a.input,id:i.resourceID,namespace:i.namespace??""})),onSuccess:(i,{opts:a})=>{n(`Resource ${a.resourceID} updated`,"success")},onError(i,{opts:a}){G(n,i,`Failed to update resource ${a.resourceID}`)}}),o=_.useMutation({mutationFn:async({opts:i,input:a})=>E.Delete(t,i.connectionID,i.resourceKey,x.resource.DeleteInput.createFrom({id:i.resourceID,namespace:i.namespace??"",gracePeriodSeconds:a.gracePeriodSeconds})),onSuccess:(i,{opts:a})=>{n(`Resource ${a.resourceID} deleted`,"success")},onError(i,{opts:a}){G(n,i,`Failed to delete resource ${a.resourceID}`)}});return{create:r.mutateAsync,update:s.mutateAsync,remove:o.mutateAsync}},Tr=({pluginID:e,connectionID:t,resourceKey:n,enabled:r=!0})=>{const s=D(e),o=_.useQuery({queryKey:["RESOURCE_ACTIONS",s,t,n],queryFn:()=>E.GetActions(s,t,n),enabled:r&&!!s&&!!t&&!!n,staleTime:5*60*1e3});return{actions:o.data??[],isLoading:o.isLoading,error:o.error}},Nr=({pluginID:e,connectionID:t,resourceKey:n})=>{const r=D(e),s=_.useQueryClient(),{showSnackbar:o}=M(),i=_.useMutation({mutationFn:async({actionID:a,id:u="",namespace:l="",params:c={}})=>E.ExecuteAction(r,t,n,a,x.resource.ActionInput.createFrom({id:u,namespace:l,params:c})),onSuccess:a=>{a.message&&o(a.message,"success"),s.invalidateQueries({queryKey:["RESOURCES",r,t,n]})},onError:(a,u)=>{G(o,a,`Failed to execute action "${u.actionID}"`)}});return{executeAction:i.mutateAsync,isExecuting:i.isPending,error:i.error}},kr=({pluginID:e,connectionID:t,enabled:n=!0})=>{const r=D(e),s=_.useQuery({queryKey:["EDITOR_SCHEMAS",r,t],queryFn:()=>E.GetEditorSchemas(r,t),enabled:n&&!!r&&!!t,staleTime:10*60*1e3,retry:1});return{schemas:s.data??[],isLoading:s.isLoading,error:s.error,refetch:s.refetch}},Mr=({pluginID:e,connectionID:t,enabled:n=!0})=>{const r=D(e),s=_.useQueryClient(),o=[r,t,"watch-state"],i=d.useRef([]),a=d.useRef(!1),u=d.useCallback(p=>{s.setQueryData(o,f=>f&&St(f,g=>{g.resources[p.resourceKey]=p.state,g.resourceCounts[p.resourceKey]=p.resourceCount;let h=0,C=0;for(const y of Object.values(g.resources))y===b.SYNCED&&h++,(y===b.ERROR||y===b.FAILED)&&C++;g.syncedCount=h,g.errorCount=C}))},[s,r,t]),l=_.useQuery({queryKey:o,queryFn:async()=>{const p=await E.GetWatchState(r,t),f={};let g=0,h=0;for(const[y,w]of Object.entries(p.resources??{}))f[y]=w,w===b.SYNCED&&g++,w===b.ERROR&&h++;const C={};for(const[y,w]of Object.entries(p.resourceCounts??{}))C[y]=w;return{connection:p.connectionId,resources:f,resourceCounts:C,totalResources:Object.keys(f).length,syncedCount:g,errorCount:h}},enabled:n&&!!r&&!!t,refetchInterval:p=>{const f=p.state.data;if(!f||f.totalResources===0)return 3e3;let g=0;for(const h of Object.values(f.resources))(h===b.SYNCED||h===b.ERROR||h===b.STOPPED||h===b.FAILED||h===b.FORBIDDEN||h===b.SKIPPED)&&g++;return g>=f.totalResources?!1:3e3}});d.useEffect(()=>{if(!l.data||a.current)return;a.current=!0;const p=i.current;i.current=[];for(const f of p)u(f)},[l.data,u]),d.useEffect(()=>{if(!n||!r||!t)return;a.current=!1,i.current=[];const p=O.EventsOn(`${r}/${t}/watch/STATE`,f=>{a.current?u(f):i.current.push(f)});return()=>{p(),a.current=!1,i.current=[]}},[r,t,n,u]);const c=l.data;let m=0;if(c!=null&&c.resources)for(const p of Object.values(c.resources))(p===b.SYNCED||p===b.ERROR||p===b.STOPPED||p===b.FAILED||p===b.FORBIDDEN||p===b.SKIPPED)&&m++;return{summary:l,getResourceState:p=>c==null?void 0:c.resources[p],isFullySynced:c?c.totalResources>0&&m===c.totalResources:!1,syncProgress:c&&c.totalResources>0?m/c.totalResources:0,errorCount:(c==null?void 0:c.errorCount)??0}},Lr=()=>{const[e,t]=d.useState(new Map),n=d.useRef(new Map),r=d.useRef(new Map),s=d.useCallback(l=>{const c=ke(l),m=pt(n.current,l),p=ve(m);if(t(f=>{const g=new Map(f);return g.set(c,p),g}),r.current.has(c)&&(clearTimeout(r.current.get(c)),r.current.delete(c)),oe(p)){const f=setTimeout(()=>{t(g=>{const h=new Map(g);return h.delete(c),h}),n.current.delete(c),r.current.delete(c)},5e3);r.current.set(c,f)}},[]);d.useEffect(()=>{const l=O.EventsOn("watch/STATE",s);return()=>{l();for(const c of r.current.values())clearTimeout(c)}},[s]);const o=Array.from(e.values()),i=dt(o),a=o.find(l=>!oe(l))??o[0]??null,u=ft(o);return{syncs:o,hasSyncing:i,primarySync:a,aggregateProgress:u}},Ft=()=>{const e=d.useContext(Te);if(!e)throw new Error("useOperations must be used within an OperationsProvider");return e},$r=({pluginID:e,connectionID:t,resourceKey:n})=>{const r=D(e),{showSnackbar:s}=M(),{addOperation:o,updateOperation:i}=Ft(),a=d.useRef([]);return d.useEffect(()=>()=>{a.current.forEach(l=>l())},[]),{startStreamAction:d.useCallback(async({actionID:l,id:c,namespace:m,label:p,params:f={}})=>{try{const g=await E.StreamAction(r,t,n,l,x.resource.ActionInput.createFrom({id:c,namespace:m,params:f}));o({id:g,label:p,resourceKey:n,resourceName:c,namespace:m,connectionID:t,status:"running",startedAt:Date.now()});const h=`action/stream/${g}`,C=O.EventsOn(h,y=>{var w,S,v,F;switch(y.type){case"progress":{const P=y.data??{};i(g,{message:P.message,progress:P.ready!==void 0&&P.desired!==void 0?{ready:P.ready,desired:P.desired}:void 0});break}case"complete":i(g,{status:"completed",message:((w=y.data)==null?void 0:w.message)??"Completed",completedAt:Date.now()}),s(((S=y.data)==null?void 0:S.message)??p+" completed","success"),O.EventsOff(h);break;case"error":i(g,{status:"error",message:((v=y.data)==null?void 0:v.message)??"Failed",completedAt:Date.now()}),s(((F=y.data)==null?void 0:F.message)??p+" failed","error"),O.EventsOff(h);break}});return a.current.push(()=>{C(),O.EventsOff(h)}),g}catch(g){throw G(s,g,`Failed to start "${l}"`),g}},[r,t,n,o,i,s])}},Ur=()=>{const e=d.useContext(Ae);if(!e)throw new Error("useSettings must be used within a SettingsProvider");return e},qr=({to:e,withinContext:t,...n})=>{const{pluginId:r}=le();r||console.error("Link used outside of a plugin context");const s=`/_plugin/${r}${e.startsWith("/")?"":"/"}${e}`;return d.useMemo(()=>R.jsx(Z.Link,{style:{textDecoration:"none",color:"inherit"},...n,to:s}),[n,s])};function jr(){const e=Z.useNavigate(),t=Z.useLocation(),{pluginId:n}=le();n||console.error("usePluginRouter used outside of a plugin context");const r=`/_plugin/${n}`,s=t.pathname.startsWith(r)?t.pathname.slice(r.length)||"/":t.pathname,o=d.useCallback((i,a)=>{const{...u}=a??{};i.startsWith("/")?e(`${r}${i}`,u):e(i,u)},[e,r]);return d.useMemo(()=>({location:t,navigate:o,pluginPath:s}),[t,o,s])}class Qr{}class Gr{constructor(){L(this,"_extensions");L(this,"root");L(this,"pages");L(this,"_routes")}get extensions(){return this._extensions||[]}get Routes(){var t;if(!this._routes&&this.root)return[{path:"",index:!0,Component:this.root}];if(!((t=this._routes)!=null&&t.length))throw new Error("cannot use plugin without a root page or router");return this._routes}get Window(){if(!this._routes&&this.root)return R.jsx(this.root,{});const t=Z.createMemoryRouter(this._routes||[]);return R.jsx(Z.RouterProvider,{router:t})}registerExtensionPoints(t){return this._extensions=t||[],this}setRootPage(t){return this.root=t,this}withPage(t,n){return this.pages||(this.pages={}),this.pages[t]?(console.warn("Cannot register page with the same name. Please use a different name."),this):(this.pages[t]=n,this)}withRoutes(t){return this._routes=t,this}}var At=(e=>(e.MISSING_MANIFEST="MISSING_MANIFEST",e.MISSING_PLUGIN="MISSING_PLUGIN",e.MISSING_ENTRYPOINT="MISSING_ENTRYPOINT",e))(At||{});const Kr=e=>{const t=e.split("::");return t.length===1?{group:"core",version:"",kind:t[0]}:{group:t[0]||"core",version:t[1]||"",kind:t[2]||t[0]}},zr=e=>!e||e==="core"?"Core":e.charAt(0).toUpperCase()+e.slice(1);exports.ALL_SESSIONS_KEY=Q;exports.BottomDrawerContext=rt;exports.ConfirmationModalContext=ot;exports.ErrorTypes=k;exports.ExtensionPointRegistry=Yt;exports.ExtensionPointStore=ct;exports.ExtensionProvider=Ht;exports.Link=qr;exports.OperationsContext=Te;exports.OperationsProvider=jt;exports.PluginContext=ue;exports.PluginContextProvider=Lt;exports.PluginErrorCode=At;exports.PluginWindow=Gr;exports.PluginWindowRootProps=Qr;exports.RightDrawerContext=st;exports.SettingsContext=Ae;exports.SettingsProvider=Ut;exports.SnackbarProvider=Vt;exports.SyncPolicy=tn;exports.WatchState=b;exports.actionToSnackbar=et;exports.applyBatch=xt;exports.connectionListQueryKey=lt;exports.createErrorHandler=I;exports.defaultState=nt;exports.formatGroup=zr;exports.isCancelledError=Fe;exports.parseAppError=$;exports.parseResourceKey=Kr;exports.showAppError=G;exports.useActiveSyncs=Lr;exports.useBottomDrawer=Me;exports.useConfirmationModal=hn;exports.useConnection=Xt;exports.useConnectionNamespaces=en;exports.useConnectionStatus=nn;exports.useConnections=Zt;exports.useEditorSchemas=kr;exports.useEventBatcher=It;exports.useExec=cn;exports.useExecuteAction=Nr;exports.useExtensionPoint=Wt;exports.useExtensionPointComponents=Bt;exports.useExtensionRegistry=Ne;exports.useLogs=un;exports.useMetricProviders=ln;exports.useMetricProvidersForResource=yt;exports.useMetricStream=fn;exports.useOperations=Ft;exports.usePluginContext=le;exports.usePluginData=on;exports.usePluginRouter=jr;exports.usePluginSettings=$t;exports.usePortForwardSessions=pn;exports.useResolvedPluginId=D;exports.useResource=gn;exports.useResourceActions=Tr;exports.useResourceAreaComponent=mn;exports.useResourceGroups=_n;exports.useResourceMetrics=dn;exports.useResourceMutations=Ar;exports.useResourcePortForwarder=yn;exports.useResourceSearch=En;exports.useResourceType=Cn;exports.useResourceTypes=Sn;exports.useResources=Fr;exports.useRightDrawer=an;exports.useSettings=Ur;exports.useSnackbar=M;exports.useStreamAction=$r;exports.useWatchState=Mr;
|
package/dist/index.d.ts
CHANGED