@omniviewdev/runtime 0.7.2 → 0.7.4

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.
@@ -6,11 +6,13 @@ export type ShowResourceSidebarParams = {
6
6
  resourceID: string;
7
7
  resourceName?: string;
8
8
  namespace?: string;
9
+ validateData?: (data: unknown) => boolean;
10
+ signal?: AbortSignal;
9
11
  };
10
12
  export interface RightDrawerContextType {
11
13
  openDrawer: (component: DrawerComponent, ctx: DrawerContext) => void;
12
14
  closeDrawer: () => void;
13
- showResourceSidebar: (params: ShowResourceSidebarParams) => void;
15
+ showResourceSidebar: (params: ShowResourceSidebarParams) => Promise<void>;
14
16
  isOpen: boolean;
15
17
  }
16
18
  export declare const RightDrawerContext: import('react').Context<RightDrawerContextType | undefined>;
@@ -1,5 +1,7 @@
1
1
  import { default as React } from 'react';
2
2
  export type PluginContextProviderProps = {
3
3
  pluginId: string;
4
+ /** Background extension contexts render no loading surface and delegate failures to their local error boundary. */
5
+ headless?: boolean;
4
6
  };
5
- export declare function PluginContextProvider(props: React.PropsWithChildren<PluginContextProviderProps>): React.ReactElement;
7
+ export declare function PluginContextProvider(props: React.PropsWithChildren<PluginContextProviderProps>): React.ReactElement | null;
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var at=Object.defineProperty;var ct=(t,e,n)=>e in t?at(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var M=(t,e,n)=>ct(t,typeof e!="symbol"?e+"":e,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const C=require("react/jsx-runtime"),l=require("react"),Y=require("react-router-dom");require("./index-D_aIcqH0.cjs");const E=require("./graphservice-1J8q3eeL.cjs"),L=require("./models-BQsuB2Lj.cjs"),D=require("./events-CtgYnKmS.cjs"),v=require("@tanstack/react-query"),N=require("@omniviewdev/base-ui"),ut=require("./legacyEnum-DkV5yRdA.cjs"),re=l.createContext(void 0),F={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",PLUGIN_COMMITTED_CLEANUP_PENDING:"omniview:plugin/committed-cleanup-pending",PLUGIN_COMMIT_UNCERTAIN:"omniview:plugin/commit-uncertain",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",RESOURCE_LIMIT:"omniview:resource/limit",RESOURCE_CONTINUATION_EXPIRED:"omniview:resource/continuation-expired",RESOURCE_RESET_REQUIRED:"omniview:resource/reset-required",RESOURCE_PARTIAL:"omniview:resource/partial",RESOURCE_PROVIDER_ERROR:"omniview:resource/provider-error",CONNECTION_NOT_FOUND:"omniview:connection/not-found",CONNECTION_FAILED:"omniview:connection/failed",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"},Re={INVALID_REQUEST:[F.VALIDATION,400,"correctRequest"],UNSUPPORTED:[F.NOT_IMPLEMENTED,501,"refreshContract"],FORBIDDEN:[F.RESOURCE_FORBIDDEN,403,"none"],UNAUTHORIZED:[F.RESOURCE_UNAUTHORIZED,401,"none"],NOT_FOUND:[F.RESOURCE_NOT_FOUND,404,"none"],CONFLICT:[F.RESOURCE_CONFLICT,409,"refreshContract"],ALREADY_EXISTS:[F.RESOURCE_CONFLICT,409,"refreshContract"],CANCELLED:[F.CANCELLED,499,"none"],TIMEOUT:[F.RESOURCE_TIMEOUT,408,"none"],UNAVAILABLE:[F.CONNECTION_FAILED,503,"reconnect"],CONNECTION_ERROR:[F.CONNECTION_FAILED,503,"reconnect"],CERTIFICATE_ERROR:[F.CONNECTION_FAILED,502,"reconnect"],RESOURCE_LIMIT:[F.RESOURCE_LIMIT,429,"correctRequest"],CONTINUATION_EXPIRED:[F.RESOURCE_CONTINUATION_EXPIRED,410,"restartQuery"],RESET_REQUIRED:[F.RESOURCE_RESET_REQUIRED,409,"restartQuery"],PARTIAL_RESULT:[F.RESOURCE_PARTIAL,422,"none"],PROVIDER_ERROR:[F.RESOURCE_PROVIDER_ERROR,502,"none"],INTERNAL:[F.INTERNAL,500,"none"]};function ue(t){return typeof t=="object"&&t!==null?t:void 0}function Q(t,e){return typeof t=="string"&&t.length>0&&t.length<=e}function le(){return{type:F.CANCELLED,code:"CANCELLED",title:"Cancelled",status:499,detail:"The operation was cancelled.",recovery:"none"}}function te(t,e){if(e>4)return;if(t==="cancelled")return le();if(typeof t=="string"){const r=t.trim();if(!r.startsWith("{"))return;try{return te(JSON.parse(r),e+1)}catch{return}}const n=ue(t);if(n){if(n.name==="AbortError"||n.name==="CancelError")return le();if(Q(n.type,256)&&Q(n.title,256)&&typeof n.status=="number"&&Number.isInteger(n.status)&&n.status>=100&&n.status<=599&&typeof n.detail=="string"&&n.detail.length<=4096){const r={type:n.type,title:n.title,status:n.status,detail:n.detail};Q(n.code,64)&&(r.code=n.code),Q(n.requestId,256)&&(r.requestId=n.requestId),Q(n.instance,512)&&(r.instance=n.instance),Array.isArray(n.suggestions)&&(r.suggestions=n.suggestions.filter(i=>Q(i,512)).slice(0,8)),Array.isArray(n.actions)&&(r.actions=n.actions.filter(i=>{const o=ue(i);return!!o&&["navigate","retry","open-url","copy"].includes(String(o.type))&&Q(o.label,256)&&(o.target===void 0||Q(o.target,4096))}).slice(0,8)),["correctRequest","refreshContract","restartQuery","reconnect","none"].includes(String(n.recovery))&&(r.recovery=n.recovery);const s=ue(n.location);return(s==null?void 0:s.unit)==="utf8-byte"&&typeof s.start=="number"&&typeof s.end=="number"&&Number.isSafeInteger(s.start)&&Number.isSafeInteger(s.end)&&s.start>=0&&s.end>=s.start&&(r.location={start:s.start,end:s.end,unit:"utf8-byte"}),r}if(typeof n.code=="string"&&typeof n.title=="string"&&typeof n.message=="string"){let r=n.code;if(r==="PERMISSION_DENIED"&&(r="FORBIDDEN"),["INVALID_INPUT","FILTER_UNKNOWN_FIELD","FILTER_INVALID_OPERATOR"].includes(r)&&(r="INVALID_REQUEST"),Object.prototype.hasOwnProperty.call(Re,r)||(r="INTERNAL"),r==="CANCELLED")return le();const[s,i,o]=Re[r],a=r==="FORBIDDEN"||r==="UNAUTHORIZED"||r==="INTERNAL"||r==="PROVIDER_ERROR";return{type:s,status:i,code:r,recovery:o,title:a?r==="FORBIDDEN"?"Access denied":r==="UNAUTHORIZED"?"Authentication required":"Operation failed":Q(n.title,256)?n.title:"Operation failed",detail:a?"The operation could not be completed.":Q(n.message,4096)?n.message:"The operation could not be completed.",...!a&&Array.isArray(n.suggestions)?{suggestions:n.suggestions.filter(c=>Q(c,512)).slice(0,8)}:{}}}return te(n.message,e+1)??te(n.cause,e+1)}}function W(t){return te(t,0)??{type:F.INTERNAL,title:t==null?"Unknown error":"Error",status:500,detail:t==null?"An unknown error occurred.":"The operation could not be completed."}}function V(t){return W(t).type===F.CANCELLED}function Ae(t){switch(t.type){case"navigate":return{label:t.label,onClick:()=>{window.location.hash=t.target??""}};case"open-url":return{label:t.label,onClick:()=>{window.open(t.target,"_blank")}};case"copy":return{label:t.label,onClick:()=>{navigator.clipboard.writeText(t.target??"")}};case"retry":return{label:t.label,onClick:()=>{}};default:return{label:t.label,onClick:()=>{}}}}function De(t,e){var s,i;const n=[t.detail,...((s=t.suggestions)==null?void 0:s.map(o=>`• ${o}`))??[]].join(`
2
- `);return{message:e||(t.title!=="Error"?t.title:"Operation failed"),status:"error",details:n,actions:(i=t.actions)==null?void 0:i.map(Ae)}}function G(t,e,n){if(V(e))return;const r=W(e);t(De(r,n))}function q(t,e){return n=>{if(V(n))return;const r=W(n);t(De(r,r.title!=="Error"?r.title:e))}}function lt(t){const{children:e,pluginId:n}=t,[r,s]=l.useState({}),[i,o]=l.useState(new L.PluginMeta),[a,c]=l.useState(!1),[f,d]=l.useState(null),p=l.useRef(0),g=l.useRef(0);console.debug("[PluginContextProvider] render",{pluginId:n,metaLoaded:a,metaError:!!f});const y=l.useCallback(()=>{if(n===void 0||n==="")return;const _=++p.current;console.debug(`[PluginContextProvider] fetching settings for "${n}"`),E.PluginValues(n).then(u=>{_===p.current&&(console.debug(`[PluginContextProvider] settings loaded for "${n}"`,Object.keys(u)),s(u))}).catch(u=>{if(_!==p.current)return;const h=W(u);console.error(`[PluginContextProvider] error fetching settings for "${n}":`,h.detail)})},[n]),S=l.useCallback(()=>{if(n===void 0||n===""){console.debug("[PluginContextProvider] skipping meta fetch — empty pluginId");return}const _=++g.current;console.debug(`[PluginContextProvider] fetching meta for "${n}"`),d(null),E.GetPluginMeta(n).then(u=>{_===g.current&&(console.debug(`[PluginContextProvider] meta loaded for "${n}"`,{name:u==null?void 0:u.name,version:u==null?void 0:u.version}),o(u),c(!0))}).catch(u=>{if(_!==g.current)return;const h=W(u);console.error(`[PluginContextProvider] error fetching meta for "${n}":`,h.detail),d(h.detail),c(!1)})},[n]);return l.useEffect(()=>{if(a)return;const _=()=>{y(),S()},u=[D.On("plugin/init_complete",_),D.On("plugin/dev_install_complete",h=>{var R;((R=h.data)==null?void 0:R.id)===n&&_()}),D.On("plugin/inventory_changed",_)];return()=>{for(const h of u)h()}},[n,a,y,S]),l.useEffect(()=>(console.debug(`[PluginContextProvider] useEffect — pluginId changed to "${n}"`),c(!1),d(null),s({}),y(),S(),()=>{++p.current,++g.current}),[n,y,S]),f?C.jsx("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center",padding:24},children:C.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:[C.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[C.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"#EF4444",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[C.jsx("circle",{cx:"12",cy:"12",r:"10"}),C.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),C.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),C.jsx("span",{style:{fontSize:14,fontWeight:600,color:"#FECACA"},children:"Plugin failed to load"})]}),C.jsx("p",{style:{fontSize:13,color:"#A1A1AA",margin:"0 0 16px"},children:f}),C.jsx("button",{onClick:()=>S(),style:{background:"transparent",color:"#F87171",border:"1px solid #7F1D1D",borderRadius:6,padding:"6px 14px",fontSize:13,fontWeight:500,cursor:"pointer"},children:"Retry"})]})}):a?C.jsx(re.Provider,{value:{pluginId:n,settings:r,meta:i},children:e}):C.jsxs("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center"},children:[C.jsx("div",{style:{width:24,height:24,border:"2px solid #3F3F46",borderTopColor:"#A1A1AA",borderRadius:"50%",animation:"plugin-spin 0.8s linear infinite"}}),C.jsx("style",{children:"@keyframes plugin-spin { to { transform: rotate(360deg); } }"})]})}function se(){const t=l.useContext(re);if(!t)throw new Error("usePluginContext must be used within a PluginContextProvider");return t}function dt(){return se().settings}const me=l.createContext(void 0),ft=({children:t})=>{const[e,n]=l.useState({}),r=l.useRef(0),s=l.useCallback(()=>{const o=r.current+1;r.current=o,E.Values().then(a=>{o===r.current&&n(a)}).catch(a=>{o===r.current&&console.error("Error fetching settings:",a)})},[]);l.useEffect(()=>{const o=D.On("settings/changed",()=>s());return s(),()=>{r.current+=1,o()}},[s]);const i=l.useCallback(()=>{s()},[s]);return C.jsx(me.Provider,{value:{settings:e,reload:i},children:t})},Fe={height:32,focused:0,tabs:[],createTab:()=>{},createTabs:()=>{},updateTab:()=>{},focusTab:()=>{},reorderTab:()=>{},closeTab:()=>{},closeTabs:()=>{},resizeDrawer:()=>{},closeDrawer:()=>{},fullscreenDrawer:()=>{}},Ne=l.createContext(Fe),Le=l.createContext(void 0),ke=l.createContext(void 0),Ee=l.createContext(void 0),pt=3e4,ht=({children:t})=>{const[e,n]=l.useState([]),r=l.useCallback(a=>{n(c=>[a,...c])},[]),s=l.useCallback((a,c)=>{n(f=>f.map(d=>d.id===a?{...d,...c}:d))},[]),i=l.useCallback(a=>{n(c=>c.filter(f=>f.id!==a))},[]);l.useEffect(()=>{const a=[];for(const c of e)if(c.status!=="running"){const f=Date.now()-(c.completedAt??c.startedAt),d=Math.max(0,pt-f);a.push(setTimeout(()=>i(c.id),d))}return()=>a.forEach(clearTimeout)},[e,i]);const o=l.useMemo(()=>({operations:e,addOperation:r,updateOperation:s,removeOperation:i}),[e,r,s,i]);return C.jsx(Ee.Provider,{value:o,children:t})};var he=function(t,e){return he=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])},he(t,e)};function gt(t,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");he(t,e);function n(){this.constructor=t}t.prototype=e===null?Object.create(e):(n.prototype=e.prototype,new n)}var de="Invariant Violation",xe=Object.setPrototypeOf,yt=xe===void 0?function(t,e){return t.__proto__=e,t}:xe,mt=function(t){gt(e,t);function e(n){n===void 0&&(n=de);var r=t.call(this,typeof n=="number"?de+": "+n+" (see https://github.com/apollographql/invariant-packages)":n)||this;return r.framesToPop=1,r.name=de,yt(r,e.prototype),r}return e}(Error);function ge(t,e){if(!t)throw new mt(e)}var Me=["debug","log","warn","error","silent"],Et=Me.indexOf("log");function X(t){return function(){if(Me.indexOf(t)>=Et){var e=console[t]||console.log;return e.apply(console,arguments)}}}(function(t){t.debug=X("debug"),t.log=X("log"),t.warn=X("warn"),t.error=X("error")})(ge||(ge={}));const qe=l.createContext(void 0),Ue=()=>l.useContext(qe);function St(t){const e=Ue(),n=l.useRef(null),r=e==null?void 0:e.getExtensionPoint(t),s=l.useCallback(o=>{const a=[];return e&&a.push(e.subscribe(o)),r&&a.push(r.subscribe(o)),()=>{for(const c of a)c()}},[e,t,r]),i=l.useCallback(()=>{const o=e==null?void 0:e.getExtensionPoint(t);if(!o){if(n.current&&n.current.store===void 0)return n.current.sentinel;const f={};return n.current={store:void 0,version:-1,sentinel:f},f}const a=n.current;if(a&&a.store===o&&a.version===o.version)return a.sentinel;const c={};return n.current={store:o,version:o.version,sentinel:c},c},[e,t]);return l.useSyncExternalStore(s,i),e==null?void 0:e.getExtensionPoint(t)}const Ct=({registry:t,children:e})=>{const n=l.useRef(t);return ge(n.current===t,"You can't change the extension registry after it has been rendered"),C.jsx(qe.Provider,{value:n.current,children:e})},fe=t=>{if(!t||typeof t!="string")throw new TypeError(`extensionName is required to be a string and can't be: "${t}" (${typeof t})`);return t.trim()};class je{constructor(e){M(this,"id");M(this,"mode");M(this,"_pluginId");M(this,"_version",0);M(this,"_contributions",new Map);M(this,"_lookupCache",new Map);M(this,"_matcher");M(this,"_select");M(this,"_listeners",new Set);this.id=e.id,this.mode=e.mode??"multiple",this._pluginId=e.pluginId,this._matcher=e.matcher,this._select=e.select}get pluginId(){return this._pluginId}get version(){return this._version}register(e){if(this._contributions.has(e.id))throw new Error(`Contribution with id "${e.id}" already exists in extension point "${this.id}"`);this._contributions.set(e.id,e),this._invalidateCache(),this._notify()}unregister(e){this._contributions.delete(e)&&(this._invalidateCache(),this._notify())}provide(e){return this._getMatched(e).map(r=>r.value)}list(e){return this._getMatched(e)}listAll(){return Array.from(this._contributions.values())}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}removeContributionsByPlugin(e){let n=!1;for(const[r,s]of this._contributions)s.plugin===e&&(this._contributions.delete(r),n=!0);n&&(this._invalidateCache(),this._notify())}_getMatched(e){const n=this._getCacheKey(e);if(n!=null){const s=this._lookupCache.get(n);if(s){const i=s.map(o=>this._contributions.get(o)).filter(o=>o!=null);return this._applyMode(i,e)}}let r=this._sortDeterministic(Array.from(this._contributions.values()));return this._matcher&&e!==void 0&&(r=r.filter(s=>this._matcher(s,e))),n!=null&&this._lookupCache.set(n,r.map(s=>s.id)),this._applyMode(r,e)}_applyMode(e,n){if(this.mode==="single"){if(this._select){const r=this._select(e,n);return r?[r]:[]}return e.length>0?[e[0]]:[]}return e}_sortDeterministic(e){return[...e].sort((n,r)=>{const s=n.plugin.localeCompare(r.plugin);return s!==0?s:n.id.localeCompare(r.id)})}_getCacheKey(e){if(e!=null&&typeof e=="object"&&"getCacheKey"in e){const n=e.getCacheKey;if(typeof n=="function")return n()}}_invalidateCache(){this._lookupCache.clear()}_notify(){this._version++;for(const e of this._listeners)e()}}class vt{constructor(e){M(this,"_stores",new Map);M(this,"_storeUnsubs",new Map);M(this,"_listeners",new Set);if(e!=null&&e.initialStores)for(const n of e.initialStores)this.addExtensionPoint(n)}addExtensionPoint(e){const n=fe(e.id);if(this._stores.has(n)){const s=this._stores.get(n);throw new Error(`Extension point "${n}" already exists (owned by "${s.pluginId??"unknown"}")`)}const r=new je({...e,id:n});this._stores.set(n,r),this._storeUnsubs.set(n,r.subscribe(()=>this._notify())),this._notify()}getExtensionPoint(e){const n=fe(e);return this._stores.get(n)}hasExtensionPoint(e){const n=fe(e);return this._stores.has(n)}listExtensionPoints(){return Array.from(this._stores.keys())}removeExtensionPoints(e){var r;let n=!1;for(const[s,i]of this._stores)i.pluginId===e&&((r=this._storeUnsubs.get(s))==null||r(),this._storeUnsubs.delete(s),this._stores.delete(s),n=!0);n&&this._notify()}removeContributions(e){for(const n of this._stores.values())n.removeContributionsByPlugin(e);this._notify()}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}_notify(){for(const e of this._listeners)e()}}const j={Panel:{position:"fixed",right:"var(--ov-space-3)",bottom:36,zIndex:"calc(var(--ov-z-toast, 9999) + 1)",width:"min(480px, calc(100vw - 24px))",minWidth:0,maxHeight:"min(560px, calc(100dvh - 64px))",display:"flex",flexDirection:"column",overflow:"hidden",padding:0},Header:{flex:"none",gap:"var(--ov-space-2)",paddingInline:"var(--ov-space-3)",background:"var(--ov-color-bg-surface-raised)",borderBottom:"1px solid var(--ov-color-border-muted)"},HeaderActions:{marginLeft:"auto"},List:{minHeight:0,overflowY:"auto",overscrollBehavior:"contain"},Notice:{borderTop:"1px solid var(--ov-color-border-muted)"},Row:{display:"flex",alignItems:"center",gap:"var(--ov-space-1)",padding:"var(--ov-space-2) var(--ov-space-2) var(--ov-space-2) var(--ov-space-3)"},ErrorIcon:{flex:"none",color:"var(--ov-color-danger)"},Message:{flex:1,minWidth:0,justifyContent:"flex-start",textAlign:"left"},MessageText:{minWidth:0,overflowWrap:"anywhere"},Details:{padding:"0 var(--ov-space-3) var(--ov-space-3) 36px"},Code:{display:"block",margin:"var(--ov-space-2) 0",padding:"var(--ov-space-3)",maxHeight:240,overflow:"auto",whiteSpace:"pre-wrap",overflowWrap:"anywhere",lineHeight:1.5,userSelect:"text"},Actions:{display:"flex",flexWrap:"wrap",gap:"var(--ov-space-2)"},CopyError:{margin:0,padding:"var(--ov-space-3)",borderTop:"1px solid var(--ov-color-border-muted)"}},$e=l.createContext(void 0),wt={default:"info",info:"info",success:"success",warning:"warning",error:"danger"},_t=({children:t})=>{const{toast:e}=N.useToast(),[n,r]=l.useState([]),[s,i]=l.useState([]),[o,a]=l.useState(!1),[c,f]=l.useState(),[d,p]=l.useState(""),g=l.useRef(Date.now()),y=l.useRef(null);l.useEffect(()=>{var R;if(!o)return;const u=document.activeElement;(R=y.current)==null||R.focus();const h=m=>{m.key==="Escape"&&(m.stopPropagation(),a(!1))};return document.addEventListener("keydown",h),()=>{document.removeEventListener("keydown",h),u instanceof HTMLElement&&u.isConnected&&u.focus()}},[o]);const S=u=>{r(h=>[...h,u])},_=(u,h,R)=>{const m=typeof u=="object";let w="",x="info",b,I=5e3,O;if(m){if(w=u.message,u.showOnce){if(n.includes(w))return;S(w)}x=u.status,b=u.details,I=u.autoHideDuration??5e3,O=u.actions}else w=u,x=h,b=R;let P;if(x==="error"){const U={id:++g.current,message:w,details:b,created:new Date().toISOString(),actions:O};i(k=>[...k,U].slice(-20)),P={label:"Details",onClick:()=>{f(U.id),a(!0)}}}e(x==="error"?w:b??w,{severity:wt[x]??"info",title:x!=="error"&&b?w:void 0,duration:I,action:P??(O==null?void 0:O[0])})};return C.jsxs($e.Provider,{value:{showSnackbar:_,openNotifications:()=>{a(!0)},notificationCount:s.length},children:[t,o&&C.jsxs(N.Card,{ref:y,style:j.Panel,size:"sm",variant:"outline",surface:"overlay",elevation:3,"aria-label":"Notifications",tabIndex:-1,children:[C.jsxs(N.Toolbar,{size:"sm",style:j.Header,children:[C.jsx(N.Text,{size:"sm",weight:"semibold",children:"Notifications"}),C.jsx(N.Text,{size:"xs",tone:"muted",children:s.length}),C.jsxs(N.Toolbar.Group,{style:j.HeaderActions,children:[C.jsx(N.IconButton,{size:"sm",variant:"ghost","aria-label":"Clear history",title:"Clear history",disabled:s.length===0,onClick:()=>{i([]),f(void 0),p("")},children:C.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:C.jsx("path",{d:"m3 3 6 6m0-6L3 9M13 6h8M3 14h18M3 20h18"})})}),C.jsx(N.IconButton,{size:"sm",variant:"ghost","aria-label":"Close notifications",title:"Close notifications",onClick:()=>{a(!1)},children:C.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:C.jsx("path",{d:"m6 9 6 6 6-6"})})})]})]}),C.jsxs("div",{style:j.List,children:[s.length===0&&C.jsx(N.EmptyState,{size:"sm",title:"No recent errors",description:"Error details will appear here."}),s.slice().reverse().map(u=>{var R,m;const h=c===u.id;return C.jsxs("div",{style:j.Notice,children:[C.jsxs("div",{style:j.Row,children:[C.jsxs("svg",{style:j.ErrorIcon,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-label":"Error",role:"img",children:[C.jsx("circle",{cx:"12",cy:"12",r:"9"}),C.jsx("path",{d:"m9 9 6 6m0-6-6 6"})]}),C.jsx(N.Button,{size:"sm",variant:"ghost",style:j.Message,"aria-expanded":h,"aria-controls":`notification-${u.id}`,title:u.message,onClick:()=>{f(h?void 0:u.id),p("")},children:C.jsx(N.Text,{size:"sm",style:j.MessageText,truncate:!h,children:u.message})}),C.jsx(N.IconButton,{size:"sm",variant:"ghost","aria-label":h?"Collapse details":"Expand details",title:h?"Collapse details":"Expand details","aria-expanded":h,"aria-controls":`notification-${u.id}`,onClick:()=>{f(h?void 0:u.id),p("")},children:C.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:C.jsx("path",{d:h?"m6 15 6-6 6 6":"m6 9 6 6 6-6"})})}),C.jsx(N.IconButton,{size:"sm",variant:"ghost","aria-label":`Dismiss ${u.message}`,title:"Dismiss notification",onClick:()=>{i(w=>w.filter(x=>x.id!==u.id)),h&&(f(void 0),p(""))},children:C.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:C.jsx("path",{d:"m6 6 12 12m0-12L6 18"})})})]}),C.jsx("div",{id:`notification-${u.id}`,hidden:!h,style:j.Details,children:h&&C.jsxs(C.Fragment,{children:[C.jsx(N.Text,{size:"xs",tone:"muted",children:C.jsx("time",{dateTime:u.created,children:new Date(u.created).toLocaleString()})}),C.jsx(N.Code,{size:"sm",style:j.Code,children:(R=u.details)!=null&&R.length?u.details:u.message}),C.jsxs("div",{style:j.Actions,children:[C.jsx(N.Button,{size:"sm",variant:"ghost",onClick:async()=>{p("");try{await navigator.clipboard.writeText(`${u.message}
3
- ${u.created}
4
- ${u.details??""}`)}catch{p("Copy failed. Select the diagnostic text and copy it manually.")}},children:"Copy details"}),(m=u.actions)==null?void 0:m.map((w,x)=>C.jsx(N.Button,{size:"sm",variant:"outline",onClick:w.onClick,children:w.label},`${w.label}-${x}`))]})]})})]},u.id)})]}),d&&C.jsx(N.Text,{as:"p",size:"sm",role:"status",style:j.CopyError,children:d})]})]})},$=()=>{const t=l.useContext($e);if(t===void 0)throw new Error("useCustomSnackbar must be used within a CustomSnackbarProvider");return t};function A(t){const e=l.useContext(re),n=(e==null?void 0:e.pluginId)??t;if(!n)throw new Error("pluginID must be provided either via PluginContext or as an explicit parameter");return n}const bt=({pluginID:t,connectionID:e})=>{const n=A(t),r=v.useQueryClient(),{showSnackbar:s}=$(),i=[n,"connection","detail",e],{mutateAsync:o}=v.useMutation({mutationFn:async()=>E.StartConnection(n,e),onSuccess(p){r.setQueryData(i,p),r.invalidateQueries({queryKey:["EDITOR_SCHEMAS",n,e]})},onError:q(s,"Failed to start connection")}),{mutateAsync:a}=v.useMutation({mutationFn:async()=>E.StopConnection(n,e),onSuccess(p){r.setQueryData(i,p)},onError:q(s,"Failed to stop connection")}),{mutateAsync:c}=v.useMutation({mutationFn:async p=>E.UpdateConnection(n,p),onSuccess(p,{name:g}){s({message:`Connection ${g} successfully updated`,status:"success"}),r.setQueryData(i,p),r.setQueriesData({queryKey:[n,"connection","list"]},y=>y==null?void 0:y.map(S=>S.id===e?p:S))},onError:q(s,"Failed to update connection")}),{mutateAsync:f}=v.useMutation({mutationFn:async()=>E.RemoveConnection(n,e),onSuccess(){s({message:"Connection successfully removed",status:"success"}),r.setQueryData(i,void 0),r.setQueriesData({queryKey:[n,"connection","list"]},p=>p==null?void 0:p.filter(g=>g.id!==e))},onError:q(s,"Failed to remove connection")});return{connection:v.useQuery({queryKey:i,queryFn:async()=>E.GetConnection(n,e)}),startConnection:o,stopConnection:a,updateConnection:c,deleteConnection:f}},Qe=t=>[t,"connection","list"],Rt=({plugin:t})=>{const e=A(t),n=v.useQueryClient(),{showSnackbar:r}=$(),s=Qe(e),{mutateAsync:i}=v.useMutation({mutationFn:async f=>E.StartConnectionWatch(e,f.id),onError:q(r,"Failed to start connection watch")}),{mutateAsync:o}=v.useMutation({mutationFn:async f=>E.StopConnectionWatch(e,f.id),onError:q(r,"Failed to stop connection watch")}),a=l.useCallback(f=>{const d=f.data;console.log("got update to connections",d),n.setQueryData(s,d)},[n,s]);return l.useEffect(()=>{const f=D.On(`${e}/connection/sync`,a);return()=>{f()}},[e,a]),{connections:v.useQuery({queryKey:s,queryFn:async()=>{try{return await E.ListConnections(e)}catch(f){console.log(f),q(r,"Failed to load connections")(f)}return[]},staleTime:3e4,placeholderData:v.keepPreviousData}),startWatch:i,stopWatch:o}},xt=({pluginID:t,connectionID:e})=>{const n=A(t),r=[n,"connection","namespaces",e];return{namespaces:v.useQuery({queryKey:r,queryFn:async()=>E.GetConnectionNamespaces(n,e)})}},T=ut.withLegacyNames(L.WatchState,"WatchState");function ye(t){const e=Object.values(t.states),n=e.length;let r=0,s=0,i=0,o=0;for(const d of e)d===T.WatchStateSynced&&r++,(d===T.WatchStateError||d===T.WatchStateFailed)&&s++,d===T.WatchStateForbidden&&i++,d===T.WatchStateSkipped&&o++;const a=n-o,c=e.filter(d=>d===T.WatchStateSynced||d===T.WatchStateError||d===T.WatchStateStopped||d===T.WatchStateFailed||d===T.WatchStateForbidden).length,f=a>0?c/a:0;return{pluginID:t.pluginID,connectionID:t.connectionID,totalResources:n,watchedTotal:a,syncedCount:r,errorCount:s,forbiddenCount:i,skippedCount:o,doneCount:c,progress:f}}function ne(t){return t.watchedTotal>0&&t.doneCount>=t.watchedTotal}function We(t){return t.some(e=>!ne(e))}function Ge(t){const e=t.reduce((r,s)=>r+s.watchedTotal,0);return e===0?0:t.reduce((r,s)=>r+s.doneCount,0)/e}function Se(t){return`${t.pluginId}/${t.connection}`}function Be(t,e){const n=Se(e);t.has(n)||t.set(n,{states:{},pluginID:e.pluginId,connectionID:e.connection});const r=t.get(n);return r.states[e.resourceKey]=e.state,r}function It(){const[t,e]=l.useState(new Set),[n,r]=l.useState({}),[s,i]=l.useState(new Map),o=l.useRef(new Map),[a,c]=l.useState(new Map);l.useEffect(()=>{const m=D.On("plugin/crash_recovery_failed",x=>{const b=x.data,I=b==null?void 0:b.pluginID;I&&c(O=>{const P=new Map(O);return P.set(I,b.error??"Crash recovery failed"),P})}),w=D.On("plugin/recovered",x=>{const b=x.data,I=b==null?void 0:b.pluginID;I&&c(O=>{if(!O.has(I))return O;const P=new Map(O);return P.delete(I),P})});return()=>{m(),w()}},[]),l.useEffect(()=>{E.GetAllConnectionStates().then(m=>{if(!m)return;const w={},x=new Set,b=new Map;for(const[I,O]of Object.entries(m))if(O){w[I]=O.map(P=>P.connection);for(const P of O){if(!P.started)continue;const U=`${I}/${P.connection.id}`;x.add(U);const k={pluginID:I,connectionID:P.connection.id,states:{}};if(P.resources)for(const[ce,it]of Object.entries(P.resources))k.states[ce]=it;o.current.set(U,k),b.set(U,ye(k))}}r(w),e(x),i(b)}).catch(()=>{})},[]),l.useEffect(()=>D.On("connection/status",w=>{const x=w.data,b=`${x.pluginID}/${x.connectionID}`;x.status==="DISCONNECTED"?(e(I=>{const O=new Set(I);return O.delete(b),O}),i(I=>{const O=new Map(I);return O.delete(b),O}),o.current.delete(b)):e(I=>{const O=new Set(I);return O.add(b),O}),E.ListAllConnections().then(I=>{if(!I)return;const O={};for(const[P,U]of Object.entries(I))U!=null&&(O[P]=U);r(O)}).catch(()=>{})}),[]);const f=l.useCallback(m=>{const w=m.data,x=Se(w);e(O=>{if(O.has(x))return O;const P=new Set(O);return P.add(x),P});const b=Be(o.current,w),I=ye(b);i(O=>{const P=new Map(O);return P.set(x,I),P})},[]);l.useEffect(()=>D.On("watch/STATE",f),[f]);const d=l.useCallback(async(m,w)=>{await E.StopConnection(m,w)},[]),p=l.useCallback(async(m,w)=>{await E.StartConnectionWatch(m,w)},[]),g=l.useCallback(async m=>{const w=a.get(m);c(x=>{if(!x.has(m))return x;const b=new Map(x);return b.delete(m),b});try{await E.RetryFailedPlugin(m)}catch(x){throw c(b=>{const I=new Map(b);return I.set(m,w??"Reload failed"),I}),x}},[a]),y=[];for(const m of t){const[w,x]=m.split("/",2),I=(n[w]??[]).find(ce=>ce.id===x),O=s.get(m),P=O!=null&&!ne(O),U=O!=null&&O.errorCount>0,k=a.get(w);y.push({pluginID:w,connectionID:x,name:(I==null?void 0:I.name)??x,avatar:(I==null?void 0:I.avatar)??"",isStarted:!0,sync:O,isSyncing:P,hasErrors:U||k!=null,pluginFailed:k!=null,pluginError:k})}const S=new Map;for(const m of y){const w=S.get(m.pluginID)??[];w.push(m),S.set(m.pluginID,w)}const _=Array.from(s.values()),u=y.filter(m=>m.isSyncing),h=y.filter(m=>m.hasErrors),R=y.filter(m=>m.pluginFailed);return{entries:y,grouped:S,connectedCount:y.length,syncingCount:u.length,errorCount:h.length,failedCount:R.length,hasSyncing:We(_),aggregateProgress:Ge(_),disconnect:d,retryWatch:p,retryPlugin:g}}function Ot(t,e){return e===null?t===null:Array.isArray(e)?Array.isArray(t):typeof e=="object"?typeof t=="object"&&t!==null&&!Array.isArray(t):typeof t==typeof e}function Tt(t,e,n){const r=A(t),s=v.useQueryClient(),i=[r,"data",e],o=v.useQuery({queryKey:i,queryFn:async()=>{const c=await E.Get(r,e);return c==null?n:Ot(c,n)?c:(console.warn(`[usePluginData] stored value for "${e}" has unexpected type (expected ${Array.isArray(n)?"array":typeof n}, got ${Array.isArray(c)?"array":typeof c}). Using default.`),n)}}),a=v.useMutation({mutationFn:async c=>{await E.Set(r,e,c)},onMutate:async c=>{await s.cancelQueries({queryKey:i});const f=s.getQueryData(i);return s.setQueryData(i,c),{previous:f}},onError:(c,f,d)=>{(d==null?void 0:d.previous)!==void 0&&s.setQueryData(i,d.previous)},onSettled:()=>{s.invalidateQueries({queryKey:i})}});return{data:o.data??n,update:async c=>{await a.mutateAsync(c)},isLoading:o.isLoading}}const Pt=()=>{const t=l.useContext(Le);if(!t)throw new Error("useRightDrawer must be used within a RightDrawerProvider");return t},Ce=()=>{const t=l.useContext(Ne);if(t===void 0)throw new Error("useBottomDrawer must be used within a BottomDrawerProvider");return t},At=({pluginID:t})=>{const e=A(t),{showSnackbar:n}=$(),{createTab:r,updateTab:s}=Ce();return{createSession:v.useMutation({mutationFn:async({connectionID:o,icon:a,label:c,opts:f})=>{const d=`pending-${crypto.randomUUID()}`;r({id:d,title:c??"Connecting...",variant:"terminal",icon:a??"LuSquareTerminal",properties:{status:"connecting",pluginID:e,connectionID:o,opts:{...f}}});const p=L.SessionOptions.createFrom({command:["/bin/bash"],tty:!0,...f});try{const g=await E.CreateSession(e,o,p);if(!g)throw new Error("Failed to create session: null response");s({id:d},{id:g.id,title:c??`Session ${g.id.substring(0,8)}`,properties:{status:"connected",pluginID:e,connectionID:o,opts:{...f}}})}catch(g){const y=W(g);s({id:d},{properties:{status:"error",error:y.detail,pluginID:e,connectionID:o,opts:{...f}}}),G(n,g,"Failed to start session")}}}).mutateAsync}},Dt=({pluginID:t})=>{const e=A(t),{showSnackbar:n}=$(),{createTab:r}=Ce(),s=v.useMutation({mutationFn:async({connectionID:o,resourceKey:a,resourceID:c,resourceData:f,icon:d,label:p,target:g,follow:y=!0,tailLines:S=1e3,params:_})=>{const u=L.CreateSessionOptions.createFrom({resource_key:a,resource_id:c,resource_data:f,options:L.LogSessionOptions.createFrom({target:g??"",follow:y,include_previous:!1,include_timestamps:!0,tail_lines:S,since_seconds:0,limit_bytes:0,include_source_events:!0,params:_??{}})}),h=await E.CreateSession$1(e,o,u);if(!h)throw new Error("Failed to create log session: null response");return r({id:h.id,title:p??`Logs ${h.id.substring(0,8)}`,variant:"logs",icon:d??"LuLogs"}),h},onError:q(n,"Failed to start log session")}),i=v.useMutation({mutationFn:async o=>{await E.CloseSession(o)},onError:q(n,"Failed to close log session")});return{createLogSession:s.mutateAsync,closeLogSession:i.mutateAsync}},Ft=()=>v.useQuery({queryKey:["metric","providers"],queryFn:E.GetProviders,staleTime:3e4}),He=t=>v.useQuery({queryKey:["metric","providers",t],queryFn:()=>E.GetProvidersForResource(t),enabled:!!t,staleTime:3e4}),Nt=t=>{var u,h;const{connectionID:e,resourceKey:n,resourceID:r,resourceNamespace:s="",resourceData:i={},metricIDs:o=[],shape:a=0,timeRange:c,refreshInterval:f=0,enabled:d=!0}=t,{data:p,isLoading:g}=He(n),y=p??[],S=c?Math.max(Math.floor((c.end.getTime()-c.start.getTime())/250),15e3)*1e6:0,_=v.useQuery({queryKey:["metric","query",e,n,r,s,o,a,(u=c==null?void 0:c.start)==null?void 0:u.getTime(),(h=c==null?void 0:c.end)==null?void 0:h.getTime()],queryFn:async()=>{const R=await E.QueryAll(e,n,r,s,i,o,a,((c==null?void 0:c.start)??new Date(0)).toISOString(),((c==null?void 0:c.end)??new Date(0)).toISOString(),S),m={};for(const[w,x]of Object.entries(R))x!=null&&(m[w]=x);return m},enabled:d&&!!e&&!!n&&(n.startsWith("cluster::")||!!r)&&y.length>0,refetchInterval:f>0?f:void 0,staleTime:5e3,placeholderData:v.keepPreviousData});return{data:_.data??void 0,providers:y,isLoading:g||_.isLoading,error:_.error,refetch:_.refetch}},Lt=t=>{const{pluginID:e,connectionID:n,resourceKey:r,resourceID:s,resourceNamespace:i="",resourceData:o={},metricIDs:a=[],interval:c=1e4,enabled:f=!0}=t,d=A(e),[p,g]=l.useState(null),[y,S]=l.useState(null),[_,u]=l.useState(!1),[h,R]=l.useState(null),m=l.useRef(null),w=l.useCallback(async()=>{if(!(!f||!d||!n||!r||!s))try{const b=await E.Subscribe(d,n,{resource_key:r,resource_id:s,resource_namespace:i,resource_data:o,metric_ids:a,interval:c*1e6});S(b),u(!0),R(null);const I=D.On(`core/metrics/data/${b}`,P=>{const U=P.data;try{const k=JSON.parse(U);k.results&&g(k.results)}catch(k){console.error("Failed to parse metric stream data:",k)}}),O=D.On(`core/metrics/error/${b}`,P=>{const U=P.data;try{const k=JSON.parse(U);R(k.error||"Unknown error")}catch{R("Failed to parse metric stream error")}});m.current=()=>{I(),O()}}catch(b){R(b instanceof Error?b.message:String(b))}},[d,n,r,s,i,a,c,f]),x=l.useCallback(async()=>{if(y)try{await E.Unsubscribe(y)}catch(b){console.error("Failed to unsubscribe:",b)}m.current&&(m.current(),m.current=null),S(null),u(!1)},[y]);return l.useEffect(()=>()=>{y&&E.Unsubscribe(y).catch(console.error),m.current&&m.current()},[y]),{data:p,subscriptionID:y,isStreaming:_,error:h,start:w,stop:x}},B=["networker","portforward","all-sessions"];function kt(){const{showSnackbar:t}=$(),e=v.useQueryClient(),n=v.useQuery({queryKey:[...B],queryFn:async()=>E.ListAllPortForwardSessions().catch(i=>{if(W(i).detail.includes("not found"))return[];throw i}),retry:!1});l.useEffect(()=>{const i=D.On("core/networker/portforward/created",()=>{e.invalidateQueries({queryKey:[...B]})}),o=D.On("core/networker/portforward/closed",()=>{e.invalidateQueries({queryKey:[...B]})});return()=>{i(),o()}},[e]);const r=n.data??[],s=v.useMutation({mutationFn:async i=>E.ClosePortForwardSession(i),onError:q(t,"Failed to close port forwarding session"),onSuccess:async()=>{await e.invalidateQueries({queryKey:[...B]})}});return{sessions:n,activeSessions:r,closeSession:s.mutateAsync,openInBrowser:i=>D.OpenURL(`http://localhost:${i}`)}}function Mt({pluginID:t,connectionID:e,resourceID:n}){const r=A(t),s=["networker","portforward","sessions",r,e,n],{showSnackbar:i}=$(),o=v.useQueryClient(),a=v.useQuery({queryKey:s,queryFn:async()=>E.FindPortForwardSessions(r,e,L.FindPortForwardSessionRequest.createFrom({resource_id:n,connection_id:e})).catch(d=>{const p=W(d);return p.detail.includes("not found")?[]:(i({message:"Failed to fetch port forward sessions",status:"error",details:p.detail}),[])}),retry:!1}),c=v.useMutation({mutationFn:async({opts:d})=>{const p=L.PortForwardSessionOptions.createFrom({local_port:d.localPort||0,remote_port:d.remotePort,protocol:d.protocol||"TCP",connection_type:"RESOURCE",connection:{resource_data:d.resource,connection_id:e,plugin_id:r,resource_id:d.resourceId,resource_key:d.resourceKey},labels:d.labels??{},params:d.parameters??{}}),g=await E.StartResourcePortForwardingSession(r,e,p);if(!g)throw new Error("Failed to start port forwarding: null response");return d.openInBrowser&&D.OpenURL(`http://localhost:${g.local_port}`),g},onError:q(i,"Failed to start port forwarding session"),onSuccess:async()=>{await Promise.all([o.invalidateQueries({queryKey:s}),o.invalidateQueries({queryKey:[...B]})])}}),f=v.useMutation({mutationFn:async({opts:d})=>E.ClosePortForwardSession(d.sessionID),onError:q(i,"Failed to close port forwarding session"),onSuccess:async()=>{await Promise.all([o.invalidateQueries({queryKey:s}),o.invalidateQueries({queryKey:[...B]})])}});return{sessions:a,forward:c.mutateAsync,close:f.mutateAsync}}const qt=()=>{const t=l.useContext(ke);if(!t)throw new Error("useConfirmationModal must be used within a ConfirmationModalProvider");return t},Ut=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s=""})=>{const i=A(t),o=v.useQueryClient(),{showSnackbar:a}=$(),c=["RESOURCE",i,e,n,r,s],{mutateAsync:f}=v.useMutation({mutationFn:async g=>E.Update(i,e,n,L.UpdateInput.createFrom({input:g.input,id:r,namespace:s})),onSuccess:async()=>{a(`Resource ${r} updated`,"success"),await o.invalidateQueries({queryKey:c})},onError:q(a,`Failed to update resource ${r}`)}),{mutateAsync:d}=v.useMutation({mutationFn:async(g={})=>E.Delete(i,e,n,L.DeleteInput.createFrom({id:r,namespace:s,gracePeriodSeconds:g.gracePeriodSeconds})),onSuccess:async()=>{a(`Resource ${r} deleted`,"success"),await o.invalidateQueries({queryKey:c})},onError:q(a,`Failed to delete resource ${r}`)});return{resource:v.useQuery({queryKey:c,queryFn:async()=>E.Get$1(i,e,n,L.GetInput.createFrom({id:r,namespace:s})),retry:!1}),update:f,remove:d}},jt=t=>{const e=["component",t.plugin,t.resource,t.area];return{component:v.useQuery({queryKey:e,queryFn:async()=>E.GetResourceAreaComponent(t)})}},$t=({pluginID:t,connectionID:e})=>{const n=A(t),r=[n,"resource_groups","list"];return{groups:v.useQuery({queryKey:r,queryFn:async()=>E.GetResourceGroups(n,e),retry:!1})}},Qt=({pluginID:t,connectionID:e,searches:n})=>{const r=A(t),s=o=>[r,e,o.key,o.namespaces,"list"];return v.useQueries({queries:n.map(o=>({queryKey:s(o),queryFn:async()=>E.List(r,e,o.key,L.ListInput.createFrom({order:[{field:"name",descending:!1}],pagination:{page:1,pageSize:200},namespaces:o.namespaces})).then(a=>a?(console.log(a.result),a.result&&o.postFilter?Object.values(a.result).filter(o.postFilter):Object.values(a.result||{})):[]),retry:!1}))})},Wt=({pluginID:t,resourceKey:e})=>{const n=A(t),r=[n,"resources",e];return{resourceType:v.useQuery({queryKey:r,queryFn:async()=>E.GetResourceType(n,e),retry:!1})}},Gt=({pluginID:t,connectionID:e})=>{const n=A(t),r=[n,"resources","list",e];return{types:v.useQuery({queryKey:r,queryFn:async()=>E.GetResourceTypes(n,e),retry:!1})}};var Z=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Bt(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Ht="Expected a function",Ke="__lodash_hash_undefined__",Kt="[object Function]",zt="[object GeneratorFunction]",Yt="[object Symbol]",Vt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Jt=/^\w*$/,Xt=/^\./,Zt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,en=/[\\^$.*+?()[\]{}|]/g,tn=/\\(\\)?/g,nn=/^\[object .+?Constructor\]$/,rn=typeof Z=="object"&&Z&&Z.Object===Object&&Z,sn=typeof self=="object"&&self&&self.Object===Object&&self,ve=rn||sn||Function("return this")();function on(t,e){return t==null?void 0:t[e]}function an(t){var e=!1;if(t!=null&&typeof t.toString!="function")try{e=!!(t+"")}catch{}return e}var cn=Array.prototype,un=Function.prototype,ze=Object.prototype,pe=ve["__core-js_shared__"],Ie=function(){var t=/[^.]+$/.exec(pe&&pe.keys&&pe.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),Ye=un.toString,we=ze.hasOwnProperty,Ve=ze.toString,ln=RegExp("^"+Ye.call(we).replace(en,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Oe=ve.Symbol,dn=cn.splice,fn=Je(ve,"Map"),J=Je(Object,"create"),Te=Oe?Oe.prototype:void 0,Pe=Te?Te.toString:void 0;function H(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function pn(){this.__data__=J?J(null):{}}function hn(t){return this.has(t)&&delete this.__data__[t]}function gn(t){var e=this.__data__;if(J){var n=e[t];return n===Ke?void 0:n}return we.call(e,t)?e[t]:void 0}function yn(t){var e=this.__data__;return J?e[t]!==void 0:we.call(e,t)}function mn(t,e){var n=this.__data__;return n[t]=J&&e===void 0?Ke:e,this}H.prototype.clear=pn;H.prototype.delete=hn;H.prototype.get=gn;H.prototype.has=yn;H.prototype.set=mn;function z(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function En(){this.__data__=[]}function Sn(t){var e=this.__data__,n=oe(e,t);if(n<0)return!1;var r=e.length-1;return n==r?e.pop():dn.call(e,n,1),!0}function Cn(t){var e=this.__data__,n=oe(e,t);return n<0?void 0:e[n][1]}function vn(t){return oe(this.__data__,t)>-1}function wn(t,e){var n=this.__data__,r=oe(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}z.prototype.clear=En;z.prototype.delete=Sn;z.prototype.get=Cn;z.prototype.has=vn;z.prototype.set=wn;function K(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function _n(){this.__data__={hash:new H,map:new(fn||z),string:new H}}function bn(t){return ie(this,t).delete(t)}function Rn(t){return ie(this,t).get(t)}function xn(t){return ie(this,t).has(t)}function In(t,e){return ie(this,t).set(t,e),this}K.prototype.clear=_n;K.prototype.delete=bn;K.prototype.get=Rn;K.prototype.has=xn;K.prototype.set=In;function oe(t,e){for(var n=t.length;n--;)if(qn(t[n][0],e))return n;return-1}function On(t,e){e=Dn(e,t)?[e]:An(e);for(var n=0,r=e.length;t!=null&&n<r;)t=t[kn(e[n++])];return n&&n==r?t:void 0}function Tn(t){if(!Ze(t)||Nn(t))return!1;var e=Un(t)||an(t)?ln:nn;return e.test(Mn(t))}function Pn(t){if(typeof t=="string")return t;if(be(t))return Pe?Pe.call(t):"";var e=t+"";return e=="0"&&1/t==-1/0?"-0":e}function An(t){return Xe(t)?t:Ln(t)}function ie(t,e){var n=t.__data__;return Fn(e)?n[typeof e=="string"?"string":"hash"]:n.map}function Je(t,e){var n=on(t,e);return Tn(n)?n:void 0}function Dn(t,e){if(Xe(t))return!1;var n=typeof t;return n=="number"||n=="symbol"||n=="boolean"||t==null||be(t)?!0:Jt.test(t)||!Vt.test(t)||e!=null&&t in Object(e)}function Fn(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}function Nn(t){return!!Ie&&Ie in t}var Ln=_e(function(t){t=$n(t);var e=[];return Xt.test(t)&&e.push(""),t.replace(Zt,function(n,r,s,i){e.push(s?i.replace(tn,"$1"):r||n)}),e});function kn(t){if(typeof t=="string"||be(t))return t;var e=t+"";return e=="0"&&1/t==-1/0?"-0":e}function Mn(t){if(t!=null){try{return Ye.call(t)}catch{}try{return t+""}catch{}}return""}function _e(t,e){if(typeof t!="function"||e&&typeof e!="function")throw new TypeError(Ht);var n=function(){var r=arguments,s=e?e.apply(this,r):r[0],i=n.cache;if(i.has(s))return i.get(s);var o=t.apply(this,r);return n.cache=i.set(s,o),o};return n.cache=new(_e.Cache||K),n}_e.Cache=K;function qn(t,e){return t===e||t!==t&&e!==e}var Xe=Array.isArray;function Un(t){var e=Ze(t)?Ve.call(t):"";return e==Kt||e==zt}function Ze(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function jn(t){return!!t&&typeof t=="object"}function be(t){return typeof t=="symbol"||jn(t)&&Ve.call(t)==Yt}function $n(t){return t==null?"":Pn(t)}function Qn(t,e,n){var r=t==null?void 0:On(t,e);return r===void 0?n:r}var Wn=Qn;const ee=Bt(Wn);function et(t,e,n){const r=t??{result:[],success:!0,totalCount:0},s=[...r.result??[]];for(const i of e){const o=ee(i.payload.data,n);switch(i.type){case"ADD":{s.findIndex(c=>ee(c,n)===o)===-1&&s.push(i.payload.data);break}case"UPDATE":{const a=s.findIndex(c=>ee(c,n)===o);a!==-1&&(s[a]=i.payload.data);break}case"DELETE":{const a=s.findIndex(c=>ee(c,n)===o);a!==-1&&s.splice(a,1);break}}}return{...r,result:s}}function tt(t,e,n,r,s,i){const o=(i==null?void 0:i.syncWindowMs)??500,a=l.useRef([]),c=l.useRef(null),f=l.useRef(null),d=l.useRef(s);d.current=s;const p=l.useCallback(()=>{const y=a.current;if(a.current=[],c.current!==null&&(clearTimeout(c.current),c.current=null),f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),!(y.length===0||!r)){t.setQueryData(e,S=>et(S,y,r));for(const S of y)(S.type==="ADD"||S.type==="UPDATE")&&t.setQueryData(n(S.payload.id,S.payload.namespace),{result:S.payload.data})}},[t,e,n,r]),g=l.useCallback(y=>{a.current.push(y),!(c.current!==null||f.current!==null)&&(c.current=setTimeout(p,o),d.current!==1&&(f.current=requestAnimationFrame(p)))},[p,o]);return l.useEffect(()=>()=>{c.current!==null&&(clearTimeout(c.current),c.current=null),f.current!==null&&(cancelAnimationFrame(f.current),f.current=null)},[]),g}const Gn=({pluginID:t,connectionID:e,resourceKey:n,idAccessor:r,namespaces:s})=>{const i=A(t),o=v.useQueryClient(),{showSnackbar:a}=$(),c=l.useMemo(()=>s??[],[s]),f=l.useMemo(()=>[i,e,n,c,"list"],[i,e,n,c]),d=l.useCallback((u,h)=>[i,e,n,h,u],[i,e,n]),{mutateAsync:p}=v.useMutation({mutationFn:async u=>E.Create(i,e,n,L.CreateInput.createFrom({input:u.input,namespace:u.namespace??(c.length===1?c[0]:"")})),onSuccess:async u=>{var w;const h=u==null?void 0:u.result;let R="";(w=h==null?void 0:h.metadata)!=null&&w.name?R=h.metadata.name:h!=null&&h.id?R=h.id:h!=null&&h.name?R=h.name:h!=null&&h.ID?R=h.ID:h!=null&&h.Name&&(R=h.Name);const m=R?`Resource ${R} created`:"Resource created";a(m,"success"),await o.invalidateQueries({queryKey:f})},onError:q(a,"Failed to create resource")}),g=v.useQuery({queryKey:f,queryFn:async()=>E.List(i,e,n,L.ListInput.createFrom({order:[{field:"name",descending:!1}],pagination:{page:1,pageSize:200},namespaces:c})),placeholderData:(u,h)=>u,retry:!1}),[y,S]=l.useState(T.WatchStateIdle);l.useEffect(()=>D.On(`${i}/${e}/watch/STATE`,h=>{const R=h.data;R.resourceKey===n&&S(R.state)}),[i,e,n]);const _=tt(o,f,d,r,y);return l.useEffect(()=>{if(!r)return;E.SubscribeResource(i,e,n);const u=D.On(`${i}/${e}/${n}/ADD`,m=>_({type:"ADD",payload:m.data})),h=D.On(`${i}/${e}/${n}/UPDATE`,m=>_({type:"UPDATE",payload:m.data})),R=D.On(`${i}/${e}/${n}/DELETE`,m=>_({type:"DELETE",payload:m.data}));return()=>{u(),h(),R(),E.UnsubscribeResource(i,e,n)}},[i,e,n,_]),{resources:g,create:p,watchState:y,isSyncing:y===T.WatchStateSyncing,isSynced:y===T.WatchStateSynced,watchError:y===T.WatchStateError}},Bn=({pluginID:t})=>{const e=A(t),{showSnackbar:n}=$(),r=v.useMutation({mutationFn:async({opts:o,input:a})=>E.Create(e,o.connectionID,o.resourceKey,L.CreateInput.createFrom({input:a.input,namespace:a.namespace??o.namespace??""})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} created`,"success")},onError(o,{opts:a}){G(n,o,`Failed to create resource ${a.resourceID}`)}}),s=v.useMutation({mutationFn:async({opts:o,input:a})=>E.Update(e,o.connectionID,o.resourceKey,L.UpdateInput.createFrom({input:a.input,id:o.resourceID,namespace:o.namespace??""})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} updated`,"success")},onError(o,{opts:a}){G(n,o,`Failed to update resource ${a.resourceID}`)}}),i=v.useMutation({mutationFn:async({opts:o,input:a})=>E.Delete(e,o.connectionID,o.resourceKey,L.DeleteInput.createFrom({id:o.resourceID,namespace:o.namespace??"",gracePeriodSeconds:a.gracePeriodSeconds})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} deleted`,"success")},onError(o,{opts:a}){G(n,o,`Failed to delete resource ${a.resourceID}`)}});return{create:r.mutateAsync,update:s.mutateAsync,remove:i.mutateAsync}},Hn=({pluginID:t,connectionID:e,resourceKey:n,enabled:r=!0})=>{const s=A(t),i=v.useQuery({queryKey:["RESOURCE_ACTIONS",s,e,n],queryFn:()=>E.GetActions(s,e,n),enabled:r&&!!s&&!!e&&!!n,staleTime:5*60*1e3});return{actions:i.data??[],isLoading:i.isLoading,error:i.error}},Kn=({pluginID:t,connectionID:e,resourceKey:n})=>{const r=A(t),s=v.useQueryClient(),{showSnackbar:i}=$(),o=v.useMutation({mutationFn:async({actionID:a,id:c="",namespace:f="",params:d={}})=>E.ExecuteAction(r,e,n,a,L.ActionInput.createFrom({id:c,namespace:f,params:d})),onSuccess:a=>{a!=null&&a.message&&i(a.message,"success"),s.invalidateQueries({queryKey:["RESOURCES",r,e,n]})},onError:(a,c)=>{G(i,a,`Failed to execute action "${c.actionID}"`)}});return{executeAction:o.mutateAsync,isExecuting:o.isPending,error:o.error}},zn=({pluginID:t,connectionID:e,enabled:n=!0})=>{const r=A(t),s=v.useQuery({queryKey:["EDITOR_SCHEMAS",r,e],queryFn:()=>E.GetEditorSchemas(r,e),enabled:n&&!!r&&!!e,staleTime:10*60*1e3,retry:1});return{schemas:s.data??[],isLoading:s.isLoading,error:s.error,refetch:s.refetch}},Yn=({pluginID:t,connectionID:e,enabled:n=!0})=>{const r=A(t),s=v.useQueryClient(),i=[r,e,"watch-state"],o=l.useRef([]),a=l.useRef(!1),c=l.useCallback(g=>{s.setQueryData(i,y=>{if(!y)return y;const S={...y.resources,[g.resourceKey]:g.state},_={...y.resourceCounts,[g.resourceKey]:g.resourceCount};let u=0,h=0;for(const R of Object.values(S))R===T.WatchStateSynced&&u++,(R===T.WatchStateError||R===T.WatchStateFailed)&&h++;return{...y,resources:S,resourceCounts:_,totalResources:Object.keys(S).length,syncedCount:u,errorCount:h}})},[s,r,e]),f=v.useQuery({queryKey:i,queryFn:async()=>{const g=await E.GetWatchState(r,e);if(!g)throw new Error("Failed to get watch state: null response");const y={};let S=0,_=0;for(const[h,R]of Object.entries(g.resources??{}))R!=null&&(y[h]=R,R===T.WatchStateSynced&&S++,R===T.WatchStateError&&_++);const u={};for(const[h,R]of Object.entries(g.resourceCounts??{}))R!=null&&(u[h]=R);return{connection:g.connectionId,resources:y,resourceCounts:u,totalResources:Object.keys(y).length,syncedCount:S,errorCount:_}},enabled:n&&!!r&&!!e,refetchInterval:g=>{const y=g.state.data;if(!y||y.totalResources===0)return 3e3;let S=0;for(const _ of Object.values(y.resources))(_===T.WatchStateSynced||_===T.WatchStateError||_===T.WatchStateStopped||_===T.WatchStateFailed||_===T.WatchStateForbidden||_===T.WatchStateSkipped)&&S++;return S>=y.totalResources?!1:3e3}});l.useEffect(()=>{if(!f.data||a.current)return;a.current=!0;const g=o.current;o.current=[];for(const y of g)c(y)},[f.data,c]),l.useEffect(()=>{if(!n||!r||!e)return;a.current=!1,o.current=[];const g=D.On(`${r}/${e}/watch/STATE`,y=>{const S=y.data;a.current?c(S):o.current.push(S)});return()=>{g(),a.current=!1,o.current=[]}},[r,e,n,c]);const d=f.data;let p=0;if(d!=null&&d.resources)for(const g of Object.values(d.resources))(g===T.WatchStateSynced||g===T.WatchStateError||g===T.WatchStateStopped||g===T.WatchStateFailed||g===T.WatchStateForbidden||g===T.WatchStateSkipped)&&p++;return{summary:f,getResourceState:g=>d==null?void 0:d.resources[g],isFullySynced:d?d.totalResources>0&&p===d.totalResources:!1,syncProgress:d&&d.totalResources>0?p/d.totalResources:0,errorCount:(d==null?void 0:d.errorCount)??0}},Vn=()=>{const[t,e]=l.useState(new Map),n=l.useRef(new Map),r=l.useRef(new Map),s=l.useCallback(f=>{const d=f.data,p=Se(d),g=Be(n.current,d),y=ye(g);if(e(S=>{const _=new Map(S);return _.set(p,y),_}),r.current.has(p)&&(clearTimeout(r.current.get(p)),r.current.delete(p)),ne(y)){const S=setTimeout(()=>{e(_=>{const u=new Map(_);return u.delete(p),u}),n.current.delete(p),r.current.delete(p)},5e3);r.current.set(p,S)}},[]);l.useEffect(()=>{const f=D.On("watch/STATE",s);return()=>{f();for(const d of r.current.values())clearTimeout(d)}},[s]);const i=Array.from(t.values()),o=We(i),a=i.find(f=>!ne(f))??i[0]??null,c=Ge(i);return{syncs:i,hasSyncing:o,primarySync:a,aggregateProgress:c}},nt=()=>{const t=l.useContext(Ee);if(!t)throw new Error("useOperations must be used within an OperationsProvider");return t},Jn=({pluginID:t,connectionID:e,resourceKey:n})=>{const r=A(t),{showSnackbar:s}=$(),{addOperation:i,updateOperation:o}=nt(),a=l.useRef(new Set),c=l.useCallback((p,g=!1)=>{var y,S,_;p.disposed||(p.disposed=!0,(y=p.unsubscribe)==null||y.call(p),(S=p.open)==null||S.cancel(),(_=p.attach)==null||_.cancel(),p.handle&&(E.CancelStreamAction(p.handle).catch(()=>{}),g&&o(p.handle,{status:"cancelled",message:"Cancelled",completedAt:Date.now()})),a.current.delete(p))},[o]);l.useEffect(()=>()=>{for(const p of a.current)c(p,!0)},[r,e,n,c]);const f=l.useCallback(async({actionID:p,id:g,namespace:y,label:S,params:_={}})=>{const u={disposed:!1,terminal:!1,sequence:0};a.current.add(u);try{u.open=E.StreamAction(r,e,n,p,L.ActionInput.createFrom({id:g,namespace:y,params:_}));const h=await u.open;if(u.open=void 0,u.disposed)return E.CancelStreamAction(h).catch(()=>{}),h;u.handle=h,i({id:h,label:S,resourceKey:n,resourceName:g,namespace:y,connectionID:e,status:"running",startedAt:Date.now()});const R=w=>{if(u.disposed||!Number.isSafeInteger(w.sequence)||w.sequence<=u.sequence)return;u.sequence=w.sequence;const x=w.event,b=x.data??{};if(x.type==="error"){u.terminal=!0;const I=W(x.error);o(h,{status:V(I)?"cancelled":"error",message:I.title,completedAt:Date.now()}),G(s,I,S),c(u)}else if(x.type==="complete"){u.terminal=!0;const I=typeof b.message=="string"?b.message:`${S} completed`;o(h,{status:"completed",message:I,completedAt:Date.now()}),s(I,"success"),c(u)}else o(h,{message:typeof b.message=="string"?b.message:void 0,progress:typeof b.ready=="number"&&typeof b.desired=="number"?{ready:b.ready,desired:b.desired}:void 0})};u.unsubscribe=D.On(`action/stream/${h}`,w=>R(w.data)),u.attach=E.AttachStreamAction(h);const m=await u.attach;return u.attach=void 0,R(m),h}catch(h){if(u.terminal&&u.handle)return u.handle;throw u.disposed||(u.handle&&o(u.handle,{status:V(h)?"cancelled":"error",message:W(h).title,completedAt:Date.now()}),G(s,h,`Failed to start "${p}"`)),c(u),h}},[r,e,n,i,o,s,c]),d=l.useCallback(p=>{for(const g of a.current)if(g.handle===p){c(g,!0);return}},[c]);return{startStreamAction:f,cancelStreamAction:d}};function rt(t,e){return`${t}/${e}/graph/CHANGED`}function ae(t,e,n,r){const s=v.useQueryClient(),i=l.useRef(n);i.current=n;const o=JSON.stringify(n);l.useEffect(()=>{if(!r||!t||!e)return;const a=D.On(rt(t,e),()=>{s.invalidateQueries({queryKey:i.current,exact:!0})});return()=>{a()}},[s,t,e,o,r])}const Xn={owns:{outgoing:"Owns",incoming:"Owned by"},runs_on:{outgoing:"Runs on",incoming:"Running here"},uses:{outgoing:"Uses",incoming:"Used by"},exposes:{outgoing:"Exposes",incoming:"Exposed by"},manages:{outgoing:"Manages",incoming:"Managed by"},member_of:{outgoing:"Member of",incoming:"Members"},selects:{outgoing:"Selects",incoming:"Selected by"}};function Zn(t,e){const n=Xn[t];if(n)return n[e];const r=t.replace(/_/g," ");return e==="outgoing"?r:`${r} (incoming)`}function er(t,e){return t.pluginId===e.pluginId&&t.connectionId===e.connectionId&&t.resourceKey===e.resourceKey&&t.id===e.id&&(t.namespace??"")===(e.namespace??"")}function st(t,e){return e.map(n=>{const r=er(n.source,t);return{resource:r?n.target:n.source,type:n.type,direction:r?"outgoing":"incoming",label:n.label}})}const tr=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s="",direction:i="both",relationshipType:o,enabled:a=!0,refetchInterval:c=!1})=>{const f=A(t),d=["RESOURCE_RELATED",f,e,n,s,r,i,o??null],p=a&&!!f&&!!e&&!!n&&!!r;ae(f,e,d,p);const g=v.useQuery({queryKey:d,queryFn:async()=>E.GetRelated(f,e,n,s,r,i,o??null),enabled:p,refetchInterval:c}),y={pluginId:f,connectionId:e,resourceKey:n,id:r,namespace:s},S=g.data??[];return{related:st(y,S),edges:S,isLoading:g.isLoading,isFetching:g.isFetching,error:g.error,refetch:g.refetch}},nr=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s="",maxDepth:i=3,enabled:o=!0,refetchInterval:a=!1})=>{const c=A(t),f=["RESOURCE_DEPENDENCY_TREE",c,e,n,s,r,i],d=o&&!!c&&!!e&&!!n&&!!r;ae(c,e,f,d);const p=v.useQuery({queryKey:f,queryFn:async()=>E.GetDependencyTree(c,e,n,s,r,i),enabled:d,refetchInterval:a});return{tree:p.data??null,isLoading:p.isLoading,isFetching:p.isFetching,error:p.error,refetch:p.refetch}},rr=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s="",upDepth:i=2,downDepth:o=3,enabled:a=!0})=>{const c=A(t),f=["RESOURCE_GRAPH",c,e,n,s,r,i,o],d=a&&!!c&&!!e&&!!n&&!!r;ae(c,e,f,d);const p=v.useQuery({queryKey:f,queryFn:async()=>E.GetSubgraph(c,e,n,s,r,i,o),enabled:d});return{graph:p.data??null,isLoading:p.isLoading,isFetching:p.isFetching,error:p.error,refetch:p.refetch}},sr=()=>{const t=l.useContext(me);if(!t)throw new Error("useSettings must be used within a SettingsProvider");return t},or=({to:t,withinContext:e,...n})=>{const{pluginId:r}=se();r||console.error("Link used outside of a plugin context");const s=`/_plugin/${r}${t.startsWith("/")?"":"/"}${t}`;return l.useMemo(()=>C.jsx(Y.Link,{style:{textDecoration:"none",color:"inherit"},...n,to:s}),[n,s])};function ir(){const t=Y.useNavigate(),e=Y.useLocation(),{pluginId:n}=se();n||console.error("usePluginRouter used outside of a plugin context");const r=`/_plugin/${n}`,s=e.pathname.startsWith(r)?e.pathname.slice(r.length)||"/":e.pathname,i=l.useCallback((o,a)=>{const{...c}=a??{};o.startsWith("/")?t(`${r}${o}`,c):t(o,c)},[t,r]);return l.useMemo(()=>({location:e,navigate:i,pluginPath:s}),[e,i,s])}class ar{}class cr{constructor(){M(this,"_extensions");M(this,"root");M(this,"pages");M(this,"_routes")}get extensions(){return this._extensions||[]}get Routes(){var e;if(!this._routes&&this.root)return[{path:"",index:!0,Component:this.root}];if(!((e=this._routes)!=null&&e.length))throw new Error("cannot use plugin without a root page or router");return this._routes}get Window(){if(!this._routes&&this.root)return C.jsx(this.root,{});const e=Y.createMemoryRouter(this._routes||[]);return C.jsx(Y.RouterProvider,{router:e})}registerExtensionPoints(e){return this._extensions=e||[],this}setRootPage(e){return this.root=e,this}withPage(e,n){return this.pages||(this.pages={}),this.pages[e]?(console.warn("Cannot register page with the same name. Please use a different name."),this):(this.pages[e]=n,this)}withRoutes(e){return this._routes=e,this}}var ot=(t=>(t.MISSING_MANIFEST="MISSING_MANIFEST",t.MISSING_PLUGIN="MISSING_PLUGIN",t.MISSING_ENTRYPOINT="MISSING_ENTRYPOINT",t))(ot||{});const ur=t=>{const e=t.split("::");return e.length===1?{group:"core",version:"",kind:e[0]}:{group:e[0]||"core",version:e[1]||"",kind:e[2]||e[0]}},lr=t=>!t||t==="core"?"Core":t.charAt(0).toUpperCase()+t.slice(1);exports.ALL_SESSIONS_KEY=B;exports.BottomDrawerContext=Ne;exports.ConfirmationModalContext=ke;exports.ErrorTypes=F;exports.ExtensionPointRegistry=vt;exports.ExtensionPointStore=je;exports.ExtensionProvider=Ct;exports.Link=or;exports.OperationsContext=Ee;exports.OperationsProvider=ht;exports.PluginContext=re;exports.PluginContextProvider=lt;exports.PluginErrorCode=ot;exports.PluginWindow=cr;exports.PluginWindowRootProps=ar;exports.RightDrawerContext=Le;exports.SettingsContext=me;exports.SettingsProvider=ft;exports.SnackbarProvider=_t;exports.WatchState=T;exports.actionToSnackbar=Ae;exports.applyBatch=et;exports.connectionListQueryKey=Qe;exports.createErrorHandler=q;exports.defaultState=Fe;exports.formatGroup=lr;exports.graphChangedEvent=rt;exports.isCancelledError=V;exports.parseAppError=W;exports.parseResourceKey=ur;exports.relationshipLabel=Zn;exports.showAppError=G;exports.toRelatedResources=st;exports.useActiveSyncs=Vn;exports.useBottomDrawer=Ce;exports.useConfirmationModal=qt;exports.useConnection=bt;exports.useConnectionNamespaces=xt;exports.useConnectionStatus=It;exports.useConnections=Rt;exports.useDependencyTree=nr;exports.useEditorSchemas=zn;exports.useEventBatcher=tt;exports.useExec=At;exports.useExecuteAction=Kn;exports.useExtensionPoint=St;exports.useExtensionRegistry=Ue;exports.useLogs=Dt;exports.useMetricProviders=Ft;exports.useMetricProvidersForResource=He;exports.useMetricStream=Lt;exports.useOperations=nt;exports.usePluginContext=se;exports.usePluginData=Tt;exports.usePluginRouter=ir;exports.usePluginSettings=dt;exports.usePortForwardSessions=kt;exports.useRefetchOnGraphChange=ae;exports.useRelatedResources=tr;exports.useResolvedPluginId=A;exports.useResource=Ut;exports.useResourceActions=Hn;exports.useResourceAreaComponent=jt;exports.useResourceGraph=rr;exports.useResourceGroups=$t;exports.useResourceMetrics=Nt;exports.useResourceMutations=Bn;exports.useResourcePortForwarder=Mt;exports.useResourceSearch=Qt;exports.useResourceType=Wt;exports.useResourceTypes=Gt;exports.useResources=Gn;exports.useRightDrawer=Pt;exports.useSettings=sr;exports.useSnackbar=$;exports.useStreamAction=Jn;exports.useWatchState=Yn;
1
+ "use strict";var dt=Object.defineProperty;var ft=(t,e,n)=>e in t?dt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var F=(t,e,n)=>ft(t,typeof e!="symbol"?e+"":e,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("react/jsx-runtime"),u=require("react"),V=require("react-router-dom");require("./index-D_aIcqH0.cjs");const S=require("./graphservice-1J8q3eeL.cjs"),k=require("./models-BQsuB2Lj.cjs"),D=require("./events-CtgYnKmS.cjs"),v=require("@tanstack/react-query"),L=require("@omniviewdev/base-ui"),pt=require("./legacyEnum-DkV5yRdA.cjs"),se=u.createContext(void 0),N={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",PLUGIN_COMMITTED_CLEANUP_PENDING:"omniview:plugin/committed-cleanup-pending",PLUGIN_COMMIT_UNCERTAIN:"omniview:plugin/commit-uncertain",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",RESOURCE_LIMIT:"omniview:resource/limit",RESOURCE_CONTINUATION_EXPIRED:"omniview:resource/continuation-expired",RESOURCE_RESET_REQUIRED:"omniview:resource/reset-required",RESOURCE_PARTIAL:"omniview:resource/partial",RESOURCE_PROVIDER_ERROR:"omniview:resource/provider-error",CONNECTION_NOT_FOUND:"omniview:connection/not-found",CONNECTION_FAILED:"omniview:connection/failed",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"},xe={INVALID_REQUEST:[N.VALIDATION,400,"correctRequest"],UNSUPPORTED:[N.NOT_IMPLEMENTED,501,"refreshContract"],FORBIDDEN:[N.RESOURCE_FORBIDDEN,403,"none"],UNAUTHORIZED:[N.RESOURCE_UNAUTHORIZED,401,"none"],NOT_FOUND:[N.RESOURCE_NOT_FOUND,404,"none"],CONFLICT:[N.RESOURCE_CONFLICT,409,"refreshContract"],ALREADY_EXISTS:[N.RESOURCE_CONFLICT,409,"refreshContract"],CANCELLED:[N.CANCELLED,499,"none"],TIMEOUT:[N.RESOURCE_TIMEOUT,408,"none"],UNAVAILABLE:[N.CONNECTION_FAILED,503,"reconnect"],CONNECTION_ERROR:[N.CONNECTION_FAILED,503,"reconnect"],CERTIFICATE_ERROR:[N.CONNECTION_FAILED,502,"reconnect"],RESOURCE_LIMIT:[N.RESOURCE_LIMIT,429,"correctRequest"],CONTINUATION_EXPIRED:[N.RESOURCE_CONTINUATION_EXPIRED,410,"restartQuery"],RESET_REQUIRED:[N.RESOURCE_RESET_REQUIRED,409,"restartQuery"],PARTIAL_RESULT:[N.RESOURCE_PARTIAL,422,"none"],PROVIDER_ERROR:[N.RESOURCE_PROVIDER_ERROR,502,"none"],INTERNAL:[N.INTERNAL,500,"none"]};function le(t){return typeof t=="object"&&t!==null?t:void 0}function Q(t,e){return typeof t=="string"&&t.length>0&&t.length<=e}function de(){return{type:N.CANCELLED,code:"CANCELLED",title:"Cancelled",status:499,detail:"The operation was cancelled.",recovery:"none"}}function te(t,e){if(e>4)return;if(t==="cancelled")return de();if(typeof t=="string"){const r=t.trim();if(!r.startsWith("{"))return;try{return te(JSON.parse(r),e+1)}catch{return}}const n=le(t);if(n){if(n.name==="AbortError"||n.name==="CancelError")return de();if(Q(n.type,256)&&Q(n.title,256)&&typeof n.status=="number"&&Number.isInteger(n.status)&&n.status>=100&&n.status<=599&&typeof n.detail=="string"&&n.detail.length<=4096){const r={type:n.type,title:n.title,status:n.status,detail:n.detail};Q(n.code,64)&&(r.code=n.code),Q(n.requestId,256)&&(r.requestId=n.requestId),Q(n.instance,512)&&(r.instance=n.instance),Array.isArray(n.suggestions)&&(r.suggestions=n.suggestions.filter(i=>Q(i,512)).slice(0,8)),Array.isArray(n.actions)&&(r.actions=n.actions.filter(i=>{const o=le(i);return!!o&&["navigate","retry","open-url","copy"].includes(String(o.type))&&Q(o.label,256)&&(o.target===void 0||Q(o.target,4096))}).slice(0,8)),["correctRequest","refreshContract","restartQuery","reconnect","none"].includes(String(n.recovery))&&(r.recovery=n.recovery);const s=le(n.location);return(s==null?void 0:s.unit)==="utf8-byte"&&typeof s.start=="number"&&typeof s.end=="number"&&Number.isSafeInteger(s.start)&&Number.isSafeInteger(s.end)&&s.start>=0&&s.end>=s.start&&(r.location={start:s.start,end:s.end,unit:"utf8-byte"}),r}if(typeof n.code=="string"&&typeof n.title=="string"&&typeof n.message=="string"){let r=n.code;if(r==="PERMISSION_DENIED"&&(r="FORBIDDEN"),["INVALID_INPUT","FILTER_UNKNOWN_FIELD","FILTER_INVALID_OPERATOR"].includes(r)&&(r="INVALID_REQUEST"),Object.prototype.hasOwnProperty.call(xe,r)||(r="INTERNAL"),r==="CANCELLED")return de();const[s,i,o]=xe[r],a=r==="FORBIDDEN"||r==="UNAUTHORIZED"||r==="INTERNAL"||r==="PROVIDER_ERROR";return{type:s,status:i,code:r,recovery:o,title:a?r==="FORBIDDEN"?"Access denied":r==="UNAUTHORIZED"?"Authentication required":"Operation failed":Q(n.title,256)?n.title:"Operation failed",detail:a?"The operation could not be completed.":Q(n.message,4096)?n.message:"The operation could not be completed.",...!a&&Array.isArray(n.suggestions)?{suggestions:n.suggestions.filter(c=>Q(c,512)).slice(0,8)}:{}}}return te(n.message,e+1)??te(n.cause,e+1)}}function W(t){return te(t,0)??{type:N.INTERNAL,title:t==null?"Unknown error":"Error",status:500,detail:t==null?"An unknown error occurred.":"The operation could not be completed."}}function Y(t){return W(t).type===N.CANCELLED}function De(t){switch(t.type){case"navigate":return{label:t.label,onClick:()=>{window.location.hash=t.target??""}};case"open-url":return{label:t.label,onClick:()=>{window.open(t.target,"_blank")}};case"copy":return{label:t.label,onClick:()=>{navigator.clipboard.writeText(t.target??"")}};case"retry":return{label:t.label,onClick:()=>{}};default:return{label:t.label,onClick:()=>{}}}}function Ne(t,e){var s,i;const n=[t.detail,...((s=t.suggestions)==null?void 0:s.map(o=>`• ${o}`))??[]].join(`
2
+ `);return{message:e||(t.title!=="Error"?t.title:"Operation failed"),status:"error",details:n,actions:(i=t.actions)==null?void 0:i.map(De)}}function G(t,e,n){if(Y(e))return;const r=W(e);t(Ne(r,n))}function j(t,e){return n=>{if(Y(n))return;const r=W(n);t(Ne(r,r.title!=="Error"?r.title:e))}}function ht(t){const{children:e,pluginId:n,headless:r=!1}=t,[s,i]=u.useState({}),[o,a]=u.useState(new k.PluginMeta),[c,p]=u.useState(!1),[l,h]=u.useState(null),g=u.useRef(0),y=u.useRef(0);console.debug("[PluginContextProvider] render",{pluginId:n,metaLoaded:c,metaError:!!l});const C=u.useCallback(()=>{if(n===void 0||n==="")return;const d=++g.current;console.debug(`[PluginContextProvider] fetching settings for "${n}"`),S.PluginValues(n).then(f=>{d===g.current&&(console.debug(`[PluginContextProvider] settings loaded for "${n}"`,Object.keys(f)),i(f))}).catch(f=>{if(d!==g.current)return;const _=W(f);console.error(`[PluginContextProvider] error fetching settings for "${n}":`,_.detail)})},[n]),R=u.useCallback(()=>{if(n===void 0||n===""){console.debug("[PluginContextProvider] skipping meta fetch — empty pluginId");return}const d=++y.current;console.debug(`[PluginContextProvider] fetching meta for "${n}"`),h(null),S.GetPluginMeta(n).then(f=>{d===y.current&&(console.debug(`[PluginContextProvider] meta loaded for "${n}"`,{name:f==null?void 0:f.name,version:f==null?void 0:f.version}),a(f),p(!0))}).catch(f=>{if(d!==y.current)return;const _=W(f);console.error(`[PluginContextProvider] error fetching meta for "${n}":`,_.detail),h(_.detail),p(!1)})},[n]);if(u.useEffect(()=>{if(c)return;const d=()=>{C(),R()},f=[D.On("plugin/init_complete",d),D.On("plugin/dev_install_complete",_=>{var E;((E=_.data)==null?void 0:E.id)===n&&d()}),D.On("plugin/inventory_changed",d)];return()=>{for(const _ of f)_()}},[n,c,C,R]),u.useEffect(()=>(console.debug(`[PluginContextProvider] useEffect — pluginId changed to "${n}"`),p(!1),h(null),i({}),C(),R(),()=>{++g.current,++y.current}),[n,C,R]),l){if(r)throw new Error(l);return m.jsx("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center",padding:24},children:m.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:[m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[m.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"#EF4444",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[m.jsx("circle",{cx:"12",cy:"12",r:"10"}),m.jsx("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),m.jsx("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]}),m.jsx("span",{style:{fontSize:14,fontWeight:600,color:"#FECACA"},children:"Plugin failed to load"})]}),m.jsx("p",{style:{fontSize:13,color:"#A1A1AA",margin:"0 0 16px"},children:l}),m.jsx("button",{onClick:()=>R(),style:{background:"transparent",color:"#F87171",border:"1px solid #7F1D1D",borderRadius:6,padding:"6px 14px",fontSize:13,fontWeight:500,cursor:"pointer"},children:"Retry"})]})})}return c?m.jsx(se.Provider,{value:{pluginId:n,settings:s,meta:o},children:e}):r?null:m.jsxs("div",{style:{display:"flex",flex:1,alignItems:"center",justifyContent:"center"},children:[m.jsx("div",{style:{width:24,height:24,border:"2px solid #3F3F46",borderTopColor:"#A1A1AA",borderRadius:"50%",animation:"plugin-spin 0.8s linear infinite"}}),m.jsx("style",{children:"@keyframes plugin-spin { to { transform: rotate(360deg); } }"})]})}function oe(){const t=u.useContext(se);if(!t)throw new Error("usePluginContext must be used within a PluginContextProvider");return t}function gt(){return oe().settings}const Ee=u.createContext(void 0),yt=({children:t})=>{const[e,n]=u.useState({}),r=u.useRef(0),s=u.useCallback(()=>{const o=r.current+1;r.current=o,S.Values().then(a=>{o===r.current&&n(a)}).catch(a=>{o===r.current&&console.error("Error fetching settings:",a)})},[]);u.useEffect(()=>{const o=D.On("settings/changed",()=>s());return s(),()=>{r.current+=1,o()}},[s]);const i=u.useCallback(()=>{s()},[s]);return m.jsx(Ee.Provider,{value:{settings:e,reload:i},children:t})},Fe={height:32,focused:0,tabs:[],createTab:()=>{},createTabs:()=>{},updateTab:()=>{},focusTab:()=>{},reorderTab:()=>{},closeTab:()=>{},closeTabs:()=>{},resizeDrawer:()=>{},closeDrawer:()=>{},fullscreenDrawer:()=>{}},Le=u.createContext(Fe),ke=u.createContext(void 0),Me=u.createContext(void 0),Se=u.createContext(void 0),mt=3e4,Et=({children:t})=>{const[e,n]=u.useState([]),r=u.useCallback(a=>{n(c=>[a,...c])},[]),s=u.useCallback((a,c)=>{n(p=>p.map(l=>l.id===a?{...l,...c}:l))},[]),i=u.useCallback(a=>{n(c=>c.filter(p=>p.id!==a))},[]);u.useEffect(()=>{const a=[];for(const c of e)if(c.status!=="running"){const p=Date.now()-(c.completedAt??c.startedAt),l=Math.max(0,mt-p);a.push(setTimeout(()=>i(c.id),l))}return()=>a.forEach(clearTimeout)},[e,i]);const o=u.useMemo(()=>({operations:e,addOperation:r,updateOperation:s,removeOperation:i}),[e,r,s,i]);return m.jsx(Se.Provider,{value:o,children:t})};var ge=function(t,e){return ge=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])},ge(t,e)};function St(t,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");ge(t,e);function n(){this.constructor=t}t.prototype=e===null?Object.create(e):(n.prototype=e.prototype,new n)}var fe="Invariant Violation",Ie=Object.setPrototypeOf,Ct=Ie===void 0?function(t,e){return t.__proto__=e,t}:Ie,vt=function(t){St(e,t);function e(n){n===void 0&&(n=fe);var r=t.call(this,typeof n=="number"?fe+": "+n+" (see https://github.com/apollographql/invariant-packages)":n)||this;return r.framesToPop=1,r.name=fe,Ct(r,e.prototype),r}return e}(Error);function ye(t,e){if(!t)throw new vt(e)}var je=["debug","log","warn","error","silent"],_t=je.indexOf("log");function J(t){return function(){if(je.indexOf(t)>=_t){var e=console[t]||console.log;return e.apply(console,arguments)}}}(function(t){t.debug=J("debug"),t.log=J("log"),t.warn=J("warn"),t.error=J("error")})(ye||(ye={}));const qe=u.createContext(void 0),Ue=()=>u.useContext(qe);function $e(t){const e=Ue(),n=u.useRef(null),r=e==null?void 0:e.getExtensionPoint(t),s=u.useCallback(o=>{const a=[];return e&&a.push(e.subscribe(o)),r&&a.push(r.subscribe(o)),()=>{for(const c of a)c()}},[e,t,r]),i=u.useCallback(()=>{const o=e==null?void 0:e.getExtensionPoint(t);if(!o){if(n.current&&n.current.store===void 0)return n.current.sentinel;const p={};return n.current={store:void 0,version:-1,sentinel:p},p}const a=n.current;if(a&&a.store===o&&a.version===o.version)return a.sentinel;const c={};return n.current={store:o,version:o.version,sentinel:c},c},[e,t]);return u.useSyncExternalStore(s,i),e==null?void 0:e.getExtensionPoint(t)}const wt=({registry:t,children:e})=>{const n=u.useRef(t);return ye(n.current===t,"You can't change the extension registry after it has been rendered"),m.jsx(qe.Provider,{value:n.current,children:e})},pe=t=>{if(!t||typeof t!="string")throw new TypeError(`extensionName is required to be a string and can't be: "${t}" (${typeof t})`);return t.trim()};class Qe{constructor(e){F(this,"id");F(this,"mode");F(this,"_pluginId");F(this,"_version",0);F(this,"_contributions",new Map);F(this,"_lookupCache",new Map);F(this,"_matcher");F(this,"_select");F(this,"_listeners",new Set);this.id=e.id,this.mode=e.mode??"multiple",this._pluginId=e.pluginId,this._matcher=e.matcher,this._select=e.select}get pluginId(){return this._pluginId}get version(){return this._version}register(e){if(this._contributions.has(e.id))throw new Error(`Contribution with id "${e.id}" already exists in extension point "${this.id}"`);this._contributions.set(e.id,e),this._invalidateCache(),this._notify()}unregister(e){this._contributions.delete(e)&&(this._invalidateCache(),this._notify())}provide(e){return this._getMatched(e).map(r=>r.value)}list(e){return this._getMatched(e)}listAll(){return Array.from(this._contributions.values())}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}removeContributionsByPlugin(e){let n=!1;for(const[r,s]of this._contributions)s.plugin===e&&(this._contributions.delete(r),n=!0);n&&(this._invalidateCache(),this._notify())}_getMatched(e){const n=this._getCacheKey(e);if(n!=null){const s=this._lookupCache.get(n);if(s){const i=s.map(o=>this._contributions.get(o)).filter(o=>o!=null);return this._applyMode(i,e)}}let r=this._sortDeterministic(Array.from(this._contributions.values()));return this._matcher&&e!==void 0&&(r=r.filter(s=>this._matcher(s,e))),n!=null&&this._lookupCache.set(n,r.map(s=>s.id)),this._applyMode(r,e)}_applyMode(e,n){if(this.mode==="single"){if(this._select){const r=this._select(e,n);return r?[r]:[]}return e.length>0?[e[0]]:[]}return e}_sortDeterministic(e){return[...e].sort((n,r)=>{const s=n.plugin.localeCompare(r.plugin);return s!==0?s:n.id.localeCompare(r.id)})}_getCacheKey(e){if(e!=null&&typeof e=="object"&&"getCacheKey"in e){const n=e.getCacheKey;if(typeof n=="function")return n()}}_invalidateCache(){this._lookupCache.clear()}_notify(){this._version++;for(const e of this._listeners)e()}}class bt{constructor(e){F(this,"_stores",new Map);F(this,"_storeUnsubs",new Map);F(this,"_listeners",new Set);if(e!=null&&e.initialStores)for(const n of e.initialStores)this.addExtensionPoint(n)}addExtensionPoint(e){const n=pe(e.id);if(this._stores.has(n)){const s=this._stores.get(n);throw new Error(`Extension point "${n}" already exists (owned by "${s.pluginId??"unknown"}")`)}const r=new Qe({...e,id:n});this._stores.set(n,r),this._storeUnsubs.set(n,r.subscribe(()=>this._notify())),this._notify()}getExtensionPoint(e){const n=pe(e);return this._stores.get(n)}hasExtensionPoint(e){const n=pe(e);return this._stores.has(n)}listExtensionPoints(){return Array.from(this._stores.keys())}removeExtensionPoints(e){var r;let n=!1;for(const[s,i]of this._stores)i.pluginId===e&&((r=this._storeUnsubs.get(s))==null||r(),this._storeUnsubs.delete(s),this._stores.delete(s),n=!0);n&&this._notify()}removeContributions(e){for(const n of this._stores.values())n.removeContributionsByPlugin(e);this._notify()}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}_notify(){for(const e of this._listeners)e()}}const U={Panel:{position:"fixed",right:"var(--ov-space-3)",bottom:36,zIndex:"calc(var(--ov-z-toast, 9999) + 1)",width:"min(480px, calc(100vw - 24px))",minWidth:0,maxHeight:"min(560px, calc(100dvh - 64px))",display:"flex",flexDirection:"column",overflow:"hidden",padding:0},Header:{flex:"none",gap:"var(--ov-space-2)",paddingInline:"var(--ov-space-3)",background:"var(--ov-color-bg-surface-raised)",borderBottom:"1px solid var(--ov-color-border-muted)"},HeaderActions:{marginLeft:"auto"},List:{minHeight:0,overflowY:"auto",overscrollBehavior:"contain"},Notice:{borderTop:"1px solid var(--ov-color-border-muted)"},Row:{display:"flex",alignItems:"center",gap:"var(--ov-space-1)",padding:"var(--ov-space-2) var(--ov-space-2) var(--ov-space-2) var(--ov-space-3)"},ErrorIcon:{flex:"none",color:"var(--ov-color-danger)"},Message:{flex:1,minWidth:0,justifyContent:"flex-start",textAlign:"left"},MessageText:{minWidth:0,overflowWrap:"anywhere"},Details:{padding:"0 var(--ov-space-3) var(--ov-space-3) 36px"},Code:{display:"block",margin:"var(--ov-space-2) 0",padding:"var(--ov-space-3)",maxHeight:240,overflow:"auto",whiteSpace:"pre-wrap",overflowWrap:"anywhere",lineHeight:1.5,userSelect:"text"},Actions:{display:"flex",flexWrap:"wrap",gap:"var(--ov-space-2)"},CopyError:{margin:0,padding:"var(--ov-space-3)",borderTop:"1px solid var(--ov-color-border-muted)"}},We=u.createContext(void 0),Rt={default:"info",info:"info",success:"success",warning:"warning",error:"danger"},xt=({children:t})=>{const{toast:e}=L.useToast(),[n,r]=u.useState([]),[s,i]=u.useState([]),[o,a]=u.useState(!1),[c,p]=u.useState(),[l,h]=u.useState(""),g=u.useRef(Date.now()),y=u.useRef(null);u.useEffect(()=>{var _;if(!o)return;const d=document.activeElement;(_=y.current)==null||_.focus();const f=E=>{E.key==="Escape"&&(E.stopPropagation(),a(!1))};return document.addEventListener("keydown",f),()=>{document.removeEventListener("keydown",f),d instanceof HTMLElement&&d.isConnected&&d.focus()}},[o]);const C=d=>{r(f=>[...f,d])},R=(d,f,_)=>{const E=typeof d=="object";let w="",x="info",b,I=5e3,O;if(E){if(w=d.message,d.showOnce){if(n.includes(w))return;C(w)}x=d.status,b=d.details,I=d.autoHideDuration??5e3,O=d.actions}else w=d,x=f,b=_;let P;if(x==="error"){const q={id:++g.current,message:w,details:b,created:new Date().toISOString(),actions:O};i(M=>[...M,q].slice(-20)),P={label:"Details",onClick:()=>{p(q.id),a(!0)}}}e(x==="error"?w:b??w,{severity:Rt[x]??"info",title:x!=="error"&&b?w:void 0,duration:I,action:P??(O==null?void 0:O[0])})};return m.jsxs(We.Provider,{value:{showSnackbar:R,openNotifications:()=>{a(!0)},notificationCount:s.length},children:[t,o&&m.jsxs(L.Card,{ref:y,style:U.Panel,size:"sm",variant:"outline",surface:"overlay",elevation:3,"aria-label":"Notifications",tabIndex:-1,children:[m.jsxs(L.Toolbar,{size:"sm",style:U.Header,children:[m.jsx(L.Text,{size:"sm",weight:"semibold",children:"Notifications"}),m.jsx(L.Text,{size:"xs",tone:"muted",children:s.length}),m.jsxs(L.Toolbar.Group,{style:U.HeaderActions,children:[m.jsx(L.IconButton,{size:"sm",variant:"ghost","aria-label":"Clear history",title:"Clear history",disabled:s.length===0,onClick:()=>{i([]),p(void 0),h("")},children:m.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:m.jsx("path",{d:"m3 3 6 6m0-6L3 9M13 6h8M3 14h18M3 20h18"})})}),m.jsx(L.IconButton,{size:"sm",variant:"ghost","aria-label":"Close notifications",title:"Close notifications",onClick:()=>{a(!1)},children:m.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:m.jsx("path",{d:"m6 9 6 6 6-6"})})})]})]}),m.jsxs("div",{style:U.List,children:[s.length===0&&m.jsx(L.EmptyState,{size:"sm",title:"No recent errors",description:"Error details will appear here."}),s.slice().reverse().map(d=>{var _,E;const f=c===d.id;return m.jsxs("div",{style:U.Notice,children:[m.jsxs("div",{style:U.Row,children:[m.jsxs("svg",{style:U.ErrorIcon,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-label":"Error",role:"img",children:[m.jsx("circle",{cx:"12",cy:"12",r:"9"}),m.jsx("path",{d:"m9 9 6 6m0-6-6 6"})]}),m.jsx(L.Button,{size:"sm",variant:"ghost",style:U.Message,"aria-expanded":f,"aria-controls":`notification-${d.id}`,title:d.message,onClick:()=>{p(f?void 0:d.id),h("")},children:m.jsx(L.Text,{size:"sm",style:U.MessageText,truncate:!f,children:d.message})}),m.jsx(L.IconButton,{size:"sm",variant:"ghost","aria-label":f?"Collapse details":"Expand details",title:f?"Collapse details":"Expand details","aria-expanded":f,"aria-controls":`notification-${d.id}`,onClick:()=>{p(f?void 0:d.id),h("")},children:m.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:m.jsx("path",{d:f?"m6 15 6-6 6 6":"m6 9 6 6 6-6"})})}),m.jsx(L.IconButton,{size:"sm",variant:"ghost","aria-label":`Dismiss ${d.message}`,title:"Dismiss notification",onClick:()=>{i(w=>w.filter(x=>x.id!==d.id)),f&&(p(void 0),h(""))},children:m.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:m.jsx("path",{d:"m6 6 12 12m0-12L6 18"})})})]}),m.jsx("div",{id:`notification-${d.id}`,hidden:!f,style:U.Details,children:f&&m.jsxs(m.Fragment,{children:[m.jsx(L.Text,{size:"xs",tone:"muted",children:m.jsx("time",{dateTime:d.created,children:new Date(d.created).toLocaleString()})}),m.jsx(L.Code,{size:"sm",style:U.Code,children:(_=d.details)!=null&&_.length?d.details:d.message}),m.jsxs("div",{style:U.Actions,children:[m.jsx(L.Button,{size:"sm",variant:"ghost",onClick:async()=>{h("");try{await navigator.clipboard.writeText(`${d.message}
3
+ ${d.created}
4
+ ${d.details??""}`)}catch{h("Copy failed. Select the diagnostic text and copy it manually.")}},children:"Copy details"}),(E=d.actions)==null?void 0:E.map((w,x)=>m.jsx(L.Button,{size:"sm",variant:"outline",onClick:w.onClick,children:w.label},`${w.label}-${x}`))]})]})})]},d.id)})]}),l&&m.jsx(L.Text,{as:"p",size:"sm",role:"status",style:U.CopyError,children:l})]})]})},$=()=>{const t=u.useContext(We);if(t===void 0)throw new Error("useCustomSnackbar must be used within a CustomSnackbarProvider");return t};function A(t){const e=u.useContext(se),n=(e==null?void 0:e.pluginId)??t;if(!n)throw new Error("pluginID must be provided either via PluginContext or as an explicit parameter");return n}const It=({pluginID:t,connectionID:e})=>{const n=A(t),r=v.useQueryClient(),{showSnackbar:s}=$(),i=[n,"connection","detail",e],{mutateAsync:o}=v.useMutation({mutationFn:async()=>S.StartConnection(n,e),onSuccess(h){r.setQueryData(i,h),r.invalidateQueries({queryKey:["EDITOR_SCHEMAS",n,e]})},onError:j(s,"Failed to start connection")}),{mutateAsync:a}=v.useMutation({mutationFn:async()=>S.StopConnection(n,e),onSuccess(h){r.setQueryData(i,h)},onError:j(s,"Failed to stop connection")}),{mutateAsync:c}=v.useMutation({mutationFn:async h=>S.UpdateConnection(n,h),onSuccess(h,{name:g}){s({message:`Connection ${g} successfully updated`,status:"success"}),r.setQueryData(i,h),r.setQueriesData({queryKey:[n,"connection","list"]},y=>y==null?void 0:y.map(C=>C.id===e?h:C))},onError:j(s,"Failed to update connection")}),{mutateAsync:p}=v.useMutation({mutationFn:async()=>S.RemoveConnection(n,e),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(g=>g.id!==e))},onError:j(s,"Failed to remove connection")});return{connection:v.useQuery({queryKey:i,queryFn:async()=>S.GetConnection(n,e)}),startConnection:o,stopConnection:a,updateConnection:c,deleteConnection:p}},Ge=t=>[t,"connection","list"],Ot=({plugin:t})=>{const e=A(t),n=v.useQueryClient(),{showSnackbar:r}=$(),s=Ge(e),{mutateAsync:i}=v.useMutation({mutationFn:async p=>S.StartConnectionWatch(e,p.id),onError:j(r,"Failed to start connection watch")}),{mutateAsync:o}=v.useMutation({mutationFn:async p=>S.StopConnectionWatch(e,p.id),onError:j(r,"Failed to stop connection watch")}),a=u.useCallback(p=>{const l=p.data;console.log("got update to connections",l),n.setQueryData(s,l)},[n,s]);return u.useEffect(()=>{const p=D.On(`${e}/connection/sync`,a);return()=>{p()}},[e,a]),{connections:v.useQuery({queryKey:s,queryFn:async()=>{try{return await S.ListConnections(e)}catch(p){console.log(p),j(r,"Failed to load connections")(p)}return[]},staleTime:3e4,placeholderData:v.keepPreviousData}),startWatch:i,stopWatch:o}},Tt=({pluginID:t,connectionID:e})=>{const n=A(t),r=[n,"connection","namespaces",e];return{namespaces:v.useQuery({queryKey:r,queryFn:async()=>S.GetConnectionNamespaces(n,e)})}},T=pt.withLegacyNames(k.WatchState,"WatchState");function me(t){const e=Object.values(t.states),n=e.length;let r=0,s=0,i=0,o=0;for(const l of e)l===T.WatchStateSynced&&r++,(l===T.WatchStateError||l===T.WatchStateFailed)&&s++,l===T.WatchStateForbidden&&i++,l===T.WatchStateSkipped&&o++;const a=n-o,c=e.filter(l=>l===T.WatchStateSynced||l===T.WatchStateError||l===T.WatchStateStopped||l===T.WatchStateFailed||l===T.WatchStateForbidden).length,p=a>0?c/a:0;return{pluginID:t.pluginID,connectionID:t.connectionID,totalResources:n,watchedTotal:a,syncedCount:r,errorCount:s,forbiddenCount:i,skippedCount:o,doneCount:c,progress:p}}function ne(t){return t.watchedTotal>0&&t.doneCount>=t.watchedTotal}function Be(t){return t.some(e=>!ne(e))}function He(t){const e=t.reduce((r,s)=>r+s.watchedTotal,0);return e===0?0:t.reduce((r,s)=>r+s.doneCount,0)/e}function Ce(t){return`${t.pluginId}/${t.connection}`}function Ke(t,e){const n=Ce(e);t.has(n)||t.set(n,{states:{},pluginID:e.pluginId,connectionID:e.connection});const r=t.get(n);return r.states[e.resourceKey]=e.state,r}function Pt(){const[t,e]=u.useState(new Set),[n,r]=u.useState({}),[s,i]=u.useState(new Map),o=u.useRef(new Map),[a,c]=u.useState(new Map);u.useEffect(()=>{const E=D.On("plugin/crash_recovery_failed",x=>{const b=x.data,I=b==null?void 0:b.pluginID;I&&c(O=>{const P=new Map(O);return P.set(I,b.error??"Crash recovery failed"),P})}),w=D.On("plugin/recovered",x=>{const b=x.data,I=b==null?void 0:b.pluginID;I&&c(O=>{if(!O.has(I))return O;const P=new Map(O);return P.delete(I),P})});return()=>{E(),w()}},[]),u.useEffect(()=>{S.GetAllConnectionStates().then(E=>{if(!E)return;const w={},x=new Set,b=new Map;for(const[I,O]of Object.entries(E))if(O){w[I]=O.map(P=>P.connection);for(const P of O){if(!P.started)continue;const q=`${I}/${P.connection.id}`;x.add(q);const M={pluginID:I,connectionID:P.connection.id,states:{}};if(P.resources)for(const[ue,lt]of Object.entries(P.resources))M.states[ue]=lt;o.current.set(q,M),b.set(q,me(M))}}r(w),e(x),i(b)}).catch(()=>{})},[]),u.useEffect(()=>D.On("connection/status",w=>{const x=w.data,b=`${x.pluginID}/${x.connectionID}`;x.status==="DISCONNECTED"?(e(I=>{const O=new Set(I);return O.delete(b),O}),i(I=>{const O=new Map(I);return O.delete(b),O}),o.current.delete(b)):e(I=>{const O=new Set(I);return O.add(b),O}),S.ListAllConnections().then(I=>{if(!I)return;const O={};for(const[P,q]of Object.entries(I))q!=null&&(O[P]=q);r(O)}).catch(()=>{})}),[]);const p=u.useCallback(E=>{const w=E.data,x=Ce(w);e(O=>{if(O.has(x))return O;const P=new Set(O);return P.add(x),P});const b=Ke(o.current,w),I=me(b);i(O=>{const P=new Map(O);return P.set(x,I),P})},[]);u.useEffect(()=>D.On("watch/STATE",p),[p]);const l=u.useCallback(async(E,w)=>{await S.StopConnection(E,w)},[]),h=u.useCallback(async(E,w)=>{await S.StartConnectionWatch(E,w)},[]),g=u.useCallback(async E=>{const w=a.get(E);c(x=>{if(!x.has(E))return x;const b=new Map(x);return b.delete(E),b});try{await S.RetryFailedPlugin(E)}catch(x){throw c(b=>{const I=new Map(b);return I.set(E,w??"Reload failed"),I}),x}},[a]),y=[];for(const E of t){const[w,x]=E.split("/",2),I=(n[w]??[]).find(ue=>ue.id===x),O=s.get(E),P=O!=null&&!ne(O),q=O!=null&&O.errorCount>0,M=a.get(w);y.push({pluginID:w,connectionID:x,name:(I==null?void 0:I.name)??x,avatar:(I==null?void 0:I.avatar)??"",isStarted:!0,sync:O,isSyncing:P,hasErrors:q||M!=null,pluginFailed:M!=null,pluginError:M})}const C=new Map;for(const E of y){const w=C.get(E.pluginID)??[];w.push(E),C.set(E.pluginID,w)}const R=Array.from(s.values()),d=y.filter(E=>E.isSyncing),f=y.filter(E=>E.hasErrors),_=y.filter(E=>E.pluginFailed);return{entries:y,grouped:C,connectedCount:y.length,syncingCount:d.length,errorCount:f.length,failedCount:_.length,hasSyncing:Be(R),aggregateProgress:He(R),disconnect:l,retryWatch:h,retryPlugin:g}}function At(t,e){return e===null?t===null:Array.isArray(e)?Array.isArray(t):typeof e=="object"?typeof t=="object"&&t!==null&&!Array.isArray(t):typeof t==typeof e}function Dt(t,e,n){const r=A(t),s=v.useQueryClient(),i=[r,"data",e],o=v.useQuery({queryKey:i,queryFn:async()=>{const c=await S.Get(r,e);return c==null?n:At(c,n)?c:(console.warn(`[usePluginData] stored value for "${e}" has unexpected type (expected ${Array.isArray(n)?"array":typeof n}, got ${Array.isArray(c)?"array":typeof c}). Using default.`),n)}}),a=v.useMutation({mutationFn:async c=>{await S.Set(r,e,c)},onMutate:async c=>{await s.cancelQueries({queryKey:i});const p=s.getQueryData(i);return s.setQueryData(i,c),{previous:p}},onError:(c,p,l)=>{(l==null?void 0:l.previous)!==void 0&&s.setQueryData(i,l.previous)},onSettled:()=>{s.invalidateQueries({queryKey:i})}});return{data:o.data??n,update:async c=>{await a.mutateAsync(c)},isLoading:o.isLoading}}const Nt=()=>{const t=u.useContext(ke);if(!t)throw new Error("useRightDrawer must be used within a RightDrawerProvider");return t},ve=()=>{const t=u.useContext(Le);if(t===void 0)throw new Error("useBottomDrawer must be used within a BottomDrawerProvider");return t},Ft=({pluginID:t})=>{const e=A(t),{showSnackbar:n}=$(),{createTab:r,updateTab:s}=ve();return{createSession:v.useMutation({mutationFn:async({connectionID:o,icon:a,label:c,opts:p})=>{const l=`pending-${crypto.randomUUID()}`;r({id:l,title:c??"Connecting...",variant:"terminal",icon:a??"LuSquareTerminal",properties:{status:"connecting",pluginID:e,connectionID:o,opts:{...p}}});const h=k.SessionOptions.createFrom({command:["/bin/bash"],tty:!0,...p});try{const g=await S.CreateSession(e,o,h);if(!g)throw new Error("Failed to create session: null response");s({id:l},{id:g.id,title:c??`Session ${g.id.substring(0,8)}`,properties:{status:"connected",pluginID:e,connectionID:o,opts:{...p}}})}catch(g){const y=W(g);s({id:l},{properties:{status:"error",error:y.detail,pluginID:e,connectionID:o,opts:{...p}}}),G(n,g,"Failed to start session")}}}).mutateAsync}},Lt=({pluginID:t})=>{const e=A(t),{showSnackbar:n}=$(),{createTab:r}=ve(),s=v.useMutation({mutationFn:async({connectionID:o,resourceKey:a,resourceID:c,resourceData:p,icon:l,label:h,target:g,follow:y=!0,tailLines:C=1e3,params:R})=>{const d=k.CreateSessionOptions.createFrom({resource_key:a,resource_id:c,resource_data:p,options:k.LogSessionOptions.createFrom({target:g??"",follow:y,include_previous:!1,include_timestamps:!0,tail_lines:C,since_seconds:0,limit_bytes:0,include_source_events:!0,params:R??{}})}),f=await S.CreateSession$1(e,o,d);if(!f)throw new Error("Failed to create log session: null response");return r({id:f.id,title:h??`Logs ${f.id.substring(0,8)}`,variant:"logs",icon:l??"LuLogs"}),f},onError:j(n,"Failed to start log session")}),i=v.useMutation({mutationFn:async o=>{await S.CloseSession(o)},onError:j(n,"Failed to close log session")});return{createLogSession:s.mutateAsync,closeLogSession:i.mutateAsync}},kt=()=>v.useQuery({queryKey:["metric","providers"],queryFn:S.GetProviders,staleTime:3e4}),ze=t=>v.useQuery({queryKey:["metric","providers",t],queryFn:()=>S.GetProvidersForResource(t),enabled:!!t,staleTime:3e4}),Mt=t=>{var d,f;const{connectionID:e,resourceKey:n,resourceID:r,resourceNamespace:s="",resourceData:i={},metricIDs:o=[],shape:a=0,timeRange:c,refreshInterval:p=0,enabled:l=!0}=t,{data:h,isLoading:g}=ze(n),y=h??[],C=c?Math.max(Math.floor((c.end.getTime()-c.start.getTime())/250),15e3)*1e6:0,R=v.useQuery({queryKey:["metric","query",e,n,r,s,o,a,(d=c==null?void 0:c.start)==null?void 0:d.getTime(),(f=c==null?void 0:c.end)==null?void 0:f.getTime()],queryFn:async()=>{const _=await S.QueryAll(e,n,r,s,i,o,a,((c==null?void 0:c.start)??new Date(0)).toISOString(),((c==null?void 0:c.end)??new Date(0)).toISOString(),C),E={};for(const[w,x]of Object.entries(_))x!=null&&(E[w]=x);return E},enabled:l&&!!e&&!!n&&(n.startsWith("cluster::")||!!r)&&y.length>0,refetchInterval:p>0?p:void 0,staleTime:5e3,placeholderData:v.keepPreviousData});return{data:R.data??void 0,providers:y,isLoading:g||R.isLoading,error:R.error,refetch:R.refetch}},jt=t=>{const{pluginID:e,connectionID:n,resourceKey:r,resourceID:s,resourceNamespace:i="",resourceData:o={},metricIDs:a=[],interval:c=1e4,enabled:p=!0}=t,l=A(e),[h,g]=u.useState(null),[y,C]=u.useState(null),[R,d]=u.useState(!1),[f,_]=u.useState(null),E=u.useRef(null),w=u.useCallback(async()=>{if(!(!p||!l||!n||!r||!s))try{const b=await S.Subscribe(l,n,{resource_key:r,resource_id:s,resource_namespace:i,resource_data:o,metric_ids:a,interval:c*1e6});C(b),d(!0),_(null);const I=D.On(`core/metrics/data/${b}`,P=>{const q=P.data;try{const M=JSON.parse(q);M.results&&g(M.results)}catch(M){console.error("Failed to parse metric stream data:",M)}}),O=D.On(`core/metrics/error/${b}`,P=>{const q=P.data;try{const M=JSON.parse(q);_(M.error||"Unknown error")}catch{_("Failed to parse metric stream error")}});E.current=()=>{I(),O()}}catch(b){_(b instanceof Error?b.message:String(b))}},[l,n,r,s,i,a,c,p]),x=u.useCallback(async()=>{if(y)try{await S.Unsubscribe(y)}catch(b){console.error("Failed to unsubscribe:",b)}E.current&&(E.current(),E.current=null),C(null),d(!1)},[y]);return u.useEffect(()=>()=>{y&&S.Unsubscribe(y).catch(console.error),E.current&&E.current()},[y]),{data:h,subscriptionID:y,isStreaming:R,error:f,start:w,stop:x}},B=["networker","portforward","all-sessions"];function qt(){const{showSnackbar:t}=$(),e=v.useQueryClient(),n=v.useQuery({queryKey:[...B],queryFn:async()=>S.ListAllPortForwardSessions().catch(i=>{if(W(i).detail.includes("not found"))return[];throw i}),retry:!1});u.useEffect(()=>{const i=D.On("core/networker/portforward/created",()=>{e.invalidateQueries({queryKey:[...B]})}),o=D.On("core/networker/portforward/closed",()=>{e.invalidateQueries({queryKey:[...B]})});return()=>{i(),o()}},[e]);const r=n.data??[],s=v.useMutation({mutationFn:async i=>S.ClosePortForwardSession(i),onError:j(t,"Failed to close port forwarding session"),onSuccess:async()=>{await e.invalidateQueries({queryKey:[...B]})}});return{sessions:n,activeSessions:r,closeSession:s.mutateAsync,openInBrowser:i=>D.OpenURL(`http://localhost:${i}`)}}function Ut({pluginID:t,connectionID:e,resourceID:n}){const r=A(t),s=["networker","portforward","sessions",r,e,n],{showSnackbar:i}=$(),o=v.useQueryClient(),a=v.useQuery({queryKey:s,queryFn:async()=>S.FindPortForwardSessions(r,e,k.FindPortForwardSessionRequest.createFrom({resource_id:n,connection_id:e})).catch(l=>{const h=W(l);return h.detail.includes("not found")?[]:(i({message:"Failed to fetch port forward sessions",status:"error",details:h.detail}),[])}),retry:!1}),c=v.useMutation({mutationFn:async({opts:l})=>{const h=k.PortForwardSessionOptions.createFrom({local_port:l.localPort||0,remote_port:l.remotePort,protocol:l.protocol||"TCP",connection_type:"RESOURCE",connection:{resource_data:l.resource,connection_id:e,plugin_id:r,resource_id:l.resourceId,resource_key:l.resourceKey},labels:l.labels??{},params:l.parameters??{}}),g=await S.StartResourcePortForwardingSession(r,e,h);if(!g)throw new Error("Failed to start port forwarding: null response");return l.openInBrowser&&D.OpenURL(`http://localhost:${g.local_port}`),g},onError:j(i,"Failed to start port forwarding session"),onSuccess:async()=>{await Promise.all([o.invalidateQueries({queryKey:s}),o.invalidateQueries({queryKey:[...B]})])}}),p=v.useMutation({mutationFn:async({opts:l})=>S.ClosePortForwardSession(l.sessionID),onError:j(i,"Failed to close port forwarding session"),onSuccess:async()=>{await Promise.all([o.invalidateQueries({queryKey:s}),o.invalidateQueries({queryKey:[...B]})])}});return{sessions:a,forward:c.mutateAsync,close:p.mutateAsync}}const $t=()=>{const t=u.useContext(Me);if(!t)throw new Error("useConfirmationModal must be used within a ConfirmationModalProvider");return t},re={scope:(t,e,n)=>[t,e,n],list:(t,e,n,r=[])=>[t,e,n,r,"list"],resource:(t,e,n,r,s="")=>[t,e,n,s,r]},Qt=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s=""})=>{const i=A(t),o=v.useQueryClient(),{showSnackbar:a}=$(),c=re.resource(i,e,n,r,s),{mutateAsync:p}=v.useMutation({mutationFn:async g=>S.Update(i,e,n,k.UpdateInput.createFrom({input:g.input,id:r,namespace:s})),onSuccess:async()=>{a(`Resource ${r} updated`,"success"),await o.invalidateQueries({queryKey:c})},onError:j(a,`Failed to update resource ${r}`)}),{mutateAsync:l}=v.useMutation({mutationFn:async(g={})=>S.Delete(i,e,n,k.DeleteInput.createFrom({id:r,namespace:s,gracePeriodSeconds:g.gracePeriodSeconds})),onSuccess:async()=>{a(`Resource ${r} deleted`,"success"),await o.invalidateQueries({queryKey:c})},onError:j(a,`Failed to delete resource ${r}`)});return{resource:v.useQuery({queryKey:c,queryFn:async()=>S.Get$1(i,e,n,k.GetInput.createFrom({id:r,namespace:s})),retry:!1}),update:p,remove:l}},Wt=t=>{const e=["component",t.plugin,t.resource,t.area];return{component:v.useQuery({queryKey:e,queryFn:async()=>S.GetResourceAreaComponent(t)})}},Gt=({pluginID:t,connectionID:e})=>{const n=A(t),r=[n,"resource_groups","list"];return{groups:v.useQuery({queryKey:r,queryFn:async()=>S.GetResourceGroups(n,e),retry:!1})}},Bt=({pluginID:t,connectionID:e,searches:n})=>{const r=A(t),s=o=>[r,e,o.key,o.namespaces,"list"];return v.useQueries({queries:n.map(o=>({queryKey:s(o),queryFn:async()=>S.List(r,e,o.key,k.ListInput.createFrom({order:[{field:"name",descending:!1}],pagination:{page:1,pageSize:200},namespaces:o.namespaces})).then(a=>a?(console.log(a.result),a.result&&o.postFilter?Object.values(a.result).filter(o.postFilter):Object.values(a.result||{})):[]),retry:!1}))})},Ht=({pluginID:t,resourceKey:e})=>{const n=A(t),r=[n,"resources",e];return{resourceType:v.useQuery({queryKey:r,queryFn:async()=>S.GetResourceType(n,e),retry:!1})}},Kt=({pluginID:t,connectionID:e})=>{const n=A(t),r=[n,"resources","list",e];return{types:v.useQuery({queryKey:r,queryFn:async()=>S.GetResourceTypes(n,e),retry:!1})}};var Z=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function zt(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Vt="Expected a function",Ve="__lodash_hash_undefined__",Yt="[object Function]",Xt="[object GeneratorFunction]",Jt="[object Symbol]",Zt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,en=/^\w*$/,tn=/^\./,nn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,sn=/\\(\\)?/g,on=/^\[object .+?Constructor\]$/,an=typeof Z=="object"&&Z&&Z.Object===Object&&Z,cn=typeof self=="object"&&self&&self.Object===Object&&self,_e=an||cn||Function("return this")();function un(t,e){return t==null?void 0:t[e]}function ln(t){var e=!1;if(t!=null&&typeof t.toString!="function")try{e=!!(t+"")}catch{}return e}var dn=Array.prototype,fn=Function.prototype,Ye=Object.prototype,he=_e["__core-js_shared__"],Oe=function(){var t=/[^.]+$/.exec(he&&he.keys&&he.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),Xe=fn.toString,we=Ye.hasOwnProperty,Je=Ye.toString,pn=RegExp("^"+Xe.call(we).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Te=_e.Symbol,hn=dn.splice,gn=Ze(_e,"Map"),X=Ze(Object,"create"),Pe=Te?Te.prototype:void 0,Ae=Pe?Pe.toString:void 0;function H(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function yn(){this.__data__=X?X(null):{}}function mn(t){return this.has(t)&&delete this.__data__[t]}function En(t){var e=this.__data__;if(X){var n=e[t];return n===Ve?void 0:n}return we.call(e,t)?e[t]:void 0}function Sn(t){var e=this.__data__;return X?e[t]!==void 0:we.call(e,t)}function Cn(t,e){var n=this.__data__;return n[t]=X&&e===void 0?Ve:e,this}H.prototype.clear=yn;H.prototype.delete=mn;H.prototype.get=En;H.prototype.has=Sn;H.prototype.set=Cn;function z(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function vn(){this.__data__=[]}function _n(t){var e=this.__data__,n=ie(e,t);if(n<0)return!1;var r=e.length-1;return n==r?e.pop():hn.call(e,n,1),!0}function wn(t){var e=this.__data__,n=ie(e,t);return n<0?void 0:e[n][1]}function bn(t){return ie(this.__data__,t)>-1}function Rn(t,e){var n=this.__data__,r=ie(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}z.prototype.clear=vn;z.prototype.delete=_n;z.prototype.get=wn;z.prototype.has=bn;z.prototype.set=Rn;function K(t){var e=-1,n=t?t.length:0;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function xn(){this.__data__={hash:new H,map:new(gn||z),string:new H}}function In(t){return ae(this,t).delete(t)}function On(t){return ae(this,t).get(t)}function Tn(t){return ae(this,t).has(t)}function Pn(t,e){return ae(this,t).set(t,e),this}K.prototype.clear=xn;K.prototype.delete=In;K.prototype.get=On;K.prototype.has=Tn;K.prototype.set=Pn;function ie(t,e){for(var n=t.length;n--;)if($n(t[n][0],e))return n;return-1}function An(t,e){e=Ln(e,t)?[e]:Fn(e);for(var n=0,r=e.length;t!=null&&n<r;)t=t[qn(e[n++])];return n&&n==r?t:void 0}function Dn(t){if(!tt(t)||Mn(t))return!1;var e=Qn(t)||ln(t)?pn:on;return e.test(Un(t))}function Nn(t){if(typeof t=="string")return t;if(Re(t))return Ae?Ae.call(t):"";var e=t+"";return e=="0"&&1/t==-1/0?"-0":e}function Fn(t){return et(t)?t:jn(t)}function ae(t,e){var n=t.__data__;return kn(e)?n[typeof e=="string"?"string":"hash"]:n.map}function Ze(t,e){var n=un(t,e);return Dn(n)?n:void 0}function Ln(t,e){if(et(t))return!1;var n=typeof t;return n=="number"||n=="symbol"||n=="boolean"||t==null||Re(t)?!0:en.test(t)||!Zt.test(t)||e!=null&&t in Object(e)}function kn(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}function Mn(t){return!!Oe&&Oe in t}var jn=be(function(t){t=Gn(t);var e=[];return tn.test(t)&&e.push(""),t.replace(nn,function(n,r,s,i){e.push(s?i.replace(sn,"$1"):r||n)}),e});function qn(t){if(typeof t=="string"||Re(t))return t;var e=t+"";return e=="0"&&1/t==-1/0?"-0":e}function Un(t){if(t!=null){try{return Xe.call(t)}catch{}try{return t+""}catch{}}return""}function be(t,e){if(typeof t!="function"||e&&typeof e!="function")throw new TypeError(Vt);var n=function(){var r=arguments,s=e?e.apply(this,r):r[0],i=n.cache;if(i.has(s))return i.get(s);var o=t.apply(this,r);return n.cache=i.set(s,o),o};return n.cache=new(be.Cache||K),n}be.Cache=K;function $n(t,e){return t===e||t!==t&&e!==e}var et=Array.isArray;function Qn(t){var e=tt(t)?Je.call(t):"";return e==Yt||e==Xt}function tt(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function Wn(t){return!!t&&typeof t=="object"}function Re(t){return typeof t=="symbol"||Wn(t)&&Je.call(t)==Jt}function Gn(t){return t==null?"":Nn(t)}function Bn(t,e,n){var r=t==null?void 0:An(t,e);return r===void 0?n:r}var Hn=Bn;const ee=zt(Hn);function nt(t,e,n){const r=t??{result:[],success:!0,totalCount:0},s=[...r.result??[]];for(const i of e){const o=ee(i.payload.data,n);switch(i.type){case"ADD":{s.findIndex(c=>ee(c,n)===o)===-1&&s.push(i.payload.data);break}case"UPDATE":{const a=s.findIndex(c=>ee(c,n)===o);a!==-1&&(s[a]=i.payload.data);break}case"DELETE":{const a=s.findIndex(c=>ee(c,n)===o);a!==-1&&s.splice(a,1);break}}}return{...r,result:s}}function rt(t,e,n,r,s,i){const o=(i==null?void 0:i.syncWindowMs)??500,a=u.useRef([]),c=u.useRef(null),p=u.useRef(null),l=u.useRef(s);l.current=s;const h=u.useCallback(()=>{const y=a.current;if(a.current=[],c.current!==null&&(clearTimeout(c.current),c.current=null),p.current!==null&&(cancelAnimationFrame(p.current),p.current=null),!(y.length===0||!r)){t.setQueryData(e,C=>nt(C,y,r));for(const C of y)(C.type==="ADD"||C.type==="UPDATE")&&t.setQueryData(n(C.payload.id,C.payload.namespace),{success:!0,result:C.payload.data})}},[t,e,n,r]),g=u.useCallback(y=>{a.current.push(y),!(c.current!==null||p.current!==null)&&(c.current=setTimeout(h,o),l.current!==1&&(p.current=requestAnimationFrame(h)))},[h,o]);return u.useEffect(()=>()=>{c.current!==null&&(clearTimeout(c.current),c.current=null),p.current!==null&&(cancelAnimationFrame(p.current),p.current=null)},[]),g}const Kn=({pluginID:t,connectionID:e,resourceKey:n,idAccessor:r,namespaces:s})=>{const i=A(t),o=v.useQueryClient(),{showSnackbar:a}=$(),c=u.useMemo(()=>s??[],[s]),p=u.useMemo(()=>re.list(i,e,n,c),[i,e,n,c]),l=u.useCallback((d,f)=>re.resource(i,e,n,d,f),[i,e,n]),{mutateAsync:h}=v.useMutation({mutationFn:async d=>S.Create(i,e,n,k.CreateInput.createFrom({input:d.input,namespace:d.namespace??(c.length===1?c[0]:"")})),onSuccess:async d=>{var w;const f=d==null?void 0:d.result;let _="";(w=f==null?void 0:f.metadata)!=null&&w.name?_=f.metadata.name:f!=null&&f.id?_=f.id:f!=null&&f.name?_=f.name:f!=null&&f.ID?_=f.ID:f!=null&&f.Name&&(_=f.Name);const E=_?`Resource ${_} created`:"Resource created";a(E,"success"),await o.invalidateQueries({queryKey:p})},onError:j(a,"Failed to create resource")}),g=v.useQuery({queryKey:p,queryFn:async()=>S.List(i,e,n,k.ListInput.createFrom({order:[{field:"name",descending:!1}],pagination:{page:1,pageSize:200},namespaces:c})),placeholderData:(d,f)=>d,retry:!1}),[y,C]=u.useState(T.WatchStateIdle);u.useEffect(()=>D.On(`${i}/${e}/watch/STATE`,f=>{const _=f.data;_.resourceKey===n&&C(_.state)}),[i,e,n]);const R=rt(o,p,l,r,y);return u.useEffect(()=>{if(!r)return;S.SubscribeResource(i,e,n);const d=D.On(`${i}/${e}/${n}/ADD`,E=>R({type:"ADD",payload:E.data})),f=D.On(`${i}/${e}/${n}/UPDATE`,E=>R({type:"UPDATE",payload:E.data})),_=D.On(`${i}/${e}/${n}/DELETE`,E=>R({type:"DELETE",payload:E.data}));return()=>{d(),f(),_(),S.UnsubscribeResource(i,e,n)}},[i,e,n,R]),{resources:g,create:h,watchState:y,isSyncing:y===T.WatchStateSyncing,isSynced:y===T.WatchStateSynced,watchError:y===T.WatchStateError}},zn=({pluginID:t})=>{const e=A(t),{showSnackbar:n}=$(),r=v.useMutation({mutationFn:async({opts:o,input:a})=>S.Create(e,o.connectionID,o.resourceKey,k.CreateInput.createFrom({input:a.input,namespace:a.namespace??o.namespace??""})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} created`,"success")},onError(o,{opts:a}){G(n,o,`Failed to create resource ${a.resourceID}`)}}),s=v.useMutation({mutationFn:async({opts:o,input:a})=>S.Update(e,o.connectionID,o.resourceKey,k.UpdateInput.createFrom({input:a.input,id:o.resourceID,namespace:o.namespace??""})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} updated`,"success")},onError(o,{opts:a}){G(n,o,`Failed to update resource ${a.resourceID}`)}}),i=v.useMutation({mutationFn:async({opts:o,input:a})=>S.Delete(e,o.connectionID,o.resourceKey,k.DeleteInput.createFrom({id:o.resourceID,namespace:o.namespace??"",gracePeriodSeconds:a.gracePeriodSeconds})),onSuccess:(o,{opts:a})=>{n(`Resource ${a.resourceID} deleted`,"success")},onError(o,{opts:a}){G(n,o,`Failed to delete resource ${a.resourceID}`)}});return{create:r.mutateAsync,update:s.mutateAsync,remove:i.mutateAsync}},Vn=({pluginID:t,connectionID:e,resourceKey:n,enabled:r=!0})=>{const s=A(t),i=v.useQuery({queryKey:["RESOURCE_ACTIONS",s,e,n],queryFn:()=>S.GetActions(s,e,n),enabled:r&&!!s&&!!e&&!!n,staleTime:5*60*1e3});return{actions:i.data??[],isLoading:i.isLoading,error:i.error}},Yn=({pluginID:t,connectionID:e,resourceKey:n})=>{const r=A(t),s=v.useQueryClient(),{showSnackbar:i}=$(),o=v.useMutation({mutationFn:async({actionID:a,id:c="",namespace:p="",params:l={}})=>S.ExecuteAction(r,e,n,a,k.ActionInput.createFrom({id:c,namespace:p,params:l})),onSuccess:a=>{a!=null&&a.message&&i(a.message,"success"),s.invalidateQueries({queryKey:["RESOURCES",r,e,n]})},onError:(a,c)=>{G(i,a,`Failed to execute action "${c.actionID}"`)}});return{executeAction:o.mutateAsync,isExecuting:o.isPending,error:o.error}},Xn=({pluginID:t,connectionID:e,enabled:n=!0})=>{const r=A(t),s=v.useQuery({queryKey:["EDITOR_SCHEMAS",r,e],queryFn:()=>S.GetEditorSchemas(r,e),enabled:n&&!!r&&!!e,staleTime:10*60*1e3,retry:1});return{schemas:s.data??[],isLoading:s.isLoading,error:s.error,refetch:s.refetch}},Jn=({pluginID:t,connectionID:e,enabled:n=!0})=>{const r=A(t),s=v.useQueryClient(),i=[r,e,"watch-state"],o=u.useRef([]),a=u.useRef(!1),c=u.useCallback(g=>{s.setQueryData(i,y=>{if(!y)return y;const C={...y.resources,[g.resourceKey]:g.state},R={...y.resourceCounts,[g.resourceKey]:g.resourceCount};let d=0,f=0;for(const _ of Object.values(C))_===T.WatchStateSynced&&d++,(_===T.WatchStateError||_===T.WatchStateFailed)&&f++;return{...y,resources:C,resourceCounts:R,totalResources:Object.keys(C).length,syncedCount:d,errorCount:f}})},[s,r,e]),p=v.useQuery({queryKey:i,queryFn:async()=>{const g=await S.GetWatchState(r,e);if(!g)throw new Error("Failed to get watch state: null response");const y={};let C=0,R=0;for(const[f,_]of Object.entries(g.resources??{}))_!=null&&(y[f]=_,_===T.WatchStateSynced&&C++,_===T.WatchStateError&&R++);const d={};for(const[f,_]of Object.entries(g.resourceCounts??{}))_!=null&&(d[f]=_);return{connection:g.connectionId,resources:y,resourceCounts:d,totalResources:Object.keys(y).length,syncedCount:C,errorCount:R}},enabled:n&&!!r&&!!e,refetchInterval:g=>{const y=g.state.data;if(!y||y.totalResources===0)return 3e3;let C=0;for(const R of Object.values(y.resources))(R===T.WatchStateSynced||R===T.WatchStateError||R===T.WatchStateStopped||R===T.WatchStateFailed||R===T.WatchStateForbidden||R===T.WatchStateSkipped)&&C++;return C>=y.totalResources?!1:3e3}});u.useEffect(()=>{if(!p.data||a.current)return;a.current=!0;const g=o.current;o.current=[];for(const y of g)c(y)},[p.data,c]),u.useEffect(()=>{if(!n||!r||!e)return;a.current=!1,o.current=[];const g=D.On(`${r}/${e}/watch/STATE`,y=>{const C=y.data;a.current?c(C):o.current.push(C)});return()=>{g(),a.current=!1,o.current=[]}},[r,e,n,c]);const l=p.data;let h=0;if(l!=null&&l.resources)for(const g of Object.values(l.resources))(g===T.WatchStateSynced||g===T.WatchStateError||g===T.WatchStateStopped||g===T.WatchStateFailed||g===T.WatchStateForbidden||g===T.WatchStateSkipped)&&h++;return{summary:p,getResourceState:g=>l==null?void 0:l.resources[g],isFullySynced:l?l.totalResources>0&&h===l.totalResources:!1,syncProgress:l&&l.totalResources>0?h/l.totalResources:0,errorCount:(l==null?void 0:l.errorCount)??0}},Zn=()=>{const[t,e]=u.useState(new Map),n=u.useRef(new Map),r=u.useRef(new Map),s=u.useCallback(p=>{const l=p.data,h=Ce(l),g=Ke(n.current,l),y=me(g);if(e(C=>{const R=new Map(C);return R.set(h,y),R}),r.current.has(h)&&(clearTimeout(r.current.get(h)),r.current.delete(h)),ne(y)){const C=setTimeout(()=>{e(R=>{const d=new Map(R);return d.delete(h),d}),n.current.delete(h),r.current.delete(h)},5e3);r.current.set(h,C)}},[]);u.useEffect(()=>{const p=D.On("watch/STATE",s);return()=>{p();for(const l of r.current.values())clearTimeout(l)}},[s]);const i=Array.from(t.values()),o=Be(i),a=i.find(p=>!ne(p))??i[0]??null,c=He(i);return{syncs:i,hasSyncing:o,primarySync:a,aggregateProgress:c}},st=()=>{const t=u.useContext(Se);if(!t)throw new Error("useOperations must be used within an OperationsProvider");return t},er=({pluginID:t,connectionID:e,resourceKey:n})=>{const r=A(t),{showSnackbar:s}=$(),{addOperation:i,updateOperation:o}=st(),a=u.useRef(new Set),c=u.useCallback((h,g=!1)=>{var y,C,R;h.disposed||(h.disposed=!0,(y=h.unsubscribe)==null||y.call(h),(C=h.open)==null||C.cancel(),(R=h.attach)==null||R.cancel(),h.handle&&(S.CancelStreamAction(h.handle).catch(()=>{}),g&&o(h.handle,{status:"cancelled",message:"Cancelled",completedAt:Date.now()})),a.current.delete(h))},[o]);u.useEffect(()=>()=>{for(const h of a.current)c(h,!0)},[r,e,n,c]);const p=u.useCallback(async({actionID:h,id:g,namespace:y,label:C,params:R={}})=>{const d={disposed:!1,terminal:!1,sequence:0};a.current.add(d);try{d.open=S.StreamAction(r,e,n,h,k.ActionInput.createFrom({id:g,namespace:y,params:R}));const f=await d.open;if(d.open=void 0,d.disposed)return S.CancelStreamAction(f).catch(()=>{}),f;d.handle=f,i({id:f,label:C,resourceKey:n,resourceName:g,namespace:y,connectionID:e,status:"running",startedAt:Date.now()});const _=w=>{if(d.disposed||!Number.isSafeInteger(w.sequence)||w.sequence<=d.sequence)return;d.sequence=w.sequence;const x=w.event,b=x.data??{};if(x.type==="error"){d.terminal=!0;const I=W(x.error);o(f,{status:Y(I)?"cancelled":"error",message:I.title,completedAt:Date.now()}),G(s,I,C),c(d)}else if(x.type==="complete"){d.terminal=!0;const I=typeof b.message=="string"?b.message:`${C} completed`;o(f,{status:"completed",message:I,completedAt:Date.now()}),s(I,"success"),c(d)}else o(f,{message:typeof b.message=="string"?b.message:void 0,progress:typeof b.ready=="number"&&typeof b.desired=="number"?{ready:b.ready,desired:b.desired}:void 0})};d.unsubscribe=D.On(`action/stream/${f}`,w=>_(w.data)),d.attach=S.AttachStreamAction(f);const E=await d.attach;return d.attach=void 0,_(E),f}catch(f){if(d.terminal&&d.handle)return d.handle;throw d.disposed||(d.handle&&o(d.handle,{status:Y(f)?"cancelled":"error",message:W(f).title,completedAt:Date.now()}),G(s,f,`Failed to start "${h}"`)),c(d),f}},[r,e,n,i,o,s,c]),l=u.useCallback(h=>{for(const g of a.current)if(g.handle===h){c(g,!0);return}},[c]);return{startStreamAction:p,cancelStreamAction:l}};function ot(t,e){return`${t}/${e}/graph/CHANGED`}function ce(t,e,n,r){const s=v.useQueryClient(),i=u.useRef(n);i.current=n;const o=JSON.stringify(n);u.useEffect(()=>{if(!r||!t||!e)return;const a=D.On(ot(t,e),()=>{s.invalidateQueries({queryKey:i.current,exact:!0})});return()=>{a()}},[s,t,e,o,r])}const tr={owns:{outgoing:"Owns",incoming:"Owned by"},runs_on:{outgoing:"Runs on",incoming:"Running here"},uses:{outgoing:"Uses",incoming:"Used by"},exposes:{outgoing:"Exposes",incoming:"Exposed by"},manages:{outgoing:"Manages",incoming:"Managed by"},member_of:{outgoing:"Member of",incoming:"Members"},selects:{outgoing:"Selects",incoming:"Selected by"}};function nr(t,e){const n=tr[t];if(n)return n[e];const r=t.replace(/_/g," ");return e==="outgoing"?r:`${r} (incoming)`}function rr(t,e){return t.pluginId===e.pluginId&&t.connectionId===e.connectionId&&t.resourceKey===e.resourceKey&&t.id===e.id&&(t.namespace??"")===(e.namespace??"")}function it(t,e){return e.map(n=>{const r=rr(n.source,t);return{resource:r?n.target:n.source,type:n.type,direction:r?"outgoing":"incoming",label:n.label}})}const sr=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s="",direction:i="both",relationshipType:o,enabled:a=!0,refetchInterval:c=!1})=>{const p=A(t),l=["RESOURCE_RELATED",p,e,n,s,r,i,o??null],h=a&&!!p&&!!e&&!!n&&!!r;ce(p,e,l,h);const g=v.useQuery({queryKey:l,queryFn:async()=>S.GetRelated(p,e,n,s,r,i,o??null),enabled:h,refetchInterval:c}),y={pluginId:p,connectionId:e,resourceKey:n,id:r,namespace:s},C=g.data??[];return{related:it(y,C),edges:C,isLoading:g.isLoading,isFetching:g.isFetching,error:g.error,refetch:g.refetch}},or=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s="",maxDepth:i=3,enabled:o=!0,refetchInterval:a=!1})=>{const c=A(t),p=["RESOURCE_DEPENDENCY_TREE",c,e,n,s,r,i],l=o&&!!c&&!!e&&!!n&&!!r;ce(c,e,p,l);const h=v.useQuery({queryKey:p,queryFn:async()=>S.GetDependencyTree(c,e,n,s,r,i),enabled:l,refetchInterval:a});return{tree:h.data??null,isLoading:h.isLoading,isFetching:h.isFetching,error:h.error,refetch:h.refetch}},ir=({pluginID:t,connectionID:e,resourceKey:n,resourceID:r,namespace:s="",upDepth:i=2,downDepth:o=3,enabled:a=!0})=>{const c=A(t),p=["RESOURCE_GRAPH",c,e,n,s,r,i,o],l=a&&!!c&&!!e&&!!n&&!!r;ce(c,e,p,l);const h=v.useQuery({queryKey:p,queryFn:async()=>S.GetSubgraph(c,e,n,s,r,i,o),enabled:l});return{graph:h.data??null,isLoading:h.isLoading,isFetching:h.isFetching,error:h.error,refetch:h.refetch}},ar=()=>{const t=u.useContext(Ee);if(!t)throw new Error("useSettings must be used within a SettingsProvider");return t},cr=({to:t,withinContext:e,...n})=>{const{pluginId:r}=oe();r||console.error("Link used outside of a plugin context");const s=`/_plugin/${r}${t.startsWith("/")?"":"/"}${t}`;return u.useMemo(()=>m.jsx(V.Link,{style:{textDecoration:"none",color:"inherit"},...n,to:s}),[n,s])};function ur(){const t=V.useNavigate(),e=V.useLocation(),{pluginId:n}=oe();n||console.error("usePluginRouter used outside of a plugin context");const r=`/_plugin/${n}`,s=e.pathname.startsWith(r)?e.pathname.slice(r.length)||"/":e.pathname,i=u.useCallback((o,a)=>{const{...c}=a??{};o.startsWith("/")?t(`${r}${o}`,c):t(o,c)},[t,r]);return u.useMemo(()=>({location:e,navigate:i,pluginPath:s}),[e,i,s])}class lr{}class dr{constructor(){F(this,"_extensions");F(this,"root");F(this,"pages");F(this,"_routes")}get extensions(){return this._extensions||[]}get Routes(){var e;if(!this._routes&&this.root)return[{path:"",index:!0,Component:this.root}];if(!((e=this._routes)!=null&&e.length))throw new Error("cannot use plugin without a root page or router");return this._routes}get Window(){if(!this._routes&&this.root)return m.jsx(this.root,{});const e=V.createMemoryRouter(this._routes||[]);return m.jsx(V.RouterProvider,{router:e})}registerExtensionPoints(e){return this._extensions=e||[],this}setRootPage(e){return this.root=e,this}withPage(e,n){return this.pages||(this.pages={}),this.pages[e]?(console.warn("Cannot register page with the same name. Please use a different name."),this):(this.pages[e]=n,this)}withRoutes(e){return this._routes=e,this}}var at=(t=>(t.MISSING_MANIFEST="MISSING_MANIFEST",t.MISSING_PLUGIN="MISSING_PLUGIN",t.MISSING_ENTRYPOINT="MISSING_ENTRYPOINT",t))(at||{});const fr=t=>{const e=t.split("::");return e.length===1?{group:"core",version:"",kind:e[0]}:{group:e[0]||"core",version:e[1]||"",kind:e[2]||e[0]}},pr=t=>!t||t==="core"?"Core":t.charAt(0).toUpperCase()+t.slice(1),ct="omniview/global-search/open";function hr(t={}){window.dispatchEvent(new CustomEvent(ct,{detail:t}))}const ut="omniview/resource/icons";class gr extends u.Component{constructor(){super(...arguments);F(this,"state",{failed:!1,resetToken:this.props.resetToken})}static getDerivedStateFromProps(n,r){return n.resetToken!==r.resetToken?{failed:!1,resetToken:n.resetToken}:null}static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?this.props.fallback:this.props.children}}function yr({pluginId:t,resourceKey:e,fallback:n,...r}){const s=$e(ut),i=n===void 0?m.jsx("svg",{width:r.size??16,height:r.size??16,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",className:r.className,"aria-hidden":r["aria-hidden"]??!0,children:m.jsx("path",{d:"m12 3 9 5v8l-9 5-9-5V8l9-5Zm0 9 9-4M12 12 3 8m9 4v9"})}):n;for(const o of(s==null?void 0:s.listAll())??[])if(o.plugin===t)try{const a=o.value;if((a==null?void 0:a.schemaVersion)!==1||typeof a.resolve!="function")continue;const c=a.resolve(e);if(!c)continue;return m.jsx(gr,{resetToken:o,fallback:i,children:m.jsx(u.Suspense,{fallback:i,children:m.jsx(c,{...r,"aria-hidden":r["aria-hidden"]??!0})})},JSON.stringify([t,e,s==null?void 0:s.version,o.id]))}catch{}return m.jsx(m.Fragment,{children:i})}exports.ALL_SESSIONS_KEY=B;exports.BottomDrawerContext=Le;exports.ConfirmationModalContext=Me;exports.ErrorTypes=N;exports.ExtensionPointRegistry=bt;exports.ExtensionPointStore=Qe;exports.ExtensionProvider=wt;exports.GLOBAL_SEARCH_OPEN_EVENT=ct;exports.Link=cr;exports.OperationsContext=Se;exports.OperationsProvider=Et;exports.PluginContext=se;exports.PluginContextProvider=ht;exports.PluginErrorCode=at;exports.PluginWindow=dr;exports.PluginWindowRootProps=lr;exports.RESOURCE_ICON_EXTENSION_POINT_ID=ut;exports.ResourceIcon=yr;exports.RightDrawerContext=ke;exports.SettingsContext=Ee;exports.SettingsProvider=yt;exports.SnackbarProvider=xt;exports.WatchState=T;exports.actionToSnackbar=De;exports.applyBatch=nt;exports.connectionListQueryKey=Ge;exports.createErrorHandler=j;exports.defaultState=Fe;exports.formatGroup=pr;exports.graphChangedEvent=ot;exports.isCancelledError=Y;exports.openGlobalSearch=hr;exports.parseAppError=W;exports.parseResourceKey=fr;exports.relationshipLabel=nr;exports.resourceQueryKeys=re;exports.showAppError=G;exports.toRelatedResources=it;exports.useActiveSyncs=Zn;exports.useBottomDrawer=ve;exports.useConfirmationModal=$t;exports.useConnection=It;exports.useConnectionNamespaces=Tt;exports.useConnectionStatus=Pt;exports.useConnections=Ot;exports.useDependencyTree=or;exports.useEditorSchemas=Xn;exports.useEventBatcher=rt;exports.useExec=Ft;exports.useExecuteAction=Yn;exports.useExtensionPoint=$e;exports.useExtensionRegistry=Ue;exports.useLogs=Lt;exports.useMetricProviders=kt;exports.useMetricProvidersForResource=ze;exports.useMetricStream=jt;exports.useOperations=st;exports.usePluginContext=oe;exports.usePluginData=Dt;exports.usePluginRouter=ur;exports.usePluginSettings=gt;exports.usePortForwardSessions=qt;exports.useRefetchOnGraphChange=ce;exports.useRelatedResources=sr;exports.useResolvedPluginId=A;exports.useResource=Qt;exports.useResourceActions=Vn;exports.useResourceAreaComponent=Wt;exports.useResourceGraph=ir;exports.useResourceGroups=Gt;exports.useResourceMetrics=Mt;exports.useResourceMutations=zn;exports.useResourcePortForwarder=Ut;exports.useResourceSearch=Bt;exports.useResourceType=Ht;exports.useResourceTypes=Kt;exports.useResources=Kn;exports.useRightDrawer=Nt;exports.useSettings=ar;exports.useSnackbar=$;exports.useStreamAction=er;exports.useWatchState=Jn;
package/dist/index.d.ts CHANGED
@@ -5,3 +5,6 @@ export * from './hooks';
5
5
  export * from './router';
6
6
  export * from './types';
7
7
  export * from './utils/resourceKey';
8
+ export * from './search';
9
+ export * from './resourceQueryKeys';
10
+ export * from './resourceIcons';