From c2711d63d1bab18f4df7a90600841da5f24439fa Mon Sep 17 00:00:00 2001 From: Pilipilis Date: Tue, 26 May 2026 19:48:48 +0000 Subject: [PATCH 01/14] feat: show bridge version in dashboard --- dashboard/src/main.test.tsx | 10 ++ dashboard/src/main.tsx | 26 ++++- .../issue-50/version-link-desktop.png | Bin 0 -> 87078 bytes src/github_agent_bridge/__init__.py | 17 ++- src/github_agent_bridge/backend.py | 10 ++ .../dashboard_static/assets/index-Bh6F9yTT.js | 110 ------------------ .../dashboard_static/assets/index-CBKWFP7m.js | 110 ++++++++++++++++++ ...{index-DZ0faviD.css => index-CDukmhDa.css} | 2 +- .../dashboard_static/index.html | 4 +- tests/test_backend.py | 16 +++ 10 files changed, 190 insertions(+), 115 deletions(-) create mode 100644 docs/screenshots/issue-50/version-link-desktop.png delete mode 100644 src/github_agent_bridge/dashboard_static/assets/index-Bh6F9yTT.js create mode 100644 src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js rename src/github_agent_bridge/dashboard_static/assets/{index-DZ0faviD.css => index-CDukmhDa.css} (77%) diff --git a/dashboard/src/main.test.tsx b/dashboard/src/main.test.tsx index df98bd5..64680fe 100644 --- a/dashboard/src/main.test.tsx +++ b/dashboard/src/main.test.tsx @@ -3,6 +3,7 @@ import userEvent from "@testing-library/user-event"; import { describe, expect, it } from "vitest"; import { ActorFilter, + ProductMeta, StatusBadge, buildJobQuery, groupSessionEvents, @@ -48,6 +49,15 @@ describe("status badges", () => { }); }); +describe("product metadata", () => { + it("shows the bridge version and upstream repository link", () => { + render(); + + expect(screen.getByText("v0.18.7")).toBeInTheDocument(); + expect(screen.getByRole("link", { name: /github/i })).toHaveAttribute("href", "https://github.com/pilipilisbot/github-agent-bridge"); + }); +}); + describe("actor filter", () => { it("filters actors, selects a suggestion, and clears the selection", async () => { const user = userEvent.setup(); diff --git a/dashboard/src/main.tsx b/dashboard/src/main.tsx index afc3b45..ffcf898 100644 --- a/dashboard/src/main.tsx +++ b/dashboard/src/main.tsx @@ -27,6 +27,12 @@ type Percentiles = { p99: number | null; }; +type About = { + service: string; + version: string; + repository_url: string; +}; + type Job = { id: number; work_key: string; @@ -478,6 +484,7 @@ function App() { const selectedJobId = jobRouteId; const metrics = useQuery({ queryKey: ["metrics"], queryFn: () => api<{ metrics: MetricsSummary }>("/api/metrics/summary"), enabled: !isJobDetailRoute }); const me = useQuery({ queryKey: ["me"], queryFn: () => api<{ user: UserProfile }>("/api/me"), refetchInterval: false }); + const about = useQuery({ queryKey: ["about"], queryFn: () => api("/api/about") }); const actorOptions = useQuery({ queryKey: ["job-actors"], queryFn: () => api<{ actors: JobActor[] }>("/api/jobs/actors"), enabled: !isJobDetailRoute }); const jobs = useQuery({ queryKey: ["jobs", filters, jobLimit], queryFn: () => api<{ jobs: Job[] }>(buildJobQuery(filters, jobLimit)), enabled: !isJobDetailRoute }); const processes = useQuery({ queryKey: ["processes"], queryFn: () => api("/api/processes"), enabled: !isJobDetailRoute }); @@ -558,7 +565,7 @@ function App() {

GitHub Agent Bridge

-

Read-only operational dashboard

+
@@ -631,6 +638,22 @@ function App() { ); } +function ProductMeta({ about }: { about: About | undefined }) { + const version = about?.version ? `v${about.version}` : "version loading"; + return ( +

+ Read-only operational dashboard + {version} + {about?.repository_url ? ( + + + GitHub + + ) : null} +

+ ); +} + function JobDetailPage({ jobId, detail, onRefresh }: { jobId: number; detail: React.ReactNode; onRefresh: () => void }) { return (
@@ -1444,6 +1467,7 @@ function RefreshButton({ onClick, compactOnMobile = false }: { onClick: () => vo export { ActorFilter, + ProductMeta, StatusBadge, buildJobQuery, groupSessionEvents, diff --git a/docs/screenshots/issue-50/version-link-desktop.png b/docs/screenshots/issue-50/version-link-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba9166ae99c2d0449625ccabea825f54ac4a79c GIT binary patch literal 87078 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 literal 0 HcmV?d00001 diff --git a/src/github_agent_bridge/__init__.py b/src/github_agent_bridge/__init__.py index 4bea608..b758930 100644 --- a/src/github_agent_bridge/__init__.py +++ b/src/github_agent_bridge/__init__.py @@ -1,3 +1,18 @@ """GitHub Agent Bridge.""" -__version__ = "0.1.0" +from importlib.metadata import PackageNotFoundError, version +from pathlib import Path +import tomllib + + +def _version_from_pyproject() -> str: + pyproject = Path(__file__).resolve().parents[2] / "pyproject.toml" + if not pyproject.exists(): + return "0.0.0" + return str(tomllib.loads(pyproject.read_text(encoding="utf-8")).get("project", {}).get("version", "0.0.0")) + + +try: + __version__ = version("github-agent-bridge") +except PackageNotFoundError: + __version__ = _version_from_pyproject() diff --git a/src/github_agent_bridge/backend.py b/src/github_agent_bridge/backend.py index 102c862..7c00ecf 100644 --- a/src/github_agent_bridge/backend.py +++ b/src/github_agent_bridge/backend.py @@ -19,6 +19,7 @@ from fastapi.responses import FileResponse, JSONResponse, RedirectResponse, StreamingResponse from fastapi.staticfiles import StaticFiles +from . import __version__ from .cli import DEFAULT_DB from .dashboard_data import ( get_job_detail, @@ -43,6 +44,7 @@ GITHUB_AUTHORIZE_URL = "https://github.com/login/oauth/authorize" GITHUB_TOKEN_URL = "https://github.com/login/oauth/access_token" GITHUB_USER_URL = "https://api.github.com/user" +PROJECT_REPOSITORY_URL = "https://github.com/pilipilisbot/github-agent-bridge" SESSION_VERSION = 1 @@ -284,6 +286,14 @@ def dashboard_job(job_path: str, _: str = Depends(current_user)) -> FileResponse def api_status(_: str = Depends(current_user)) -> dict[str, Any]: return {"service": "github-agent-bridge-dashboard", "read_only": True, "metrics": inspect_db_read_only(config.db)} + @app.get("/api/about") + def api_about(_: str = Depends(current_user)) -> dict[str, Any]: + return { + "service": "github-agent-bridge-dashboard", + "version": __version__, + "repository_url": PROJECT_REPOSITORY_URL, + } + @app.get("/api/me") def api_me(profile: dict[str, Any] = Depends(current_profile)) -> dict[str, Any]: return {"user": profile} diff --git a/src/github_agent_bridge/dashboard_static/assets/index-Bh6F9yTT.js b/src/github_agent_bridge/dashboard_static/assets/index-Bh6F9yTT.js deleted file mode 100644 index 5517f23..0000000 --- a/src/github_agent_bridge/dashboard_static/assets/index-Bh6F9yTT.js +++ /dev/null @@ -1,110 +0,0 @@ -var ys=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||ys("Cannot "+s);var a=(e,t,s)=>(Lt(e,t,"read from private field"),s?s.call(e):t.get(e)),w=(e,t,s)=>t.has(e)?ys("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),f=(e,t,s,r)=>(Lt(e,t,"write to private field"),r?r.call(e,s):t.set(e,s),s),S=(e,t,s)=>(Lt(e,t,"access private method"),s);var St=(e,t,s,r)=>({set _(i){f(e,t,i,s)},get _(){return a(e,t,r)}});import{e as Mr,f as Or,g as Er,r as Q,R as J,c as rs,b as Fr,C as ns,X as is,Y as as,T as os,L as Tr,a as Ys,B as er,d as Ar}from"./charts-DRWoArYU.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&r(c)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();var Dt={exports:{}},dt={};/** - * @license React - * react-jsx-runtime.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var vs;function Ir(){if(vs)return dt;vs=1;var e=Mr(),t=Symbol.for("react.element"),s=Symbol.for("react.fragment"),r=Object.prototype.hasOwnProperty,i=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(l,d,u){var h,y={},j=null,b=null;u!==void 0&&(j=""+u),d.key!==void 0&&(j=""+d.key),d.ref!==void 0&&(b=d.ref);for(h in d)r.call(d,h)&&!o.hasOwnProperty(h)&&(y[h]=d[h]);if(l&&l.defaultProps)for(h in d=l.defaultProps,d)y[h]===void 0&&(y[h]=d[h]);return{$$typeof:t,type:l,key:j,ref:b,props:y,_owner:i.current}}return dt.Fragment=s,dt.jsx=c,dt.jsxs=c,dt}var ws;function Lr(){return ws||(ws=1,Dt.exports=Ir()),Dt.exports}var n=Lr(),Rt={},js;function Dr(){if(js)return Rt;js=1;var e=Or();return Rt.createRoot=e.createRoot,Rt.hydrateRoot=e.hydrateRoot,Rt}var qr=Dr();const Qr=Er(qr);var kt=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Te,we,Je,zs,$r=(zs=class extends kt{constructor(){super();w(this,Te);w(this,we);w(this,Je);f(this,Je,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){a(this,we)||this.setEventListener(a(this,Je))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,we))==null||t.call(this),f(this,we,void 0))}setEventListener(t){var s;f(this,Je,t),(s=a(this,we))==null||s.call(this),f(this,we,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){a(this,Te)!==t&&(f(this,Te,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(s=>{s(t)})}isFocused(){var t;return typeof a(this,Te)=="boolean"?a(this,Te):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Te=new WeakMap,we=new WeakMap,Je=new WeakMap,zs),ls=new $r,Ur={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},je,ss,Ks,zr=(Ks=class{constructor(){w(this,je,Ur);w(this,ss,!1)}setTimeoutProvider(e){f(this,je,e)}setTimeout(e,t){return a(this,je).setTimeout(e,t)}clearTimeout(e){a(this,je).clearTimeout(e)}setInterval(e,t){return a(this,je).setInterval(e,t)}clearInterval(e){a(this,je).clearInterval(e)}},je=new WeakMap,ss=new WeakMap,Ks),Fe=new zr;function Kr(e){setTimeout(e,0)}var Gr=typeof window>"u"||"Deno"in globalThis;function H(){}function Br(e,t){return typeof e=="function"?e(t):e}function $t(e){return typeof e=="number"&&e>=0&&e!==1/0}function tr(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Pe(e,t){return typeof e=="function"?e(t):e}function X(e,t){return typeof e=="function"?e(t):e}function Ns(e,t){const{type:s="all",exact:r,fetchStatus:i,predicate:o,queryKey:c,stale:l}=e;if(c){if(r){if(t.queryHash!==cs(c,t.options))return!1}else if(!xt(t.queryKey,c))return!1}if(s!=="all"){const d=t.isActive();if(s==="active"&&!d||s==="inactive"&&d)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||i&&i!==t.state.fetchStatus||o&&!o(t))}function ks(e,t){const{exact:s,status:r,predicate:i,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(s){if(pt(t.options.mutationKey)!==pt(o))return!1}else if(!xt(t.options.mutationKey,o))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function cs(e,t){return((t==null?void 0:t.queryKeyHashFn)||pt)(e)}function pt(e){return JSON.stringify(e,(t,s)=>zt(s)?Object.keys(s).sort().reduce((r,i)=>(r[i]=s[i],r),{}):s)}function xt(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(s=>xt(e[s],t[s])):!1}var Hr=Object.prototype.hasOwnProperty;function sr(e,t,s=0){if(e===t)return e;if(s>500)return t;const r=Cs(e)&&Cs(t);if(!r&&!(zt(e)&&zt(t)))return t;const o=(r?e:Object.keys(e)).length,c=r?t:Object.keys(t),l=c.length,d=r?new Array(l):{};let u=0;for(let h=0;h{Fe.setTimeout(t,e)})}function Kt(e,t,s){return typeof s.structuralSharing=="function"?s.structuralSharing(e,t):s.structuralSharing!==!1?sr(e,t):t}function Wr(e,t,s=0){const r=[...e,t];return s&&r.length>s?r.slice(1):r}function Vr(e,t,s=0){const r=[t,...e];return s&&r.length>s?r.slice(0,-1):r}var ds=Symbol();function rr(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===ds?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function nr(e,t){return typeof e=="function"?e(...t):!!e}function Xr(e,t,s){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??(i=t()),r||(r=!0,i.aborted?s():i.addEventListener("abort",s,{once:!0})),i)}),e}var gt=(()=>{let e=()=>Gr;return{isServer(){return e()},setIsServer(t){e=t}}})();function Gt(){let e,t;const s=new Promise((i,o)=>{e=i,t=o});s.status="pending",s.catch(()=>{});function r(i){Object.assign(s,i),delete s.resolve,delete s.reject}return s.resolve=i=>{r({status:"fulfilled",value:i}),e(i)},s.reject=i=>{r({status:"rejected",reason:i}),t(i)},s}var Zr=Kr;function Yr(){let e=[],t=0,s=l=>{l()},r=l=>{l()},i=Zr;const o=l=>{t?e.push(l):i(()=>{s(l)})},c=()=>{const l=e;e=[],l.length&&i(()=>{r(()=>{l.forEach(d=>{s(d)})})})};return{batch:l=>{let d;t++;try{d=l()}finally{t--,t||c()}return d},batchCalls:l=>(...d)=>{o(()=>{l(...d)})},schedule:o,setNotifyFunction:l=>{s=l},setBatchNotifyFunction:l=>{r=l},setScheduler:l=>{i=l}}}var q=Yr(),We,Ne,Ve,Gs,en=(Gs=class extends kt{constructor(){super();w(this,We,!0);w(this,Ne);w(this,Ve);f(this,Ve,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",r)}}})}onSubscribe(){a(this,Ne)||this.setEventListener(a(this,Ve))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,Ne))==null||t.call(this),f(this,Ne,void 0))}setEventListener(t){var s;f(this,Ve,t),(s=a(this,Ne))==null||s.call(this),f(this,Ne,t(this.setOnline.bind(this)))}setOnline(t){a(this,We)!==t&&(f(this,We,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return a(this,We)}},We=new WeakMap,Ne=new WeakMap,Ve=new WeakMap,Gs),Ot=new en;function tn(e){return Math.min(1e3*2**e,3e4)}function ir(e){return(e??"online")==="online"?Ot.isOnline():!0}var Bt=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function ar(e){let t=!1,s=0,r;const i=Gt(),o=()=>i.status!=="pending",c=p=>{var g;if(!o()){const m=new Bt(p);j(m),(g=e.onCancel)==null||g.call(e,m)}},l=()=>{t=!0},d=()=>{t=!1},u=()=>ls.isFocused()&&(e.networkMode==="always"||Ot.isOnline())&&e.canRun(),h=()=>ir(e.networkMode)&&e.canRun(),y=p=>{o()||(r==null||r(),i.resolve(p))},j=p=>{o()||(r==null||r(),i.reject(p))},b=()=>new Promise(p=>{var g;r=m=>{(o()||u())&&p(m)},(g=e.onPause)==null||g.call(e)}).then(()=>{var p;r=void 0,o()||(p=e.onContinue)==null||p.call(e)}),x=()=>{if(o())return;let p;const g=s===0?e.initialPromise:void 0;try{p=g??e.fn()}catch(m){p=Promise.reject(m)}Promise.resolve(p).then(y).catch(m=>{var A;if(o())return;const k=e.retry??(gt.isServer()?0:3),_=e.retryDelay??tn,v=typeof _=="function"?_(s,m):_,O=k===!0||typeof k=="number"&&su()?void 0:b()).then(()=>{t?j(m):x()})})};return{promise:i,status:()=>i.status,cancel:c,continue:()=>(r==null||r(),i),cancelRetry:l,continueRetry:d,canStart:h,start:()=>(h()?x():b().then(x),i)}}var Ae,Bs,or=(Bs=class{constructor(){w(this,Ae)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),$t(this.gcTime)&&f(this,Ae,Fe.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(gt.isServer()?1/0:300*1e3))}clearGcTimeout(){a(this,Ae)!==void 0&&(Fe.clearTimeout(a(this,Ae)),f(this,Ae,void 0))}},Ae=new WeakMap,Bs);function sn(e){return{onFetch:(t,s)=>{var h,y,j,b,x;const r=t.options,i=(j=(y=(h=t.fetchOptions)==null?void 0:h.meta)==null?void 0:y.fetchMore)==null?void 0:j.direction,o=((b=t.state.data)==null?void 0:b.pages)||[],c=((x=t.state.data)==null?void 0:x.pageParams)||[];let l={pages:[],pageParams:[]},d=0;const u=async()=>{let p=!1;const g=_=>{Xr(_,()=>t.signal,()=>p=!0)},m=rr(t.options,t.fetchOptions),k=async(_,v,O)=>{if(p)return Promise.reject(t.signal.reason);if(v==null&&_.pages.length)return Promise.resolve(_);const W=(()=>{const G={client:t.client,queryKey:t.queryKey,pageParam:v,direction:O?"backward":"forward",meta:t.options.meta};return g(G),G})(),C=await m(W),{maxPages:F}=t.options,T=O?Vr:Wr;return{pages:T(_.pages,C,F),pageParams:T(_.pageParams,v,F)}};if(i&&o.length){const _=i==="backward",v=_?rn:Rs,O={pages:o,pageParams:c},A=v(r,O);l=await k(O,A,_)}else{const _=e??o.length;do{const v=d===0?c[0]??r.initialPageParam:Rs(r,l);if(d>0&&v==null)break;l=await k(l,v),d++}while(d<_)}return l};t.options.persister?t.fetchFn=()=>{var p,g;return(g=(p=t.options).persister)==null?void 0:g.call(p,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},s)}:t.fetchFn=u}}}function Rs(e,{pages:t,pageParams:s}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,s[r],s):void 0}function rn(e,{pages:t,pageParams:s}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,s[0],s):void 0}var Xe,Ie,Ze,te,Le,L,yt,De,V,lr,he,Hs,nn=(Hs=class extends or{constructor(t){super();w(this,V);w(this,Xe);w(this,Ie);w(this,Ze);w(this,te);w(this,Le);w(this,L);w(this,yt);w(this,De);f(this,De,!1),f(this,yt,t.defaultOptions),this.setOptions(t.options),this.observers=[],f(this,Le,t.client),f(this,te,a(this,Le).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,f(this,Ie,Ps(this.options)),this.state=t.state??a(this,Ie),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return a(this,Xe)}get promise(){var t;return(t=a(this,L))==null?void 0:t.promise}setOptions(t){if(this.options={...a(this,yt),...t},t!=null&&t._type&&f(this,Xe,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=Ps(this.options);s.data!==void 0&&(this.setState(_s(s.data,s.dataUpdatedAt)),f(this,Ie,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&a(this,te).remove(this)}setData(t,s){const r=Kt(this.state.data,t,this.options);return S(this,V,he).call(this,{data:r,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),r}setState(t){S(this,V,he).call(this,{type:"setState",state:t})}cancel(t){var r,i;const s=(r=a(this,L))==null?void 0:r.promise;return(i=a(this,L))==null||i.cancel(t),s?s.then(H).catch(H):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return a(this,Ie)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>X(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ds||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Pe(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!tr(this.state.dataUpdatedAt,t)}onFocus(){var s;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,L))==null||s.continue()}onOnline(){var s;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,L))==null||s.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),a(this,te).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(s=>s!==t),this.observers.length||(a(this,L)&&(a(this,De)||S(this,V,lr).call(this)?a(this,L).cancel({revert:!0}):a(this,L).cancelRetry()),this.scheduleGc()),a(this,te).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||S(this,V,he).call(this,{type:"invalidate"})}async fetch(t,s){var u,h,y,j,b,x,p,g,m,k,_;if(this.state.fetchStatus!=="idle"&&((u=a(this,L))==null?void 0:u.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(a(this,L))return a(this,L).continueRetry(),a(this,L).promise}if(t&&this.setOptions(t),!this.options.queryFn){const v=this.observers.find(O=>O.options.queryFn);v&&this.setOptions(v.options)}const r=new AbortController,i=v=>{Object.defineProperty(v,"signal",{enumerable:!0,get:()=>(f(this,De,!0),r.signal)})},o=()=>{const v=rr(this.options,s),A=(()=>{const W={client:a(this,Le),queryKey:this.queryKey,meta:this.meta};return i(W),W})();return f(this,De,!1),this.options.persister?this.options.persister(v,A,this):v(A)},l=(()=>{const v={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:a(this,Le),state:this.state,fetchFn:o};return i(v),v})(),d=a(this,Xe)==="infinite"?sn(this.options.pages):this.options.behavior;d==null||d.onFetch(l,this),f(this,Ze,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((h=l.fetchOptions)==null?void 0:h.meta))&&S(this,V,he).call(this,{type:"fetch",meta:(y=l.fetchOptions)==null?void 0:y.meta}),f(this,L,ar({initialPromise:s==null?void 0:s.initialPromise,fn:l.fetchFn,onCancel:v=>{v instanceof Bt&&v.revert&&this.setState({...a(this,Ze),fetchStatus:"idle"}),r.abort()},onFail:(v,O)=>{S(this,V,he).call(this,{type:"failed",failureCount:v,error:O})},onPause:()=>{S(this,V,he).call(this,{type:"pause"})},onContinue:()=>{S(this,V,he).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0}));try{const v=await a(this,L).start();if(v===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(v),(b=(j=a(this,te).config).onSuccess)==null||b.call(j,v,this),(p=(x=a(this,te).config).onSettled)==null||p.call(x,v,this.state.error,this),v}catch(v){if(v instanceof Bt){if(v.silent)return a(this,L).promise;if(v.revert){if(this.state.data===void 0)throw v;return this.state.data}}throw S(this,V,he).call(this,{type:"error",error:v}),(m=(g=a(this,te).config).onError)==null||m.call(g,v,this),(_=(k=a(this,te).config).onSettled)==null||_.call(k,this.state.data,v,this),v}finally{this.scheduleGc()}}},Xe=new WeakMap,Ie=new WeakMap,Ze=new WeakMap,te=new WeakMap,Le=new WeakMap,L=new WeakMap,yt=new WeakMap,De=new WeakMap,V=new WeakSet,lr=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},he=function(t){const s=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...cr(r.data,this.options),fetchMeta:t.meta??null};case"success":const i={...r,..._s(t.data,t.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return f(this,Ze,t.manual?i:void 0),i;case"error":const o=t.error;return{...r,error:o,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=s(this.state),q.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),a(this,te).notify({query:this,type:"updated",action:t})})},Hs);function cr(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:ir(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function _s(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Ps(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,s=t!==void 0,r=s?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:s?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var B,R,vt,K,qe,Ye,fe,ke,wt,et,tt,Qe,$e,Ce,st,M,ft,Ht,Jt,Wt,Vt,Xt,Zt,Yt,dr,Js,an=(Js=class extends kt{constructor(t,s){super();w(this,M);w(this,B);w(this,R);w(this,vt);w(this,K);w(this,qe);w(this,Ye);w(this,fe);w(this,ke);w(this,wt);w(this,et);w(this,tt);w(this,Qe);w(this,$e);w(this,Ce);w(this,st,new Set);this.options=s,f(this,B,t),f(this,ke,null),f(this,fe,Gt()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(a(this,R).addObserver(this),Ms(a(this,R),this.options)?S(this,M,ft).call(this):this.updateResult(),S(this,M,Vt).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return es(a(this,R),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return es(a(this,R),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,S(this,M,Xt).call(this),S(this,M,Zt).call(this),a(this,R).removeObserver(this)}setOptions(t){const s=this.options,r=a(this,R);if(this.options=a(this,B).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof X(this.options.enabled,a(this,R))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");S(this,M,Yt).call(this),a(this,R).setOptions(this.options),s._defaulted&&!Ut(this.options,s)&&a(this,B).getQueryCache().notify({type:"observerOptionsUpdated",query:a(this,R),observer:this});const i=this.hasListeners();i&&Os(a(this,R),r,this.options,s)&&S(this,M,ft).call(this),this.updateResult(),i&&(a(this,R)!==r||X(this.options.enabled,a(this,R))!==X(s.enabled,a(this,R))||Pe(this.options.staleTime,a(this,R))!==Pe(s.staleTime,a(this,R)))&&S(this,M,Ht).call(this);const o=S(this,M,Jt).call(this);i&&(a(this,R)!==r||X(this.options.enabled,a(this,R))!==X(s.enabled,a(this,R))||o!==a(this,Ce))&&S(this,M,Wt).call(this,o)}getOptimisticResult(t){const s=a(this,B).getQueryCache().build(a(this,B),t),r=this.createResult(s,t);return ln(this,r)&&(f(this,K,r),f(this,Ye,this.options),f(this,qe,a(this,R).state)),r}getCurrentResult(){return a(this,K)}trackResult(t,s){return new Proxy(t,{get:(r,i)=>(this.trackProp(i),s==null||s(i),i==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&a(this,fe).status==="pending"&&a(this,fe).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(r,i))})}trackProp(t){a(this,st).add(t)}getCurrentQuery(){return a(this,R)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=a(this,B).defaultQueryOptions(t),r=a(this,B).getQueryCache().build(a(this,B),s);return r.fetch().then(()=>this.createResult(r,s))}fetch(t){return S(this,M,ft).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),a(this,K)))}createResult(t,s){var F;const r=a(this,R),i=this.options,o=a(this,K),c=a(this,qe),l=a(this,Ye),u=t!==r?t.state:a(this,vt),{state:h}=t;let y={...h},j=!1,b;if(s._optimisticResults){const T=this.hasListeners(),G=!T&&Ms(t,s),P=T&&Os(t,r,s,i);(G||P)&&(y={...y,...cr(h.data,t.options)}),s._optimisticResults==="isRestoring"&&(y.fetchStatus="idle")}let{error:x,errorUpdatedAt:p,status:g}=y;b=y.data;let m=!1;if(s.placeholderData!==void 0&&b===void 0&&g==="pending"){let T;o!=null&&o.isPlaceholderData&&s.placeholderData===(l==null?void 0:l.placeholderData)?(T=o.data,m=!0):T=typeof s.placeholderData=="function"?s.placeholderData((F=a(this,tt))==null?void 0:F.state.data,a(this,tt)):s.placeholderData,T!==void 0&&(g="success",b=Kt(o==null?void 0:o.data,T,s),j=!0)}if(s.select&&b!==void 0&&!m)if(o&&b===(c==null?void 0:c.data)&&s.select===a(this,wt))b=a(this,et);else try{f(this,wt,s.select),b=s.select(b),b=Kt(o==null?void 0:o.data,b,s),f(this,et,b),f(this,ke,null)}catch(T){f(this,ke,T)}a(this,ke)&&(x=a(this,ke),b=a(this,et),p=Date.now(),g="error");const k=y.fetchStatus==="fetching",_=g==="pending",v=g==="error",O=_&&k,A=b!==void 0,C={status:g,fetchStatus:y.fetchStatus,isPending:_,isSuccess:g==="success",isError:v,isInitialLoading:O,isLoading:O,data:b,dataUpdatedAt:y.dataUpdatedAt,error:x,errorUpdatedAt:p,failureCount:y.fetchFailureCount,failureReason:y.fetchFailureReason,errorUpdateCount:y.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:y.dataUpdateCount>u.dataUpdateCount||y.errorUpdateCount>u.errorUpdateCount,isFetching:k,isRefetching:k&&!_,isLoadingError:v&&!A,isPaused:y.fetchStatus==="paused",isPlaceholderData:j,isRefetchError:v&&A,isStale:us(t,s),refetch:this.refetch,promise:a(this,fe),isEnabled:X(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const T=C.data!==void 0,G=C.status==="error"&&!T,P=ie=>{G?ie.reject(C.error):T&&ie.resolve(C.data)},xe=()=>{const ie=f(this,fe,C.promise=Gt());P(ie)},Z=a(this,fe);switch(Z.status){case"pending":t.queryHash===r.queryHash&&P(Z);break;case"fulfilled":(G||C.data!==Z.value)&&xe();break;case"rejected":(!G||C.error!==Z.reason)&&xe();break}}return C}updateResult(){const t=a(this,K),s=this.createResult(a(this,R),this.options);if(f(this,qe,a(this,R).state),f(this,Ye,this.options),a(this,qe).data!==void 0&&f(this,tt,a(this,R)),Ut(s,t))return;f(this,K,s);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:i}=this.options,o=typeof i=="function"?i():i;if(o==="all"||!o&&!a(this,st).size)return!0;const c=new Set(o??a(this,st));return this.options.throwOnError&&c.add("error"),Object.keys(a(this,K)).some(l=>{const d=l;return a(this,K)[d]!==t[d]&&c.has(d)})};S(this,M,dr).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&S(this,M,Vt).call(this)}},B=new WeakMap,R=new WeakMap,vt=new WeakMap,K=new WeakMap,qe=new WeakMap,Ye=new WeakMap,fe=new WeakMap,ke=new WeakMap,wt=new WeakMap,et=new WeakMap,tt=new WeakMap,Qe=new WeakMap,$e=new WeakMap,Ce=new WeakMap,st=new WeakMap,M=new WeakSet,ft=function(t){S(this,M,Yt).call(this);let s=a(this,R).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(H)),s},Ht=function(){S(this,M,Xt).call(this);const t=Pe(this.options.staleTime,a(this,R));if(gt.isServer()||a(this,K).isStale||!$t(t))return;const r=tr(a(this,K).dataUpdatedAt,t)+1;f(this,Qe,Fe.setTimeout(()=>{a(this,K).isStale||this.updateResult()},r))},Jt=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(a(this,R)):this.options.refetchInterval)??!1},Wt=function(t){S(this,M,Zt).call(this),f(this,Ce,t),!(gt.isServer()||X(this.options.enabled,a(this,R))===!1||!$t(a(this,Ce))||a(this,Ce)===0)&&f(this,$e,Fe.setInterval(()=>{(this.options.refetchIntervalInBackground||ls.isFocused())&&S(this,M,ft).call(this)},a(this,Ce)))},Vt=function(){S(this,M,Ht).call(this),S(this,M,Wt).call(this,S(this,M,Jt).call(this))},Xt=function(){a(this,Qe)!==void 0&&(Fe.clearTimeout(a(this,Qe)),f(this,Qe,void 0))},Zt=function(){a(this,$e)!==void 0&&(Fe.clearInterval(a(this,$e)),f(this,$e,void 0))},Yt=function(){const t=a(this,B).getQueryCache().build(a(this,B),this.options);if(t===a(this,R))return;const s=a(this,R);f(this,R,t),f(this,vt,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},dr=function(t){q.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(a(this,K))}),a(this,B).getQueryCache().notify({query:a(this,R),type:"observerResultsUpdated"})})},Js);function on(e,t){return X(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&X(t.retryOnMount,e)===!1)}function Ms(e,t){return on(e,t)||e.state.data!==void 0&&es(e,t,t.refetchOnMount)}function es(e,t,s){if(X(t.enabled,e)!==!1&&Pe(t.staleTime,e)!=="static"){const r=typeof s=="function"?s(e):s;return r==="always"||r!==!1&&us(e,t)}return!1}function Os(e,t,s,r){return(e!==t||X(r.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&us(e,s)}function us(e,t){return X(t.enabled,e)!==!1&&e.isStaleByTime(Pe(t.staleTime,e))}function ln(e,t){return!Ut(e.getCurrentResult(),t)}var jt,le,$,Ue,ce,ve,Ws,cn=(Ws=class extends or{constructor(t){super();w(this,ce);w(this,jt);w(this,le);w(this,$);w(this,Ue);f(this,jt,t.client),this.mutationId=t.mutationId,f(this,$,t.mutationCache),f(this,le,[]),this.state=t.state||dn(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){a(this,le).includes(t)||(a(this,le).push(t),this.clearGcTimeout(),a(this,$).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){f(this,le,a(this,le).filter(s=>s!==t)),this.scheduleGc(),a(this,$).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){a(this,le).length||(this.state.status==="pending"?this.scheduleGc():a(this,$).remove(this))}continue(){var t;return((t=a(this,Ue))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,l,d,u,h,y,j,b,x,p,g,m,k,_,v,O,A,W;const s=()=>{S(this,ce,ve).call(this,{type:"continue"})},r={client:a(this,jt),meta:this.options.meta,mutationKey:this.options.mutationKey};f(this,Ue,ar({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(new Error("No mutationFn found")),onFail:(C,F)=>{S(this,ce,ve).call(this,{type:"failed",failureCount:C,error:F})},onPause:()=>{S(this,ce,ve).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>a(this,$).canRun(this)}));const i=this.state.status==="pending",o=!a(this,Ue).canStart();try{if(i)s();else{S(this,ce,ve).call(this,{type:"pending",variables:t,isPaused:o}),a(this,$).config.onMutate&&await a(this,$).config.onMutate(t,this,r);const F=await((l=(c=this.options).onMutate)==null?void 0:l.call(c,t,r));F!==this.state.context&&S(this,ce,ve).call(this,{type:"pending",context:F,variables:t,isPaused:o})}const C=await a(this,Ue).start();return await((u=(d=a(this,$).config).onSuccess)==null?void 0:u.call(d,C,t,this.state.context,this,r)),await((y=(h=this.options).onSuccess)==null?void 0:y.call(h,C,t,this.state.context,r)),await((b=(j=a(this,$).config).onSettled)==null?void 0:b.call(j,C,null,this.state.variables,this.state.context,this,r)),await((p=(x=this.options).onSettled)==null?void 0:p.call(x,C,null,t,this.state.context,r)),S(this,ce,ve).call(this,{type:"success",data:C}),C}catch(C){try{await((m=(g=a(this,$).config).onError)==null?void 0:m.call(g,C,t,this.state.context,this,r))}catch(F){Promise.reject(F)}try{await((_=(k=this.options).onError)==null?void 0:_.call(k,C,t,this.state.context,r))}catch(F){Promise.reject(F)}try{await((O=(v=a(this,$).config).onSettled)==null?void 0:O.call(v,void 0,C,this.state.variables,this.state.context,this,r))}catch(F){Promise.reject(F)}try{await((W=(A=this.options).onSettled)==null?void 0:W.call(A,void 0,C,t,this.state.context,r))}catch(F){Promise.reject(F)}throw S(this,ce,ve).call(this,{type:"error",error:C}),C}finally{a(this,$).runNext(this)}}},jt=new WeakMap,le=new WeakMap,$=new WeakMap,Ue=new WeakMap,ce=new WeakSet,ve=function(t){const s=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=s(this.state),q.batch(()=>{a(this,le).forEach(r=>{r.onMutationUpdate(t)}),a(this,$).notify({mutation:this,type:"updated",action:t})})},Ws);function dn(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var me,se,Nt,Vs,un=(Vs=class extends kt{constructor(t={}){super();w(this,me);w(this,se);w(this,Nt);this.config=t,f(this,me,new Set),f(this,se,new Map),f(this,Nt,0)}build(t,s,r){const i=new cn({client:t,mutationCache:this,mutationId:++St(this,Nt)._,options:t.defaultMutationOptions(s),state:r});return this.add(i),i}add(t){a(this,me).add(t);const s=_t(t);if(typeof s=="string"){const r=a(this,se).get(s);r?r.push(t):a(this,se).set(s,[t])}this.notify({type:"added",mutation:t})}remove(t){if(a(this,me).delete(t)){const s=_t(t);if(typeof s=="string"){const r=a(this,se).get(s);if(r)if(r.length>1){const i=r.indexOf(t);i!==-1&&r.splice(i,1)}else r[0]===t&&a(this,se).delete(s)}}this.notify({type:"removed",mutation:t})}canRun(t){const s=_t(t);if(typeof s=="string"){const r=a(this,se).get(s),i=r==null?void 0:r.find(o=>o.state.status==="pending");return!i||i===t}else return!0}runNext(t){var r;const s=_t(t);if(typeof s=="string"){const i=(r=a(this,se).get(s))==null?void 0:r.find(o=>o!==t&&o.state.isPaused);return(i==null?void 0:i.continue())??Promise.resolve()}else return Promise.resolve()}clear(){q.batch(()=>{a(this,me).forEach(t=>{this.notify({type:"removed",mutation:t})}),a(this,me).clear(),a(this,se).clear()})}getAll(){return Array.from(a(this,me))}find(t){const s={exact:!0,...t};return this.getAll().find(r=>ks(s,r))}findAll(t={}){return this.getAll().filter(s=>ks(t,s))}notify(t){q.batch(()=>{this.listeners.forEach(s=>{s(t)})})}resumePausedMutations(){const t=this.getAll().filter(s=>s.state.isPaused);return q.batch(()=>Promise.all(t.map(s=>s.continue().catch(H))))}},me=new WeakMap,se=new WeakMap,Nt=new WeakMap,Vs);function _t(e){var t;return(t=e.options.scope)==null?void 0:t.id}var de,Xs,hn=(Xs=class extends kt{constructor(t={}){super();w(this,de);this.config=t,f(this,de,new Map)}build(t,s,r){const i=s.queryKey,o=s.queryHash??cs(i,s);let c=this.get(o);return c||(c=new nn({client:t,queryKey:i,queryHash:o,options:t.defaultQueryOptions(s),state:r,defaultOptions:t.getQueryDefaults(i)}),this.add(c)),c}add(t){a(this,de).has(t.queryHash)||(a(this,de).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const s=a(this,de).get(t.queryHash);s&&(t.destroy(),s===t&&a(this,de).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){q.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return a(this,de).get(t)}getAll(){return[...a(this,de).values()]}find(t){const s={exact:!0,...t};return this.getAll().find(r=>Ns(s,r))}findAll(t={}){const s=this.getAll();return Object.keys(t).length>0?s.filter(r=>Ns(t,r)):s}notify(t){q.batch(()=>{this.listeners.forEach(s=>{s(t)})})}onFocus(){q.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){q.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},de=new WeakMap,Xs),I,Se,Re,rt,nt,_e,it,at,Zs,fn=(Zs=class{constructor(e={}){w(this,I);w(this,Se);w(this,Re);w(this,rt);w(this,nt);w(this,_e);w(this,it);w(this,at);f(this,I,e.queryCache||new hn),f(this,Se,e.mutationCache||new un),f(this,Re,e.defaultOptions||{}),f(this,rt,new Map),f(this,nt,new Map),f(this,_e,0)}mount(){St(this,_e)._++,a(this,_e)===1&&(f(this,it,ls.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,I).onFocus())})),f(this,at,Ot.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,I).onOnline())})))}unmount(){var e,t;St(this,_e)._--,a(this,_e)===0&&((e=a(this,it))==null||e.call(this),f(this,it,void 0),(t=a(this,at))==null||t.call(this),f(this,at,void 0))}isFetching(e){return a(this,I).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return a(this,Se).findAll({...e,status:"pending"}).length}getQueryData(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,I).get(t.queryHash))==null?void 0:s.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),s=a(this,I).build(this,t),r=s.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime(Pe(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return a(this,I).findAll(e).map(({queryKey:t,state:s})=>{const r=s.data;return[t,r]})}setQueryData(e,t,s){const r=this.defaultQueryOptions({queryKey:e}),i=a(this,I).get(r.queryHash),o=i==null?void 0:i.state.data,c=Br(t,o);if(c!==void 0)return a(this,I).build(this,r).setData(c,{...s,manual:!0})}setQueriesData(e,t,s){return q.batch(()=>a(this,I).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,s)]))}getQueryState(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,I).get(t.queryHash))==null?void 0:s.state}removeQueries(e){const t=a(this,I);q.batch(()=>{t.findAll(e).forEach(s=>{t.remove(s)})})}resetQueries(e,t){const s=a(this,I);return q.batch(()=>(s.findAll(e).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const s={revert:!0,...t},r=q.batch(()=>a(this,I).findAll(e).map(i=>i.cancel(s)));return Promise.all(r).then(H).catch(H)}invalidateQueries(e,t={}){return q.batch(()=>(a(this,I).findAll(e).forEach(s=>{s.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const s={...t,cancelRefetch:t.cancelRefetch??!0},r=q.batch(()=>a(this,I).findAll(e).filter(i=>!i.isDisabled()&&!i.isStatic()).map(i=>{let o=i.fetch(void 0,s);return s.throwOnError||(o=o.catch(H)),i.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(r).then(H)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const s=a(this,I).build(this,t);return s.isStaleByTime(Pe(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(H).catch(H)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(H).catch(H)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Ot.isOnline()?a(this,Se).resumePausedMutations():Promise.resolve()}getQueryCache(){return a(this,I)}getMutationCache(){return a(this,Se)}getDefaultOptions(){return a(this,Re)}setDefaultOptions(e){f(this,Re,e)}setQueryDefaults(e,t){a(this,rt).set(pt(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...a(this,rt).values()],s={};return t.forEach(r=>{xt(e,r.queryKey)&&Object.assign(s,r.defaultOptions)}),s}setMutationDefaults(e,t){a(this,nt).set(pt(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...a(this,nt).values()],s={};return t.forEach(r=>{xt(e,r.mutationKey)&&Object.assign(s,r.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;const t={...a(this,Re).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=cs(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===ds&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...a(this,Re).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){a(this,I).clear(),a(this,Se).clear()}},I=new WeakMap,Se=new WeakMap,Re=new WeakMap,rt=new WeakMap,nt=new WeakMap,_e=new WeakMap,it=new WeakMap,at=new WeakMap,Zs),ur=Q.createContext(void 0),hr=e=>{const t=Q.useContext(ur);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},mn=({client:e,children:t})=>(Q.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),n.jsx(ur.Provider,{value:e,children:t})),fr=Q.createContext(!1),pn=()=>Q.useContext(fr);fr.Provider;function xn(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var gn=Q.createContext(xn()),bn=()=>Q.useContext(gn),yn=(e,t,s)=>{const r=s!=null&&s.state.error&&typeof e.throwOnError=="function"?nr(e.throwOnError,[s.state.error,s]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},vn=e=>{Q.useEffect(()=>{e.clearReset()},[e])},wn=({result:e,errorResetBoundary:t,throwOnError:s,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||nr(s,[e.error,r])),jn=e=>{if(e.suspense){const s=i=>i==="static"?i:Math.max(i??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...i)=>s(r(...i)):s(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Nn=(e,t)=>e.isLoading&&e.isFetching&&!t,kn=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Es=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function Cn(e,t,s){var j,b,x,p;const r=pn(),i=bn(),o=hr(),c=o.defaultQueryOptions(e);(b=(j=o.getDefaultOptions().queries)==null?void 0:j._experimental_beforeQuery)==null||b.call(j,c);const l=o.getQueryCache().get(c.queryHash);c._optimisticResults=r?"isRestoring":"optimistic",jn(c),yn(c,i,l),vn(i);const d=!o.getQueryCache().get(c.queryHash),[u]=Q.useState(()=>new t(o,c)),h=u.getOptimisticResult(c),y=!r&&e.subscribed!==!1;if(Q.useSyncExternalStore(Q.useCallback(g=>{const m=y?u.subscribe(q.batchCalls(g)):H;return u.updateResult(),m},[u,y]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),Q.useEffect(()=>{u.setOptions(c)},[c,u]),kn(c,h))throw Es(c,u,i);if(wn({result:h,errorResetBoundary:i,throwOnError:c.throwOnError,query:l,suspense:c.suspense}))throw h.error;if((p=(x=o.getDefaultOptions().queries)==null?void 0:x._experimental_afterQuery)==null||p.call(x,c,h),c.experimental_prefetchInRender&&!gt.isServer()&&Nn(h,r)){const g=d?Es(c,u,i):l==null?void 0:l.promise;g==null||g.catch(H).finally(()=>{u.updateResult()})}return c.notifyOnChangeProps?h:u.trackResult(h)}function ae(e,t){return Cn(e,an)}/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Sn=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),mr=(...e)=>e.filter((t,s,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===s).join(" ").trim();/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var Rn={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _n=Q.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:s=2,absoluteStrokeWidth:r,className:i="",children:o,iconNode:c,...l},d)=>Q.createElement("svg",{ref:d,...Rn,width:t,height:t,stroke:e,strokeWidth:r?Number(s)*24/Number(t):s,className:mr("lucide",i),...l},[...c.map(([u,h])=>Q.createElement(u,h)),...Array.isArray(o)?o:[o]]));/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const z=(e,t)=>{const s=Q.forwardRef(({className:r,...i},o)=>Q.createElement(_n,{ref:o,iconNode:t,className:mr(`lucide-${Sn(e)}`,r),...i}));return s.displayName=`${e}`,s};/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Pn=z("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Mn=z("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const pr=z("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const On=z("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Et=z("CircleUserRound",[["path",{d:"M18 20a6 6 0 0 0-12 0",key:"1qehca"}],["circle",{cx:"12",cy:"10",r:"4",key:"1h16sb"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const En=z("Clock3",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16.5 12",key:"1aq6pp"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Fs=z("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Fn=z("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Tn=z("Filter",[["polygon",{points:"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3",key:"1yg77f"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const An=z("Link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const In=z("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ln=z("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Dn=z("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qn=z("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xr=z("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.468.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Qn=z("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),hs="-",$n=e=>{const t=zn(e),{conflictingClassGroups:s,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:c=>{const l=c.split(hs);return l[0]===""&&l.length!==1&&l.shift(),gr(l,t)||Un(c)},getConflictingClassGroupIds:(c,l)=>{const d=s[c]||[];return l&&r[c]?[...d,...r[c]]:d}}},gr=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const s=e[0],r=t.nextPart.get(s),i=r?gr(e.slice(1),r):void 0;if(i)return i;if(t.validators.length===0)return;const o=e.join(hs);return(c=t.validators.find(({validator:l})=>l(o)))==null?void 0:c.classGroupId},Ts=/^\[(.+)\]$/,Un=e=>{if(Ts.test(e)){const t=Ts.exec(e)[1],s=t==null?void 0:t.substring(0,t.indexOf(":"));if(s)return"arbitrary.."+s}},zn=e=>{const{theme:t,prefix:s}=e,r={nextPart:new Map,validators:[]};return Gn(Object.entries(e.classGroups),s).forEach(([o,c])=>{ts(c,r,o,t)}),r},ts=(e,t,s,r)=>{e.forEach(i=>{if(typeof i=="string"){const o=i===""?t:As(t,i);o.classGroupId=s;return}if(typeof i=="function"){if(Kn(i)){ts(i(r),t,s,r);return}t.validators.push({validator:i,classGroupId:s});return}Object.entries(i).forEach(([o,c])=>{ts(c,As(t,o),s,r)})})},As=(e,t)=>{let s=e;return t.split(hs).forEach(r=>{s.nextPart.has(r)||s.nextPart.set(r,{nextPart:new Map,validators:[]}),s=s.nextPart.get(r)}),s},Kn=e=>e.isThemeGetter,Gn=(e,t)=>t?e.map(([s,r])=>{const i=r.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,l])=>[t+c,l])):o);return[s,i]}):e,Bn=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,s=new Map,r=new Map;const i=(o,c)=>{s.set(o,c),t++,t>e&&(t=0,r=s,s=new Map)};return{get(o){let c=s.get(o);if(c!==void 0)return c;if((c=r.get(o))!==void 0)return i(o,c),c},set(o,c){s.has(o)?s.set(o,c):i(o,c)}}},br="!",Hn=e=>{const{separator:t,experimentalParseClassName:s}=e,r=t.length===1,i=t[0],o=t.length,c=l=>{const d=[];let u=0,h=0,y;for(let g=0;gh?y-h:void 0;return{modifiers:d,hasImportantModifier:b,baseClassName:x,maybePostfixModifierPosition:p}};return s?l=>s({className:l,parseClassName:c}):c},Jn=e=>{if(e.length<=1)return e;const t=[];let s=[];return e.forEach(r=>{r[0]==="["?(t.push(...s.sort(),r),s=[]):s.push(r)}),t.push(...s.sort()),t},Wn=e=>({cache:Bn(e.cacheSize),parseClassName:Hn(e),...$n(e)}),Vn=/\s+/,Xn=(e,t)=>{const{parseClassName:s,getClassGroupId:r,getConflictingClassGroupIds:i}=t,o=[],c=e.trim().split(Vn);let l="";for(let d=c.length-1;d>=0;d-=1){const u=c[d],{modifiers:h,hasImportantModifier:y,baseClassName:j,maybePostfixModifierPosition:b}=s(u);let x=!!b,p=r(x?j.substring(0,b):j);if(!p){if(!x){l=u+(l.length>0?" "+l:l);continue}if(p=r(j),!p){l=u+(l.length>0?" "+l:l);continue}x=!1}const g=Jn(h).join(":"),m=y?g+br:g,k=m+p;if(o.includes(k))continue;o.push(k);const _=i(p,x);for(let v=0;v<_.length;++v){const O=_[v];o.push(m+O)}l=u+(l.length>0?" "+l:l)}return l};function Zn(){let e=0,t,s,r="";for(;e{if(typeof e=="string")return e;let t,s="";for(let r=0;ry(h),e());return s=Wn(u),r=s.cache.get,i=s.cache.set,o=l,l(d)}function l(d){const u=r(d);if(u)return u;const h=Xn(d,s);return i(d,h),h}return function(){return o(Zn.apply(null,arguments))}}const E=e=>{const t=s=>s[e]||[];return t.isThemeGetter=!0,t},vr=/^\[(?:([a-z-]+):)?(.+)\]$/i,ei=/^\d+\/\d+$/,ti=new Set(["px","full","screen"]),si=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,ri=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,ni=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ii=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,ai=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ue=e=>He(e)||ti.has(e)||ei.test(e),be=e=>ot(e,"length",mi),He=e=>!!e&&!Number.isNaN(Number(e)),qt=e=>ot(e,"number",He),ut=e=>!!e&&Number.isInteger(Number(e)),oi=e=>e.endsWith("%")&&He(e.slice(0,-1)),N=e=>vr.test(e),ye=e=>si.test(e),li=new Set(["length","size","percentage"]),ci=e=>ot(e,li,wr),di=e=>ot(e,"position",wr),ui=new Set(["image","url"]),hi=e=>ot(e,ui,xi),fi=e=>ot(e,"",pi),ht=()=>!0,ot=(e,t,s)=>{const r=vr.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):s(r[2]):!1},mi=e=>ri.test(e)&&!ni.test(e),wr=()=>!1,pi=e=>ii.test(e),xi=e=>ai.test(e),gi=()=>{const e=E("colors"),t=E("spacing"),s=E("blur"),r=E("brightness"),i=E("borderColor"),o=E("borderRadius"),c=E("borderSpacing"),l=E("borderWidth"),d=E("contrast"),u=E("grayscale"),h=E("hueRotate"),y=E("invert"),j=E("gap"),b=E("gradientColorStops"),x=E("gradientColorStopPositions"),p=E("inset"),g=E("margin"),m=E("opacity"),k=E("padding"),_=E("saturate"),v=E("scale"),O=E("sepia"),A=E("skew"),W=E("space"),C=E("translate"),F=()=>["auto","contain","none"],T=()=>["auto","hidden","clip","visible","scroll"],G=()=>["auto",N,t],P=()=>[N,t],xe=()=>["",ue,be],Z=()=>["auto",He,N],ie=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Me=()=>["solid","dashed","dotted","double","none"],lt=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ze=()=>["start","end","center","between","around","evenly","stretch"],ge=()=>["","0",N],ct=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Y=()=>[He,N];return{cacheSize:500,separator:":",theme:{colors:[ht],spacing:[ue,be],blur:["none","",ye,N],brightness:Y(),borderColor:[e],borderRadius:["none","","full",ye,N],borderSpacing:P(),borderWidth:xe(),contrast:Y(),grayscale:ge(),hueRotate:Y(),invert:ge(),gap:P(),gradientColorStops:[e],gradientColorStopPositions:[oi,be],inset:G(),margin:G(),opacity:Y(),padding:P(),saturate:Y(),scale:Y(),sepia:ge(),skew:Y(),space:P(),translate:P()},classGroups:{aspect:[{aspect:["auto","square","video",N]}],container:["container"],columns:[{columns:[ye]}],"break-after":[{"break-after":ct()}],"break-before":[{"break-before":ct()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ie(),N]}],overflow:[{overflow:T()}],"overflow-x":[{"overflow-x":T()}],"overflow-y":[{"overflow-y":T()}],overscroll:[{overscroll:F()}],"overscroll-x":[{"overscroll-x":F()}],"overscroll-y":[{"overscroll-y":F()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[p]}],"inset-x":[{"inset-x":[p]}],"inset-y":[{"inset-y":[p]}],start:[{start:[p]}],end:[{end:[p]}],top:[{top:[p]}],right:[{right:[p]}],bottom:[{bottom:[p]}],left:[{left:[p]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ut,N]}],basis:[{basis:G()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",N]}],grow:[{grow:ge()}],shrink:[{shrink:ge()}],order:[{order:["first","last","none",ut,N]}],"grid-cols":[{"grid-cols":[ht]}],"col-start-end":[{col:["auto",{span:["full",ut,N]},N]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[ht]}],"row-start-end":[{row:["auto",{span:[ut,N]},N]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",N]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",N]}],gap:[{gap:[j]}],"gap-x":[{"gap-x":[j]}],"gap-y":[{"gap-y":[j]}],"justify-content":[{justify:["normal",...ze()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...ze(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...ze(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[g]}],mx:[{mx:[g]}],my:[{my:[g]}],ms:[{ms:[g]}],me:[{me:[g]}],mt:[{mt:[g]}],mr:[{mr:[g]}],mb:[{mb:[g]}],ml:[{ml:[g]}],"space-x":[{"space-x":[W]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[W]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",N,t]}],"min-w":[{"min-w":[N,t,"min","max","fit"]}],"max-w":[{"max-w":[N,t,"none","full","min","max","fit","prose",{screen:[ye]},ye]}],h:[{h:[N,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[N,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ye,be]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",qt]}],"font-family":[{font:[ht]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",N]}],"line-clamp":[{"line-clamp":["none",He,qt]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ue,N]}],"list-image":[{"list-image":["none",N]}],"list-style-type":[{list:["none","disc","decimal",N]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[m]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[m]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Me(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ue,be]}],"underline-offset":[{"underline-offset":["auto",ue,N]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:P()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",N]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",N]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[m]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ie(),di]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",ci]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},hi]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[x]}],"gradient-via-pos":[{via:[x]}],"gradient-to-pos":[{to:[x]}],"gradient-from":[{from:[b]}],"gradient-via":[{via:[b]}],"gradient-to":[{to:[b]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[m]}],"border-style":[{border:[...Me(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[m]}],"divide-style":[{divide:Me()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...Me()]}],"outline-offset":[{"outline-offset":[ue,N]}],"outline-w":[{outline:[ue,be]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:xe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[m]}],"ring-offset-w":[{"ring-offset":[ue,be]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ye,fi]}],"shadow-color":[{shadow:[ht]}],opacity:[{opacity:[m]}],"mix-blend":[{"mix-blend":[...lt(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":lt()}],filter:[{filter:["","none"]}],blur:[{blur:[s]}],brightness:[{brightness:[r]}],contrast:[{contrast:[d]}],"drop-shadow":[{"drop-shadow":["","none",ye,N]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[h]}],invert:[{invert:[y]}],saturate:[{saturate:[_]}],sepia:[{sepia:[O]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[s]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[d]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[h]}],"backdrop-invert":[{"backdrop-invert":[y]}],"backdrop-opacity":[{"backdrop-opacity":[m]}],"backdrop-saturate":[{"backdrop-saturate":[_]}],"backdrop-sepia":[{"backdrop-sepia":[O]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",N]}],duration:[{duration:Y()}],ease:[{ease:["linear","in","out","in-out",N]}],delay:[{delay:Y()}],animate:[{animate:["none","spin","ping","pulse","bounce",N]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[v]}],"scale-x":[{"scale-x":[v]}],"scale-y":[{"scale-y":[v]}],rotate:[{rotate:[ut,N]}],"translate-x":[{"translate-x":[C]}],"translate-y":[{"translate-y":[C]}],"skew-x":[{"skew-x":[A]}],"skew-y":[{"skew-y":[A]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",N]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",N]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":P()}],"scroll-mx":[{"scroll-mx":P()}],"scroll-my":[{"scroll-my":P()}],"scroll-ms":[{"scroll-ms":P()}],"scroll-me":[{"scroll-me":P()}],"scroll-mt":[{"scroll-mt":P()}],"scroll-mr":[{"scroll-mr":P()}],"scroll-mb":[{"scroll-mb":P()}],"scroll-ml":[{"scroll-ml":P()}],"scroll-p":[{"scroll-p":P()}],"scroll-px":[{"scroll-px":P()}],"scroll-py":[{"scroll-py":P()}],"scroll-ps":[{"scroll-ps":P()}],"scroll-pe":[{"scroll-pe":P()}],"scroll-pt":[{"scroll-pt":P()}],"scroll-pr":[{"scroll-pr":P()}],"scroll-pb":[{"scroll-pb":P()}],"scroll-pl":[{"scroll-pl":P()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",N]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ue,be,qt]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},bi=Yn(gi),yi=new fn({defaultOptions:{queries:{retry:1}}}),Is=12,vi=12,wi=10080*60*1e3,ji=1e3;function re(...e){return bi(Ar(e))}async function oe(e){const t=await fetch(e,{headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`${t.status} ${t.statusText}`);return t.json()}function ne(e){if(e==null)return"n/a";const t=Math.max(0,Math.floor(e));if(t<60)return`${t}s`;const s=Math.floor(t/60);return s<60?`${s}m ${t%60}s`:`${Math.floor(s/60)}h ${s%60}m`}const Ni=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}),ki=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});function Ct(e){if(!e)return null;const t=new Date(e);return Number.isNaN(t.getTime())?null:t}function Ci(e){const t=Ct(e);return t?Ni.format(t):e??""}function mt(e){const t=Ct(e);return t?ki.format(t):e??""}function jr(e,t){const s=Ct(e);if(!s)return e??"";const r=t-s.getTime(),i=Math.abs(r);if(i>wi)return mt(e);const o=r>=0?"ago":"from now",c=Math.round(i/1e3);if(c<45)return r>=0?"just now":"soon";if(c<90)return`1m ${o}`;const l=Math.round(c/60);if(l<60)return`${l}m ${o}`;if(l<90)return`1h ${o}`;const d=Math.round(l/60);return d<24?`${d}h ${o}`:d<36?`1d ${o}`:`${Math.round(d/24)}d ${o}`}function pe({value:e,compact:t=!1,relative:s=!1,now:r=Date.now()}){const i=Ct(e);return i?n.jsx("time",{dateTime:i.toISOString(),title:`UTC: ${i.toISOString()}`,children:s?jr(e,r):t?mt(e):Ci(e)}):n.jsx(n.Fragment,{children:e??""})}function Nr(e,t){const s=Ct(e);return s?Math.max(0,Math.floor((t-s.getTime())/1e3)):null}function fs(e,t){return e.status==="running"?Nr(e.started_at,t)??e.runtime_seconds:e.runtime_seconds}function ms(e,t){return e.status==="pending"?Nr(e.created_at,t)??e.queue_wait_seconds:e.queue_wait_seconds}function Si(e){const[t,s]=J.useState(()=>Date.now());return J.useEffect(()=>{if(!e)return;s(Date.now());const r=window.setInterval(()=>s(Date.now()),ji);return()=>window.clearInterval(r)},[e]),t}function Ri(e){return(e??"").split(/\r?\n/).map(s=>s.trim()).find(Boolean)??""}function Ft(e,t,s=1){const r=Ri(t),i=s>1?` (${s})`:"";return r?`${e}${i}: ${r}`:`${e}${i}`}function Tt(e){return e==="openclaw_stdout"||e==="openclaw_stderr"}function kr(e){return e.map(t=>t==null?void 0:t.trim()).filter(Boolean).join(` -`)}function _i(e){const t=[];for(const s of e){const r=t[t.length-1];if(r&&Tt(s.event_type)&&r.eventType===s.event_type){r.count+=1,r.meta=s.ts,r.detail=kr([r.detail,s.detail]),r.summary=Ft(s.summary,r.detail,r.count);continue}t.push({id:String(s.id),badge:s.event_type,meta:s.ts,summary:Tt(s.event_type)?Ft(s.summary,s.detail):s.summary,detail:s.detail,eventType:s.event_type,count:1})}return t}function Pi(e){const t=[];return e.forEach((s,r)=>{const i=t[t.length-1];if(i&&Tt(s.kind)&&i.kind===s.kind){i.count+=1,i.meta=s.timestamp,i.text=kr([i.text,s.text]),i.summary=Ft(`${s.role} · ${s.kind}`,i.text,i.count);return}t.push({id:`${s.timestamp??"entry"}-${r}`,badge:s.title,meta:s.timestamp,summary:Tt(s.kind)?Ft(`${s.role} · ${s.kind}`,s.text):`${s.role} · ${s.kind}`,text:s.text,kind:s.kind,count:1})}),t}function Ls(e,t,s,r){return e==="openclaw_stdout"?!1:t||s>=r-2}function Mi(e){return{pending:{badge:"border-amber-300 bg-amber-50 text-amber-800",dot:"bg-amber-500"},running:{badge:"border-blue-300 bg-blue-50 text-blue-700",dot:"bg-blue-600"},blocked:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},denied:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},done:{badge:"border-emerald-300 bg-emerald-50 text-emerald-700",dot:"bg-emerald-600"},waiting_approval:{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}[e]??{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}function Oi(e,t){const s=new URLSearchParams;for(const[r,i]of Object.entries(e))i.trim()&&s.set(r,i.trim());return s.set("limit",String(t)),`/api/jobs?${s.toString()}`}function bt(e){try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:"#"}catch{return"#"}}function Cr(e){return`/jobs/${e}`}function Ds(e){try{return JSON.parse(e.data)}catch{return null}}function Ei(e,t){return e.some(s=>s.id===t.id)?e:[...e,t]}function Fi(e,t){const s=qs(t);return e.some(r=>qs(r)===s)?e:[...e,t]}function qs(e){return`${e.timestamp??""}:${e.role}:${e.kind}:${e.title}:${e.text}`}function Ti(e=window.location.pathname){const t=e.match(/^\/jobs\/(\d+)\/?$/);return t?Number(t[1]):null}function Ai(){var P,xe,Z,ie,Me,lt,ze,ge,ct,Y,gs,bs;const e=hr(),[t,s]=J.useState({status:"",repo:"",thread:"",action:"",intent:"",actor:""}),[r,i]=J.useState(Is),[o,c]=J.useState(()=>window.location.pathname),l=Ti(o),d=l!==null,u=l,h=ae({queryKey:["metrics"],queryFn:()=>oe("/api/metrics/summary"),enabled:!d}),y=ae({queryKey:["me"],queryFn:()=>oe("/api/me"),refetchInterval:!1}),j=ae({queryKey:["job-actors"],queryFn:()=>oe("/api/jobs/actors"),enabled:!d}),b=ae({queryKey:["jobs",t,r],queryFn:()=>oe(Oi(t,r)),enabled:!d}),x=ae({queryKey:["processes"],queryFn:()=>oe("/api/processes"),enabled:!d}),p=ae({queryKey:["alerts"],queryFn:()=>oe("/api/alerts"),enabled:!d}),g=ae({queryKey:["job",u],queryFn:()=>oe(`/api/jobs/${u}`),enabled:u!==null}),m=ae({queryKey:["job-session",u],queryFn:()=>oe(`/api/jobs/${u}/session`),enabled:u!==null}),k=ae({queryKey:["job-session-events",u],queryFn:()=>oe(`/api/jobs/${u}/session/events`),enabled:u!==null}),_=ae({queryKey:["job-session-transcript",u],queryFn:()=>oe(`/api/jobs/${u}/session/transcript`),enabled:u!==null});J.useEffect(()=>{if(u===null)return;const D=new EventSource(`/api/jobs/${u}/session/stream`);return D.addEventListener("session_event",It=>{const Ke=Ds(It);Ke&&(e.setQueryData(["job-session-events",u],Oe=>({events:Ei((Oe==null?void 0:Oe.events)??[],Ke)})),e.invalidateQueries({queryKey:["job",u]}),e.invalidateQueries({queryKey:["jobs"]}))}),D.addEventListener("transcript_entry",It=>{const Ke=Ds(It);!Ke||Ke.job_id!==u||e.setQueryData(["job-session-transcript",u],Oe=>({entries:Fi((Oe==null?void 0:Oe.entries)??[],Ke.entry)}))}),D.onerror=()=>{D.close()},()=>D.close()},[u,e]),J.useEffect(()=>{const D=()=>{c(window.location.pathname)};return window.addEventListener("popstate",D),()=>window.removeEventListener("popstate",D)},[]);const v=J.useCallback(D=>{window.history.pushState({},"",Cr(D)),c(window.location.pathname)},[]),O=((P=h.data)==null?void 0:P.metrics.status_counts)??{},A=((xe=b.data)==null?void 0:xe.jobs)??[],W=J.useCallback(D=>{s(D),i(Is)},[]),C=u?((Z=g.data)==null?void 0:Z.job)??null:null,F=A.some(D=>D.status==="running"||D.status==="pending")||(C==null?void 0:C.status)==="running"||(C==null?void 0:C.status)==="pending",T=Si(F),G=n.jsx(Li,{selectedJobId:u,selectedJob:C,loading:g.isLoading,error:g.error,session:(ie=m.data)==null?void 0:ie.session,sessionEvents:(Me=k.data)==null?void 0:Me.events,transcript:(lt=_.data)==null?void 0:lt.entries,now:T});return n.jsxs("div",{className:"min-h-screen bg-background text-foreground",children:[n.jsx("header",{className:"border-b border-slate-800 bg-slate-950 text-white",children:n.jsxs("div",{className:"mx-auto flex w-full max-w-[1440px] items-center justify-between gap-3 px-4 py-4 md:px-6",children:[n.jsxs("div",{className:"min-w-0",children:[n.jsx("h1",{className:"truncate text-xl font-semibold",children:"GitHub Agent Bridge"}),n.jsx("p",{className:"text-sm text-slate-300",children:"Read-only operational dashboard"})]}),n.jsx(Di,{user:(ze=y.data)==null?void 0:ze.user,loading:y.isLoading})]})}),n.jsx("main",{className:"mx-auto grid w-full max-w-[1440px] gap-4 px-3 py-4 sm:px-4 md:px-6 md:py-5",children:l!==null?n.jsx(Ii,{jobId:l,detail:G,onRefresh:()=>{g.refetch(),m.refetch(),k.refetch(),_.refetch()}}):n.jsxs(n.Fragment,{children:[h.error?n.jsx(Be,{tone:"error",text:h.error.message}):null,n.jsxs("section",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Summary metrics",children:[n.jsx(Pt,{title:"Pending",value:O.pending??0,icon:n.jsx(En,{className:"h-5 w-5"})}),n.jsx(Pt,{title:"Running",value:O.running??0,icon:n.jsx(Pn,{className:"h-5 w-5"})}),n.jsx(Pt,{title:"Blocked",value:O.blocked??0,icon:n.jsx(xr,{className:"h-5 w-5"})}),n.jsx(Pt,{title:"Done",value:O.done??0,icon:n.jsx(On,{className:"h-5 w-5"})})]}),n.jsxs("section",{className:"grid gap-3",children:[n.jsx(qi,{count:A.length,limit:r,loading:b.isLoading,onRefresh:()=>b.refetch()}),n.jsxs(Ee,{title:"Recent jobs",flushHeader:!0,children:[n.jsx(Qi,{filters:t,actorOptions:((ge=j.data)==null?void 0:ge.actors)??[],onChange:W}),b.error?n.jsx(Be,{tone:"error",text:b.error.message}):null,n.jsx(Ui,{jobs:A,loading:b.isLoading,onViewJob:v,now:T}),A.length>=r?n.jsx("div",{className:"mt-3 flex justify-center",children:n.jsx("button",{className:"inline-flex h-9 items-center justify-center rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:()=>i(D=>D+vi),children:"Load more jobs"})}):null]})]}),n.jsxs("section",{className:"grid gap-4",children:[n.jsxs(Ee,{title:"Process activity",action:n.jsx(At,{onClick:()=>x.refetch()}),children:[x.error?n.jsx(Be,{tone:"error",text:x.error.message}):null,n.jsx(Wi,{data:x.data,loading:x.isLoading})]}),n.jsxs(Ee,{title:"Monitor alerts",action:n.jsx(At,{onClick:()=>p.refetch()}),children:[p.error?n.jsx(Be,{tone:"error",text:p.error.message}):null,n.jsx(Vi,{alerts:(ct=p.data)==null?void 0:ct.alerts,loading:p.isLoading,now:T})]})]}),n.jsxs("section",{className:"grid gap-4 xl:grid-cols-3",children:[n.jsx(Ee,{title:"Runtime percentiles",children:n.jsx(Qs,{label:"runtime",values:(Y=h.data)==null?void 0:Y.metrics.runtime_seconds})}),n.jsx(Ee,{title:"Jobs per day",children:n.jsx(Hi,{values:(gs=h.data)==null?void 0:gs.metrics.by_created_day,loading:h.isLoading,totalJobs:Ji(O)})}),n.jsx(Ee,{title:"Queue wait percentiles",children:n.jsx(Qs,{label:"queue wait",values:(bs=h.data)==null?void 0:bs.metrics.queue_wait_seconds})})]})]})})]})}function Ii({jobId:e,detail:t,onRefresh:s}){return n.jsxs("div",{className:"grid min-w-0 gap-3 sm:gap-4",children:[n.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[n.jsxs("a",{className:"inline-flex h-9 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",href:"/",children:[n.jsx(Mn,{className:"h-4 w-4","aria-hidden":!0}),"Dashboard"]}),n.jsx(At,{onClick:s})]}),n.jsx(Ee,{title:`Job #${e}`,className:"p-3 sm:p-4",children:t})]})}function Li({selectedJobId:e,selectedJob:t,loading:s,error:r,session:i,sessionEvents:o,transcript:c,now:l}){return t?n.jsx(Ki,{job:t,session:i,sessionEvents:o,transcript:c,now:l}):e!==null&&s?n.jsx(U,{text:"Loading selected job..."}):e!==null&&r?n.jsx(Be,{tone:"error",text:`Job #${e}: ${r.message}`}):n.jsx(U,{text:"Select a job to inspect its timeline, worklog and GitHub links."})}function Di({user:e,loading:t}){const s=e!=null&&e.login?`@${e.login}`:t?"Loading profile...":"GitHub OAuth",r=e!=null&&e.avatar_url?n.jsx("img",{className:"h-10 w-10 rounded-full border border-slate-700 bg-slate-800",src:e.avatar_url,alt:e.login?`${e.login} avatar`:"",referrerPolicy:"no-referrer"}):n.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-slate-700 bg-slate-900",children:n.jsx(Et,{className:"h-5 w-5","aria-hidden":!0})}),i=e!=null&&e.html_url?n.jsx("a",{className:"truncate font-semibold text-white hover:underline",href:bt(e.html_url),rel:"noreferrer",target:"_blank",children:s}):n.jsx("div",{className:"truncate font-semibold text-white",children:s});return n.jsxs("div",{className:"flex max-w-full shrink-0 items-center gap-3 text-sm text-slate-300","aria-label":e!=null&&e.login?`Signed in as ${e.login}`:"Dashboard account",children:[n.jsx(Dn,{className:"hidden h-4 w-4 shrink-0 sm:block","aria-hidden":!0}),n.jsxs("div",{className:"hidden min-w-0 text-right sm:block",children:[i,n.jsx("div",{className:"text-xs text-slate-400",children:"Signed in · read-only"})]}),r]})}function qi({count:e,limit:t,loading:s,onRefresh:r}){return n.jsxs("div",{className:"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-lg border border-border bg-white px-3 py-3 shadow-sm md:px-4",children:[n.jsxs("div",{className:"min-w-0",children:[n.jsx("h2",{className:"text-base font-semibold",children:"Jobs"}),n.jsx("p",{className:"text-xs text-muted",children:s?"Refreshing latest jobs...":`Showing ${e} of the latest ${t} requested jobs`})]}),n.jsx(At,{onClick:r,compactOnMobile:!0})]})}function Ee({title:e,action:t,children:s,className:r,flushHeader:i=!1}){return n.jsxs("section",{className:re("min-w-0 rounded-lg border border-border bg-panel p-4 shadow-sm",r),children:[n.jsxs("div",{className:re("flex items-center justify-between gap-3",!i&&"mb-4"),children:[n.jsx("h2",{className:"text-sm font-semibold",children:e}),t]}),s]})}function Pt({title:e,value:t,icon:s}){return n.jsxs("div",{className:"rounded-lg border border-border bg-panel p-3 shadow-sm md:p-4",children:[n.jsxs("div",{className:"flex items-center justify-between text-muted",children:[n.jsx("span",{className:"text-sm font-medium",children:e}),s]}),n.jsx("strong",{className:"mt-3 block text-2xl leading-none md:mt-4 md:text-3xl",children:t})]})}function Qi({filters:e,actorOptions:t,onChange:s}){const[r,i]=J.useState(e);return J.useEffect(()=>i(e),[e]),n.jsxs("details",{className:"my-3 rounded-md border border-border bg-slate-50/70",children:[n.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-2 text-sm font-semibold marker:hidden",children:[n.jsxs("span",{className:"inline-flex items-center gap-2",children:[n.jsx(Tn,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Filters"]}),n.jsx(pr,{className:"h-4 w-4 text-muted","aria-hidden":!0})]}),n.jsxs("form",{className:"grid gap-3 border-t border-border bg-white p-3 md:grid-cols-3 xl:grid-cols-8",onSubmit:o=>{o.preventDefault(),s(r)},children:[n.jsx(Ge,{label:"Status",children:n.jsxs("select",{className:"control",value:r.status,onChange:o=>i({...r,status:o.target.value}),children:[n.jsx("option",{value:"",children:"All"}),n.jsx("option",{value:"pending",children:"pending"}),n.jsx("option",{value:"running",children:"running"}),n.jsx("option",{value:"blocked",children:"blocked"}),n.jsx("option",{value:"done",children:"done"}),n.jsx("option",{value:"denied",children:"denied"}),n.jsx("option",{value:"waiting_approval",children:"waiting_approval"})]})}),n.jsx(Ge,{label:"Repository",children:n.jsx("input",{className:"control",value:r.repo,placeholder:"owner/repo",onChange:o=>i({...r,repo:o.target.value})})}),n.jsx(Ge,{label:"Thread",children:n.jsx("input",{className:"control",value:r.thread,inputMode:"numeric",placeholder:"issue or PR",onChange:o=>i({...r,thread:o.target.value})})}),n.jsx(Ge,{label:"Action",children:n.jsx("input",{className:"control",value:r.action,placeholder:"reply_comment",onChange:o=>i({...r,action:o.target.value})})}),n.jsx(Ge,{label:"Actor",className:"xl:col-span-2",children:n.jsx($i,{value:r.actor,options:t,onChange:o=>i({...r,actor:o})})}),n.jsx(Ge,{label:"Intent",children:n.jsxs("select",{className:"control",value:r.intent,onChange:o=>i({...r,intent:o.target.value}),children:[n.jsx("option",{value:"",children:"All"}),n.jsx("option",{value:"review_only",children:"review_only"}),n.jsx("option",{value:"work_allowed",children:"work_allowed"})]})}),n.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 self-end rounded-md bg-primary px-3 text-sm font-semibold text-white",type:"submit",children:[n.jsx(Ln,{className:"h-4 w-4","aria-hidden":!0}),"Apply"]})]})]})}function $i({value:e,options:t,onChange:s}){const[r,i]=J.useState(!1),o=e.trim().replace(/^@/,"").toLowerCase(),c=t.filter(d=>!o||d.login.toLowerCase().includes(o)).slice(0,8),l=t.find(d=>d.login.toLowerCase()===o);return n.jsxs("div",{className:"relative min-w-0",children:[n.jsxs("div",{className:"control flex items-center gap-2 px-2",children:[l?n.jsx("img",{className:"h-5 w-5 shrink-0 rounded-full bg-slate-100",src:bt(l.avatar_url??""),alt:`${l.login} avatar`,referrerPolicy:"no-referrer"}):n.jsx(Et,{className:"h-4 w-4 shrink-0 text-muted","aria-hidden":!0}),n.jsx("input",{className:"min-w-0 flex-1 bg-transparent font-mono text-sm outline-none",value:e,placeholder:"@login",onChange:d=>{s(d.target.value),i(!0)},onFocus:()=>i(!0),onBlur:()=>window.setTimeout(()=>i(!1),100)}),e?n.jsx("button",{className:"rounded-sm p-1 text-muted hover:bg-slate-100",type:"button","aria-label":"Clear actor filter",onClick:()=>s(""),children:n.jsx(Qn,{className:"h-3.5 w-3.5","aria-hidden":!0})}):null]}),r&&c.length>0?n.jsx("div",{className:"absolute left-0 right-0 z-20 mt-1 max-h-72 overflow-auto rounded-md border border-border bg-white p-1 shadow-lg",children:c.map(d=>n.jsxs("button",{className:"flex w-full items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-slate-50",type:"button",onMouseDown:u=>u.preventDefault(),onClick:()=>{s(d.login),i(!1)},children:[d.avatar_url?n.jsx("img",{className:"h-6 w-6 shrink-0 rounded-full bg-slate-100",src:bt(d.avatar_url),alt:`${d.login} avatar`,referrerPolicy:"no-referrer"}):n.jsx(Et,{className:"h-5 w-5 shrink-0 text-muted","aria-hidden":!0}),n.jsxs("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-foreground",children:["@",d.login]}),n.jsx("span",{className:"shrink-0 rounded-full bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold text-muted",children:d.job_count})]},d.login))}):null]})}function Ge({label:e,children:t,className:s}){return n.jsxs("label",{className:re("grid min-w-0 gap-1 text-xs font-semibold text-muted",s),children:[e,t]})}function Ui({jobs:e,loading:t,onViewJob:s,now:r}){return t&&e.length===0?n.jsx(U,{text:"Loading jobs..."}):e.length===0?n.jsx(U,{text:"No jobs match the current filters."}):n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"grid gap-2 md:hidden",children:e.map(i=>n.jsx(zi,{job:i,onViewJob:s,now:r},i.id))}),n.jsx("div",{className:"hidden max-h-[640px] overflow-auto rounded-md border border-border md:block",children:n.jsxs("table",{className:"min-w-full border-collapse text-sm",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"sticky top-0 border-b border-border bg-panel text-left text-xs text-muted",children:[n.jsx("th",{className:"px-2 py-2 font-semibold",children:"ID"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Status"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Repo / thread"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Action"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Actor"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Attempts"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Queue wait"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Runtime"}),n.jsx("th",{className:"px-2 py-2 font-semibold",children:"Updated"})]})}),n.jsx("tbody",{children:e.map(i=>n.jsxs("tr",{className:"cursor-pointer border-b border-border hover:bg-slate-50",onClick:()=>s(i.id),children:[n.jsxs("td",{className:"px-2 py-3 font-mono",children:["#",i.id]}),n.jsx("td",{className:"px-2 py-3",children:n.jsx(xs,{status:i.status})}),n.jsxs("td",{className:"px-2 py-3",children:[n.jsx("div",{className:"font-mono",children:i.repo??i.work_key}),n.jsxs("div",{className:"text-xs text-muted",children:["thread ",i.thread??"n/a"]})]}),n.jsxs("td",{className:"px-2 py-3",children:[n.jsx("div",{children:i.action}),n.jsx("div",{className:"text-xs text-muted",children:i.intent})]}),n.jsx("td",{className:"px-2 py-3",children:n.jsx(ps,{actor:i.trigger_actor,avatarUrl:i.trigger_actor_avatar_url})}),n.jsx("td",{className:"px-2 py-3",children:i.attempts}),n.jsx("td",{className:"px-2 py-3",children:ne(ms(i,r))}),n.jsx("td",{className:"px-2 py-3",children:ne(fs(i,r))}),n.jsx("td",{className:"px-2 py-3 font-mono text-xs",children:n.jsx(pe,{value:i.updated_at,compact:!0,relative:!0,now:r})})]},i.id))})]})})]})}function zi({job:e,onViewJob:t,now:s}){return n.jsx("article",{className:"rounded-md border border-border bg-white shadow-[0_1px_0_rgba(15,23,42,0.03)]",children:n.jsxs("button",{className:"grid w-full gap-2 p-3 text-left hover:bg-slate-50",type:"button",onClick:()=>t(e.id),children:[n.jsxs("div",{className:"flex items-start justify-between gap-2",children:[n.jsxs("div",{className:"min-w-0 space-y-1",children:[n.jsxs("div",{className:"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-2",children:[n.jsxs("span",{className:"shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),n.jsx("span",{className:"truncate font-mono text-sm",children:e.repo??e.work_key})]}),n.jsx("div",{className:"line-clamp-2 text-sm leading-snug text-foreground",children:e.subject}),n.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[n.jsxs("span",{children:["thread ",e.thread??"n/a"," · ",e.action]}),n.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})]})]}),n.jsx(xs,{status:e.status})]}),n.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[n.jsx(ee,{label:"Wait",value:ne(ms(e,s))}),n.jsx(ee,{label:"Runtime",value:ne(fs(e,s))}),n.jsx(ee,{label:"Updated",value:n.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:s})})]})]})})}function ps({actor:e,avatarUrl:t,framed:s=!1}){const r=t?n.jsx("img",{className:"h-4 w-4 shrink-0 rounded-full bg-slate-100",src:bt(t),alt:e?`${e} avatar`:"",referrerPolicy:"no-referrer"}):n.jsx(Et,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),i=n.jsxs(n.Fragment,{children:[r,n.jsx("span",{className:"min-w-0 truncate",children:e?`@${e}`:"unknown actor"})]});return s?n.jsx("span",{className:"inline-flex h-7 max-w-full items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-muted",children:i}):n.jsx("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 font-mono text-xs text-muted",children:i})}function Ki({job:e,session:t,sessionEvents:s,transcript:r,now:i,compact:o=!1}){var b;const c=Cr(e.id),l=s??[],d=r??[],u=_i(l),h=Pi(d),y=fs(e,i),j=ms(e,i);return n.jsxs("div",{className:"grid min-w-0 gap-4",children:[n.jsxs("div",{className:"grid gap-2",children:[n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx(xs,{status:e.status}),n.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:c,children:[n.jsx(An,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.id]}),n.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url,framed:!0})]}),n.jsx("div",{className:"min-w-0 break-words font-mono text-sm [overflow-wrap:anywhere]",children:e.work_key}),n.jsx("p",{className:"min-w-0 break-words text-sm text-muted [overflow-wrap:anywhere]",children:e.subject})]}),n.jsxs("div",{className:re("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-3"),children:[n.jsx(ee,{label:"Queue wait",value:ne(j)}),n.jsx(ee,{label:e.status==="running"?"Running for":"Runtime",value:ne(y)}),n.jsx(ee,{label:"Coalesced",value:String(e.coalesced_count)})]}),n.jsxs("div",{className:re("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[n.jsx(ee,{label:"Created",value:n.jsx(pe,{value:e.created_at,compact:!0,relative:!0,now:i})}),n.jsx(ee,{label:"Started",value:e.started_at?n.jsx(pe,{value:e.started_at,compact:!0,relative:!0,now:i}):"n/a"}),n.jsx(ee,{label:"Updated",value:n.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:i})}),n.jsx(ee,{label:"Finished",value:e.finished_at?n.jsx(pe,{value:e.finished_at,compact:!0,relative:!0,now:i}):"n/a"})]}),n.jsxs("div",{children:[n.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Timeline"}),n.jsx("div",{className:"grid min-w-0 gap-3",children:(e.worklog??[]).length>0?(b=e.worklog)==null?void 0:b.map(x=>n.jsxs("div",{className:"min-w-0 border-l-2 border-primary pl-3",children:[n.jsx("div",{className:"text-sm font-semibold",children:x.phase}),n.jsx("div",{className:"font-mono text-xs text-muted",children:n.jsx(pe,{value:x.ts,relative:!0,now:i})}),n.jsx("div",{className:"break-words text-sm [overflow-wrap:anywhere]",children:x.summary}),x.detail?n.jsx("div",{className:"mt-1 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:x.detail}):null]},x.id)):n.jsx(U,{text:"No worklog entries."})})]}),n.jsxs("div",{children:[n.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[n.jsx(qn,{className:"h-4 w-4","aria-hidden":!0}),"OpenClaw session"]}),t?n.jsxs("div",{className:"grid gap-3",children:[n.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[n.jsx(ee,{label:"Session ID",value:t.id}),n.jsx(ee,{label:"Source",value:t.source})]}),n.jsx("p",{className:"break-words text-xs text-muted [overflow-wrap:anywhere]",children:t.detail})]}):n.jsx(U,{text:"Session correlation is loading."})]}),n.jsxs("div",{children:[n.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Agent activity"}),n.jsx("div",{className:"grid max-h-[460px] min-w-0 gap-2 overflow-auto pr-1",children:u.length>0?u.map((x,p)=>n.jsx(Bi,{event:x,defaultOpen:Ls(x.eventType,e.status==="running",p,u.length),now:i},x.id)):n.jsx(U,{text:e.status==="running"?"Waiting for live agent output...":"No agent activity has been recorded for this session."})})]}),n.jsxs("div",{children:[n.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Session transcript"}),n.jsx("div",{className:"grid max-h-[620px] min-w-0 gap-2 overflow-auto pr-1",children:h.length>0?h.map((x,p)=>n.jsx(Gi,{entry:x,defaultOpen:Ls(x.kind,e.status==="running",p,h.length),now:i},x.id)):n.jsx(U,{text:e.status==="running"?"Waiting for live transcript entries...":"No OpenClaw transcript entries are available for this session."})})]}),n.jsxs("div",{children:[n.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"GitHub links"}),n.jsx("ul",{className:"grid gap-2 text-sm",children:e.github_urls.length>0?e.github_urls.map(x=>n.jsx("li",{children:n.jsxs("a",{className:"break-all text-primary hover:underline [overflow-wrap:anywhere]",href:bt(x),rel:"noreferrer",target:"_blank",children:[n.jsx(Fn,{className:"mr-1 inline h-3.5 w-3.5 align-[-2px]","aria-hidden":!0}),x]})},x)):n.jsx("li",{className:"text-muted",children:"No links recorded."})})]})]})}function Gi({entry:e,defaultOpen:t,now:s}){return n.jsx(Sr,{badge:e.badge,meta:n.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:n.jsx("pre",{className:"max-h-72 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.text})})}function Bi({event:e,defaultOpen:t,now:s}){return n.jsx(Sr,{badge:e.badge,meta:n.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:e.detail?n.jsx("pre",{className:"max-h-56 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.detail}):null})}function Sr({badge:e,meta:t,count:s,summary:r,defaultOpen:i,children:o}){const[c,l]=J.useState(!!i);return n.jsxs("details",{className:"group min-w-0 rounded border border-border bg-slate-50/60",open:c,onToggle:d=>l(d.currentTarget.open),children:[n.jsxs("summary",{className:"grid cursor-pointer list-none gap-1 px-2 py-1.5 marker:hidden hover:bg-white",children:[n.jsxs("div",{className:"grid min-w-0 gap-1 sm:flex sm:items-center sm:justify-between sm:gap-2",children:[n.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[n.jsx(pr,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),n.jsx("span",{className:"truncate font-mono text-[11px] font-semibold text-muted",children:e}),s&&s>1?n.jsx("span",{className:"rounded-sm border border-border px-1 font-mono text-[10px] text-muted",children:s}):null]}),n.jsx("span",{className:"min-w-0 truncate pl-5 font-mono text-[11px] text-muted sm:shrink-0 sm:pl-0",children:t})]}),n.jsx("div",{className:"min-w-0 break-words pl-5 text-xs text-foreground [overflow-wrap:anywhere] sm:truncate",children:r})]}),n.jsx("div",{className:"min-w-0 border-t border-border bg-white px-2 py-2",children:o})]})}function Qs({label:e,values:t}){const s=[{name:"median",seconds:(t==null?void 0:t.median)??0},{name:"p90",seconds:(t==null?void 0:t.p90)??0},{name:"p99",seconds:(t==null?void 0:t.p99)??0}];return n.jsx("div",{className:"h-56",children:n.jsx(rs,{width:"100%",height:"100%",children:n.jsxs(Ys,{data:s,children:[n.jsx(ns,{strokeDasharray:"3 3"}),n.jsx(is,{dataKey:"name"}),n.jsx(as,{tickFormatter:ne}),n.jsx(os,{formatter:r=>[ne(Number(r)),e]}),n.jsx(er,{dataKey:"seconds",fill:"#0969da",radius:[4,4,0,0]})]})})})}function Hi({values:e,loading:t,totalJobs:s}){const r=Object.entries(e??{}).map(([i,o])=>({day:i,count:o}));return t&&r.length===0?n.jsx(U,{text:"Loading job history..."}):r.length===0?n.jsx(U,{text:s>0?"Job history has no valid creation dates.":"No job history available."}):n.jsx("div",{className:"h-56",children:n.jsx(rs,{width:"100%",height:"100%",children:n.jsxs(Ys,{data:r,children:[n.jsx(ns,{strokeDasharray:"3 3"}),n.jsx(is,{dataKey:"day",minTickGap:16}),n.jsx(as,{allowDecimals:!1}),n.jsx(os,{formatter:i=>[Number(i),"jobs"]}),n.jsx(er,{dataKey:"count",fill:"#16a34a",radius:[4,4,0,0]})]})})})}function Ji(e){return Object.values(e).reduce((t,s)=>t+s,0)}function Wi({data:e,loading:t}){var y,j,b,x,p,g;if(t&&!e)return n.jsx(U,{text:"Loading process activity..."});if(!e)return n.jsx(U,{text:"No process snapshot available."});const s=e.executor.children??[],r=s.flatMap(m=>_r(m)),i=r.reduce((m,k)=>m+k.cpu_ticks,0),o=r.reduce((m,k)=>m+Xi(k),0),c=e.executor.service==="active",l=r.slice(0,8).map(m=>({label:`pid ${m.pid}`,ticks:m.cpu_ticks})),d=(e.samples??[]).map(m=>({label:mt(m.ts),ticks:m.cpu_ticks,io:m.io_bytes,active:m.active_since_last_sample?"active":"quiet"})),u=d.length>0?d:l,h=(y=e.samples)==null?void 0:y[e.samples.length-1];return n.jsxs("div",{className:"grid gap-4",children:[n.jsx("div",{className:"rounded-md border border-slate-200 bg-slate-50 p-3",children:n.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[n.jsxs("div",{className:"min-w-0",children:[n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx("span",{className:re("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",c?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-white text-slate-600"),children:c?"active":"idle"}),n.jsxs("span",{className:"font-mono text-xs text-muted",children:["service ",e.executor.service]})]}),n.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:e.running_jobs.length>0?`${e.running_jobs.length} running job${e.running_jobs.length===1?"":"s"}`:"No running jobs"}),e.running_jobs.length>0?n.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:e.running_jobs.slice(0,4).map(m=>n.jsxs("span",{className:"inline-flex min-h-6 items-center gap-1.5 rounded-full border border-blue-200 bg-white px-2 font-mono text-[11px] font-semibold text-blue-700",children:[n.jsx("span",{className:"h-2 w-2 rounded-full bg-blue-600 animate-live-pulse","aria-hidden":!0}),"#",m.id," ",ne(m.age_seconds)]},m.id))}):null,h?n.jsxs("p",{className:"mt-1 text-xs text-muted",children:["Last persisted sample ",mt(h.ts)," · ",h.active_since_last_sample?"activity observed":`quiet ${ne(h.idle_seconds)}`]}):null,n.jsx("p",{className:"mt-1 text-xs text-muted",children:e.detail})]}),n.jsxs("div",{className:"grid min-w-[190px] grid-cols-3 gap-2 text-center text-xs",children:[n.jsx(Qt,{label:"PID",value:e.executor.pid?String(e.executor.pid):"n/a"}),n.jsx(Qt,{label:"Children",value:String(r.length)}),n.jsx(Qt,{label:"CPU ticks",value:String(i)})]})]})}),n.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[n.jsx(Mt,{label:"Live process",value:((j=e.signals)==null?void 0:j.live_process.state)??(r.length>0?"live":"no_child_process"),detail:`${((b=e.signals)==null?void 0:b.live_process.child_count)??r.length} children`}),n.jsx(Mt,{label:"Process activity",value:((x=e.signals)==null?void 0:x.process_activity.state)??(h!=null&&h.active_since_last_sample?"active":"quiet"),detail:h?`sample ${mt(h.ts)}`:"no sample"}),n.jsx(Mt,{label:"Semantic progress",value:(p=e.signals)!=null&&p.semantic_progress.length?"recent":"none",detail:$s(e.running_jobs,"semantic_progress")}),n.jsx(Mt,{label:"Visible progress",value:(g=e.signals)!=null&&g.visible_progress.length?"streaming":"none",detail:$s(e.running_jobs,"visible_progress")})]}),e.alerts.length>0?n.jsx(Be,{tone:"error",text:e.alerts[0]}):null,n.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[n.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[n.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[n.jsxs("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[n.jsx(Fs,{className:"h-4 w-4","aria-hidden":!0}),d.length>0?"CPU history":"CPU ticks"]}),n.jsxs("span",{className:"font-mono text-xs text-muted",children:[Pr(o)," I/O"]})]}),u.length>0?n.jsx("div",{className:"h-40",children:n.jsx(rs,{width:"100%",height:"100%",children:n.jsxs(Fr,{data:u,children:[n.jsx(ns,{strokeDasharray:"3 3"}),n.jsx(is,{dataKey:"label",tick:!1}),n.jsx(as,{allowDecimals:!1,tick:{fontSize:11}}),n.jsx(os,{formatter:m=>[Number(m),"cpu ticks"]}),n.jsx(Tr,{type:"monotone",dataKey:"ticks",stroke:"#0f766e",strokeWidth:2,dot:{r:3},activeDot:{r:5},isAnimationActive:!1})]})})}):n.jsx(U,{text:"No executor CPU samples available."})]}),n.jsxs("div",{className:"min-w-0",children:[n.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[n.jsx(Fs,{className:"h-4 w-4","aria-hidden":!0}),"Executor children"]}),s.length>0?n.jsx("div",{className:"grid gap-2",children:s.map(m=>n.jsx(Rr,{process:m},m.pid))}):n.jsx(U,{text:"No child process detected for the executor."})]})]})]})}function Vi({alerts:e,loading:t,now:s}){if(t&&!e)return n.jsx(U,{text:"Loading monitor alerts..."});const r=e??[];return r.length===0?n.jsx(U,{text:"No active monitor alerts."}):n.jsx("div",{className:"grid gap-2",children:r.slice(0,5).map(i=>n.jsxs("div",{className:"rounded-md border border-red-200 bg-red-50 p-2.5",children:[n.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-semibold text-red-700",children:[n.jsx(xr,{className:"h-3.5 w-3.5","aria-hidden":!0}),n.jsx("span",{children:i.severity}),n.jsx("span",{className:"font-normal text-red-600",children:jr(i.last_seen,s)}),i.observations>1?n.jsxs("span",{className:"rounded-full border border-red-200 bg-white px-1.5",children:[i.observations,"x"]}):null]}),n.jsx("p",{className:"mt-1 break-words text-sm font-medium text-red-950 [overflow-wrap:anywhere]",children:i.message})]},i.fingerprint))})}function Rr({process:e}){var r,i;const t=((r=e.io_bytes)==null?void 0:r.read_bytes)??0,s=((i=e.io_bytes)==null?void 0:i.write_bytes)??0;return n.jsxs("div",{className:"rounded-md border border-border bg-white p-2.5",children:[n.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[n.jsxs("span",{className:"font-mono",children:["pid ",e.pid]}),n.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["state ",e.state]}),n.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["cpu ",e.cpu_ticks]}),n.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["I/O ",Pr(t+s)]})]}),n.jsx("div",{className:"mt-2 break-words font-mono text-xs text-muted",children:e.cmd||"unknown command"}),e.children&&e.children.length>0?n.jsx("div",{className:"mt-3 border-l-2 border-border pl-3",children:e.children.map(o=>n.jsx(Rr,{process:o},o.pid))}):null]})}function Qt({label:e,value:t}){return n.jsxs("div",{className:"rounded-md border border-border bg-white px-2 py-2",children:[n.jsx("div",{className:"font-mono text-sm font-semibold text-foreground",children:t}),n.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Mt({label:e,value:t,detail:s}){return n.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-2.5",children:[n.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),n.jsx("div",{className:"mt-1 truncate text-sm font-semibold text-foreground",children:t}),n.jsx("div",{className:"mt-1 truncate font-mono text-[11px] text-muted",children:s})]})}function $s(e,t){const s=e.find(i=>i[t]),r=s==null?void 0:s[t];return!s||!r?"no running heartbeat":`#${s.id} ${r.phase} ${ne(r.age_seconds??null)}`}function _r(e){return[e,...(e.children??[]).flatMap(t=>_r(t))]}function Xi(e){var t,s;return(((t=e.io_bytes)==null?void 0:t.read_bytes)??0)+(((s=e.io_bytes)==null?void 0:s.write_bytes)??0)}function Pr(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ee({label:e,value:t}){return n.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[n.jsx("div",{className:"text-xs font-semibold text-muted",children:e}),n.jsx("div",{className:"mt-1 min-w-0 break-words text-sm [overflow-wrap:anywhere]",children:t})]})}function xs({status:e}){const t=Mi(e),s=e==="running"||e==="pending";return n.jsxs("span",{className:re("inline-flex min-h-6 items-center gap-1.5 rounded-full border px-2 text-xs font-semibold",t.badge),children:[n.jsx("span",{className:re("h-2.5 w-2.5 rounded-full",t.dot,s&&"animate-live-pulse"),"aria-hidden":!0}),e]})}function U({text:e}){return n.jsx("div",{className:"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted",children:e})}function Be({tone:e,text:t}){return n.jsx("div",{className:re("rounded-md border p-3 text-sm",e==="error"&&"border-red-300 bg-red-50 text-red-700"),children:t})}function At({onClick:e,compactOnMobile:t=!1}){return n.jsxs("button",{className:re("inline-flex h-8 items-center justify-center gap-2 rounded-md border border-border text-sm font-semibold text-foreground hover:bg-slate-50",t?"w-8 px-0 sm:w-auto sm:px-3":"px-3"),onClick:e,type:"button","aria-label":"Refresh",children:[n.jsx(In,{className:"h-4 w-4","aria-hidden":!0}),n.jsx("span",{className:re(t&&"hidden sm:inline"),children:"Refresh"})]})}const Us=document.getElementById("root");Us&&Qr.createRoot(Us).render(n.jsx(J.StrictMode,{children:n.jsx(mn,{client:yi,children:n.jsx(Ai,{})})})); diff --git a/src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js b/src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js new file mode 100644 index 0000000..ea1af40 --- /dev/null +++ b/src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js @@ -0,0 +1,110 @@ +var vs=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=(e,t,s)=>(Lt(e,t,"read from private field"),s?s.call(e):t.get(e)),w=(e,t,s)=>t.has(e)?vs("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),m=(e,t,s,n)=>(Lt(e,t,"write to private field"),n?n.call(e,s):t.set(e,s),s),C=(e,t,s)=>(Lt(e,t,"access private method"),s);var St=(e,t,s,n)=>({set _(i){m(e,t,i,s)},get _(){return a(e,t,n)}});import{e as Fr,f as Er,g as Tr,r as Q,R as W,c as rs,b as Ar,C as ns,X as is,Y as as,T as os,L as Ir,a as er,B as tr,d as Lr}from"./charts-DRWoArYU.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();var Dt={exports:{}},ut={};/** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ws;function Dr(){if(ws)return ut;ws=1;var e=Fr(),t=Symbol.for("react.element"),s=Symbol.for("react.fragment"),n=Object.prototype.hasOwnProperty,i=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(l,d,u){var h,b={},j=null,v=null;u!==void 0&&(j=""+u),d.key!==void 0&&(j=""+d.key),d.ref!==void 0&&(v=d.ref);for(h in d)n.call(d,h)&&!o.hasOwnProperty(h)&&(b[h]=d[h]);if(l&&l.defaultProps)for(h in d=l.defaultProps,d)b[h]===void 0&&(b[h]=d[h]);return{$$typeof:t,type:l,key:j,ref:v,props:b,_owner:i.current}}return ut.Fragment=s,ut.jsx=c,ut.jsxs=c,ut}var js;function qr(){return js||(js=1,Dt.exports=Dr()),Dt.exports}var r=qr(),Rt={},Ns;function Qr(){if(Ns)return Rt;Ns=1;var e=Er();return Rt.createRoot=e.createRoot,Rt.hydrateRoot=e.hydrateRoot,Rt}var $r=Qr();const Ur=Tr($r);var kt=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Te,we,Je,Ks,zr=(Ks=class extends kt{constructor(){super();w(this,Te);w(this,we);w(this,Je);m(this,Je,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){a(this,we)||this.setEventListener(a(this,Je))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,we))==null||t.call(this),m(this,we,void 0))}setEventListener(t){var s;m(this,Je,t),(s=a(this,we))==null||s.call(this),m(this,we,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){a(this,Te)!==t&&(m(this,Te,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(s=>{s(t)})}isFocused(){var t;return typeof a(this,Te)=="boolean"?a(this,Te):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Te=new WeakMap,we=new WeakMap,Je=new WeakMap,Ks),ls=new zr,Kr={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},je,ss,Gs,Gr=(Gs=class{constructor(){w(this,je,Kr);w(this,ss,!1)}setTimeoutProvider(e){m(this,je,e)}setTimeout(e,t){return a(this,je).setTimeout(e,t)}clearTimeout(e){a(this,je).clearTimeout(e)}setInterval(e,t){return a(this,je).setInterval(e,t)}clearInterval(e){a(this,je).clearInterval(e)}},je=new WeakMap,ss=new WeakMap,Gs),Ee=new Gr;function Br(e){setTimeout(e,0)}var Hr=typeof window>"u"||"Deno"in globalThis;function J(){}function Jr(e,t){return typeof e=="function"?e(t):e}function $t(e){return typeof e=="number"&&e>=0&&e!==1/0}function sr(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Pe(e,t){return typeof e=="function"?e(t):e}function X(e,t){return typeof e=="function"?e(t):e}function ks(e,t){const{type:s="all",exact:n,fetchStatus:i,predicate:o,queryKey:c,stale:l}=e;if(c){if(n){if(t.queryHash!==cs(c,t.options))return!1}else if(!gt(t.queryKey,c))return!1}if(s!=="all"){const d=t.isActive();if(s==="active"&&!d||s==="inactive"&&d)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||i&&i!==t.state.fetchStatus||o&&!o(t))}function Cs(e,t){const{exact:s,status:n,predicate:i,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(s){if(xt(t.options.mutationKey)!==xt(o))return!1}else if(!gt(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||i&&!i(t))}function cs(e,t){return((t==null?void 0:t.queryKeyHashFn)||xt)(e)}function xt(e){return JSON.stringify(e,(t,s)=>zt(s)?Object.keys(s).sort().reduce((n,i)=>(n[i]=s[i],n),{}):s)}function gt(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(s=>gt(e[s],t[s])):!1}var Wr=Object.prototype.hasOwnProperty;function rr(e,t,s=0){if(e===t)return e;if(s>500)return t;const n=Ss(e)&&Ss(t);if(!n&&!(zt(e)&&zt(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),l=c.length,d=n?new Array(l):{};let u=0;for(let h=0;h{Ee.setTimeout(t,e)})}function Kt(e,t,s){return typeof s.structuralSharing=="function"?s.structuralSharing(e,t):s.structuralSharing!==!1?rr(e,t):t}function Xr(e,t,s=0){const n=[...e,t];return s&&n.length>s?n.slice(1):n}function Zr(e,t,s=0){const n=[t,...e];return s&&n.length>s?n.slice(0,-1):n}var ds=Symbol();function nr(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===ds?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ir(e,t){return typeof e=="function"?e(...t):!!e}function Yr(e,t,s){let n=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??(i=t()),n||(n=!0,i.aborted?s():i.addEventListener("abort",s,{once:!0})),i)}),e}var bt=(()=>{let e=()=>Hr;return{isServer(){return e()},setIsServer(t){e=t}}})();function Gt(){let e,t;const s=new Promise((i,o)=>{e=i,t=o});s.status="pending",s.catch(()=>{});function n(i){Object.assign(s,i),delete s.resolve,delete s.reject}return s.resolve=i=>{n({status:"fulfilled",value:i}),e(i)},s.reject=i=>{n({status:"rejected",reason:i}),t(i)},s}var en=Br;function tn(){let e=[],t=0,s=l=>{l()},n=l=>{l()},i=en;const o=l=>{t?e.push(l):i(()=>{s(l)})},c=()=>{const l=e;e=[],l.length&&i(()=>{n(()=>{l.forEach(d=>{s(d)})})})};return{batch:l=>{let d;t++;try{d=l()}finally{t--,t||c()}return d},batchCalls:l=>(...d)=>{o(()=>{l(...d)})},schedule:o,setNotifyFunction:l=>{s=l},setBatchNotifyFunction:l=>{n=l},setScheduler:l=>{i=l}}}var q=tn(),We,Ne,Ve,Bs,sn=(Bs=class extends kt{constructor(){super();w(this,We,!0);w(this,Ne);w(this,Ve);m(this,Ve,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",n)}}})}onSubscribe(){a(this,Ne)||this.setEventListener(a(this,Ve))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,Ne))==null||t.call(this),m(this,Ne,void 0))}setEventListener(t){var s;m(this,Ve,t),(s=a(this,Ne))==null||s.call(this),m(this,Ne,t(this.setOnline.bind(this)))}setOnline(t){a(this,We)!==t&&(m(this,We,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return a(this,We)}},We=new WeakMap,Ne=new WeakMap,Ve=new WeakMap,Bs),Ot=new sn;function rn(e){return Math.min(1e3*2**e,3e4)}function ar(e){return(e??"online")==="online"?Ot.isOnline():!0}var Bt=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function or(e){let t=!1,s=0,n;const i=Gt(),o=()=>i.status!=="pending",c=x=>{var g;if(!o()){const f=new Bt(x);j(f),(g=e.onCancel)==null||g.call(e,f)}},l=()=>{t=!0},d=()=>{t=!1},u=()=>ls.isFocused()&&(e.networkMode==="always"||Ot.isOnline())&&e.canRun(),h=()=>ar(e.networkMode)&&e.canRun(),b=x=>{o()||(n==null||n(),i.resolve(x))},j=x=>{o()||(n==null||n(),i.reject(x))},v=()=>new Promise(x=>{var g;n=f=>{(o()||u())&&x(f)},(g=e.onPause)==null||g.call(e)}).then(()=>{var x;n=void 0,o()||(x=e.onContinue)==null||x.call(e)}),p=()=>{if(o())return;let x;const g=s===0?e.initialPromise:void 0;try{x=g??e.fn()}catch(f){x=Promise.reject(f)}Promise.resolve(x).then(b).catch(f=>{var T;if(o())return;const k=e.retry??(bt.isServer()?0:3),R=e.retryDelay??rn,y=typeof R=="function"?R(s,f):R,F=k===!0||typeof k=="number"&&su()?void 0:v()).then(()=>{t?j(f):p()})})};return{promise:i,status:()=>i.status,cancel:c,continue:()=>(n==null||n(),i),cancelRetry:l,continueRetry:d,canStart:h,start:()=>(h()?p():v().then(p),i)}}var Ae,Hs,lr=(Hs=class{constructor(){w(this,Ae)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),$t(this.gcTime)&&m(this,Ae,Ee.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(bt.isServer()?1/0:300*1e3))}clearGcTimeout(){a(this,Ae)!==void 0&&(Ee.clearTimeout(a(this,Ae)),m(this,Ae,void 0))}},Ae=new WeakMap,Hs);function nn(e){return{onFetch:(t,s)=>{var h,b,j,v,p;const n=t.options,i=(j=(b=(h=t.fetchOptions)==null?void 0:h.meta)==null?void 0:b.fetchMore)==null?void 0:j.direction,o=((v=t.state.data)==null?void 0:v.pages)||[],c=((p=t.state.data)==null?void 0:p.pageParams)||[];let l={pages:[],pageParams:[]},d=0;const u=async()=>{let x=!1;const g=R=>{Yr(R,()=>t.signal,()=>x=!0)},f=nr(t.options,t.fetchOptions),k=async(R,y,F)=>{if(x)return Promise.reject(t.signal.reason);if(y==null&&R.pages.length)return Promise.resolve(R);const $=(()=>{const U={client:t.client,queryKey:t.queryKey,pageParam:y,direction:F?"backward":"forward",meta:t.options.meta};return g(U),U})(),_=await f($),{maxPages:M}=t.options,I=F?Zr:Xr;return{pages:I(R.pages,_,M),pageParams:I(R.pageParams,y,M)}};if(i&&o.length){const R=i==="backward",y=R?an:_s,F={pages:o,pageParams:c},T=y(n,F);l=await k(F,T,R)}else{const R=e??o.length;do{const y=d===0?c[0]??n.initialPageParam:_s(n,l);if(d>0&&y==null)break;l=await k(l,y),d++}while(d{var x,g;return(g=(x=t.options).persister)==null?void 0:g.call(x,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},s)}:t.fetchFn=u}}}function _s(e,{pages:t,pageParams:s}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,s[n],s):void 0}function an(e,{pages:t,pageParams:s}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,s[0],s):void 0}var Xe,Ie,Ze,te,Le,L,yt,De,V,cr,he,Js,on=(Js=class extends lr{constructor(t){super();w(this,V);w(this,Xe);w(this,Ie);w(this,Ze);w(this,te);w(this,Le);w(this,L);w(this,yt);w(this,De);m(this,De,!1),m(this,yt,t.defaultOptions),this.setOptions(t.options),this.observers=[],m(this,Le,t.client),m(this,te,a(this,Le).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,m(this,Ie,Ms(this.options)),this.state=t.state??a(this,Ie),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return a(this,Xe)}get promise(){var t;return(t=a(this,L))==null?void 0:t.promise}setOptions(t){if(this.options={...a(this,yt),...t},t!=null&&t._type&&m(this,Xe,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=Ms(this.options);s.data!==void 0&&(this.setState(Ps(s.data,s.dataUpdatedAt)),m(this,Ie,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&a(this,te).remove(this)}setData(t,s){const n=Kt(this.state.data,t,this.options);return C(this,V,he).call(this,{data:n,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),n}setState(t){C(this,V,he).call(this,{type:"setState",state:t})}cancel(t){var n,i;const s=(n=a(this,L))==null?void 0:n.promise;return(i=a(this,L))==null||i.cancel(t),s?s.then(J).catch(J):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return a(this,Ie)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>X(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ds||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Pe(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!sr(this.state.dataUpdatedAt,t)}onFocus(){var s;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,L))==null||s.continue()}onOnline(){var s;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,L))==null||s.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),a(this,te).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(s=>s!==t),this.observers.length||(a(this,L)&&(a(this,De)||C(this,V,cr).call(this)?a(this,L).cancel({revert:!0}):a(this,L).cancelRetry()),this.scheduleGc()),a(this,te).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||C(this,V,he).call(this,{type:"invalidate"})}async fetch(t,s){var u,h,b,j,v,p,x,g,f,k,R;if(this.state.fetchStatus!=="idle"&&((u=a(this,L))==null?void 0:u.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(a(this,L))return a(this,L).continueRetry(),a(this,L).promise}if(t&&this.setOptions(t),!this.options.queryFn){const y=this.observers.find(F=>F.options.queryFn);y&&this.setOptions(y.options)}const n=new AbortController,i=y=>{Object.defineProperty(y,"signal",{enumerable:!0,get:()=>(m(this,De,!0),n.signal)})},o=()=>{const y=nr(this.options,s),T=(()=>{const $={client:a(this,Le),queryKey:this.queryKey,meta:this.meta};return i($),$})();return m(this,De,!1),this.options.persister?this.options.persister(y,T,this):y(T)},l=(()=>{const y={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:a(this,Le),state:this.state,fetchFn:o};return i(y),y})(),d=a(this,Xe)==="infinite"?nn(this.options.pages):this.options.behavior;d==null||d.onFetch(l,this),m(this,Ze,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((h=l.fetchOptions)==null?void 0:h.meta))&&C(this,V,he).call(this,{type:"fetch",meta:(b=l.fetchOptions)==null?void 0:b.meta}),m(this,L,or({initialPromise:s==null?void 0:s.initialPromise,fn:l.fetchFn,onCancel:y=>{y instanceof Bt&&y.revert&&this.setState({...a(this,Ze),fetchStatus:"idle"}),n.abort()},onFail:(y,F)=>{C(this,V,he).call(this,{type:"failed",failureCount:y,error:F})},onPause:()=>{C(this,V,he).call(this,{type:"pause"})},onContinue:()=>{C(this,V,he).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0}));try{const y=await a(this,L).start();if(y===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(y),(v=(j=a(this,te).config).onSuccess)==null||v.call(j,y,this),(x=(p=a(this,te).config).onSettled)==null||x.call(p,y,this.state.error,this),y}catch(y){if(y instanceof Bt){if(y.silent)return a(this,L).promise;if(y.revert){if(this.state.data===void 0)throw y;return this.state.data}}throw C(this,V,he).call(this,{type:"error",error:y}),(f=(g=a(this,te).config).onError)==null||f.call(g,y,this),(R=(k=a(this,te).config).onSettled)==null||R.call(k,this.state.data,y,this),y}finally{this.scheduleGc()}}},Xe=new WeakMap,Ie=new WeakMap,Ze=new WeakMap,te=new WeakMap,Le=new WeakMap,L=new WeakMap,yt=new WeakMap,De=new WeakMap,V=new WeakSet,cr=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},he=function(t){const s=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...dr(n.data,this.options),fetchMeta:t.meta??null};case"success":const i={...n,...Ps(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return m(this,Ze,t.manual?i:void 0),i;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=s(this.state),q.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),a(this,te).notify({query:this,type:"updated",action:t})})},Js);function dr(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:ar(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Ps(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Ms(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,s=t!==void 0,n=s?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:s?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var H,S,vt,B,qe,Ye,fe,ke,wt,et,tt,Qe,$e,Ce,st,O,mt,Ht,Jt,Wt,Vt,Xt,Zt,Yt,ur,Ws,ln=(Ws=class extends kt{constructor(t,s){super();w(this,O);w(this,H);w(this,S);w(this,vt);w(this,B);w(this,qe);w(this,Ye);w(this,fe);w(this,ke);w(this,wt);w(this,et);w(this,tt);w(this,Qe);w(this,$e);w(this,Ce);w(this,st,new Set);this.options=s,m(this,H,t),m(this,ke,null),m(this,fe,Gt()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(a(this,S).addObserver(this),Os(a(this,S),this.options)?C(this,O,mt).call(this):this.updateResult(),C(this,O,Vt).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return es(a(this,S),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return es(a(this,S),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,C(this,O,Xt).call(this),C(this,O,Zt).call(this),a(this,S).removeObserver(this)}setOptions(t){const s=this.options,n=a(this,S);if(this.options=a(this,H).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof X(this.options.enabled,a(this,S))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");C(this,O,Yt).call(this),a(this,S).setOptions(this.options),s._defaulted&&!Ut(this.options,s)&&a(this,H).getQueryCache().notify({type:"observerOptionsUpdated",query:a(this,S),observer:this});const i=this.hasListeners();i&&Fs(a(this,S),n,this.options,s)&&C(this,O,mt).call(this),this.updateResult(),i&&(a(this,S)!==n||X(this.options.enabled,a(this,S))!==X(s.enabled,a(this,S))||Pe(this.options.staleTime,a(this,S))!==Pe(s.staleTime,a(this,S)))&&C(this,O,Ht).call(this);const o=C(this,O,Jt).call(this);i&&(a(this,S)!==n||X(this.options.enabled,a(this,S))!==X(s.enabled,a(this,S))||o!==a(this,Ce))&&C(this,O,Wt).call(this,o)}getOptimisticResult(t){const s=a(this,H).getQueryCache().build(a(this,H),t),n=this.createResult(s,t);return dn(this,n)&&(m(this,B,n),m(this,Ye,this.options),m(this,qe,a(this,S).state)),n}getCurrentResult(){return a(this,B)}trackResult(t,s){return new Proxy(t,{get:(n,i)=>(this.trackProp(i),s==null||s(i),i==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&a(this,fe).status==="pending"&&a(this,fe).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,i))})}trackProp(t){a(this,st).add(t)}getCurrentQuery(){return a(this,S)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=a(this,H).defaultQueryOptions(t),n=a(this,H).getQueryCache().build(a(this,H),s);return n.fetch().then(()=>this.createResult(n,s))}fetch(t){return C(this,O,mt).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),a(this,B)))}createResult(t,s){var M;const n=a(this,S),i=this.options,o=a(this,B),c=a(this,qe),l=a(this,Ye),u=t!==n?t.state:a(this,vt),{state:h}=t;let b={...h},j=!1,v;if(s._optimisticResults){const I=this.hasListeners(),U=!I&&Os(t,s),P=I&&Fs(t,n,s,i);(U||P)&&(b={...b,...dr(h.data,t.options)}),s._optimisticResults==="isRestoring"&&(b.fetchStatus="idle")}let{error:p,errorUpdatedAt:x,status:g}=b;v=b.data;let f=!1;if(s.placeholderData!==void 0&&v===void 0&&g==="pending"){let I;o!=null&&o.isPlaceholderData&&s.placeholderData===(l==null?void 0:l.placeholderData)?(I=o.data,f=!0):I=typeof s.placeholderData=="function"?s.placeholderData((M=a(this,tt))==null?void 0:M.state.data,a(this,tt)):s.placeholderData,I!==void 0&&(g="success",v=Kt(o==null?void 0:o.data,I,s),j=!0)}if(s.select&&v!==void 0&&!f)if(o&&v===(c==null?void 0:c.data)&&s.select===a(this,wt))v=a(this,et);else try{m(this,wt,s.select),v=s.select(v),v=Kt(o==null?void 0:o.data,v,s),m(this,et,v),m(this,ke,null)}catch(I){m(this,ke,I)}a(this,ke)&&(p=a(this,ke),v=a(this,et),x=Date.now(),g="error");const k=b.fetchStatus==="fetching",R=g==="pending",y=g==="error",F=R&&k,T=v!==void 0,_={status:g,fetchStatus:b.fetchStatus,isPending:R,isSuccess:g==="success",isError:y,isInitialLoading:F,isLoading:F,data:v,dataUpdatedAt:b.dataUpdatedAt,error:p,errorUpdatedAt:x,failureCount:b.fetchFailureCount,failureReason:b.fetchFailureReason,errorUpdateCount:b.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:b.dataUpdateCount>u.dataUpdateCount||b.errorUpdateCount>u.errorUpdateCount,isFetching:k,isRefetching:k&&!R,isLoadingError:y&&!T,isPaused:b.fetchStatus==="paused",isPlaceholderData:j,isRefetchError:y&&T,isStale:us(t,s),refetch:this.refetch,promise:a(this,fe),isEnabled:X(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const I=_.data!==void 0,U=_.status==="error"&&!I,P=oe=>{U?oe.reject(_.error):I&&oe.resolve(_.data)},xe=()=>{const oe=m(this,fe,_.promise=Gt());P(oe)},Z=a(this,fe);switch(Z.status){case"pending":t.queryHash===n.queryHash&&P(Z);break;case"fulfilled":(U||_.data!==Z.value)&&xe();break;case"rejected":(!U||_.error!==Z.reason)&&xe();break}}return _}updateResult(){const t=a(this,B),s=this.createResult(a(this,S),this.options);if(m(this,qe,a(this,S).state),m(this,Ye,this.options),a(this,qe).data!==void 0&&m(this,tt,a(this,S)),Ut(s,t))return;m(this,B,s);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:i}=this.options,o=typeof i=="function"?i():i;if(o==="all"||!o&&!a(this,st).size)return!0;const c=new Set(o??a(this,st));return this.options.throwOnError&&c.add("error"),Object.keys(a(this,B)).some(l=>{const d=l;return a(this,B)[d]!==t[d]&&c.has(d)})};C(this,O,ur).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&C(this,O,Vt).call(this)}},H=new WeakMap,S=new WeakMap,vt=new WeakMap,B=new WeakMap,qe=new WeakMap,Ye=new WeakMap,fe=new WeakMap,ke=new WeakMap,wt=new WeakMap,et=new WeakMap,tt=new WeakMap,Qe=new WeakMap,$e=new WeakMap,Ce=new WeakMap,st=new WeakMap,O=new WeakSet,mt=function(t){C(this,O,Yt).call(this);let s=a(this,S).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(J)),s},Ht=function(){C(this,O,Xt).call(this);const t=Pe(this.options.staleTime,a(this,S));if(bt.isServer()||a(this,B).isStale||!$t(t))return;const n=sr(a(this,B).dataUpdatedAt,t)+1;m(this,Qe,Ee.setTimeout(()=>{a(this,B).isStale||this.updateResult()},n))},Jt=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(a(this,S)):this.options.refetchInterval)??!1},Wt=function(t){C(this,O,Zt).call(this),m(this,Ce,t),!(bt.isServer()||X(this.options.enabled,a(this,S))===!1||!$t(a(this,Ce))||a(this,Ce)===0)&&m(this,$e,Ee.setInterval(()=>{(this.options.refetchIntervalInBackground||ls.isFocused())&&C(this,O,mt).call(this)},a(this,Ce)))},Vt=function(){C(this,O,Ht).call(this),C(this,O,Wt).call(this,C(this,O,Jt).call(this))},Xt=function(){a(this,Qe)!==void 0&&(Ee.clearTimeout(a(this,Qe)),m(this,Qe,void 0))},Zt=function(){a(this,$e)!==void 0&&(Ee.clearInterval(a(this,$e)),m(this,$e,void 0))},Yt=function(){const t=a(this,H).getQueryCache().build(a(this,H),this.options);if(t===a(this,S))return;const s=a(this,S);m(this,S,t),m(this,vt,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},ur=function(t){q.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(a(this,B))}),a(this,H).getQueryCache().notify({query:a(this,S),type:"observerResultsUpdated"})})},Ws);function cn(e,t){return X(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&X(t.retryOnMount,e)===!1)}function Os(e,t){return cn(e,t)||e.state.data!==void 0&&es(e,t,t.refetchOnMount)}function es(e,t,s){if(X(t.enabled,e)!==!1&&Pe(t.staleTime,e)!=="static"){const n=typeof s=="function"?s(e):s;return n==="always"||n!==!1&&us(e,t)}return!1}function Fs(e,t,s,n){return(e!==t||X(n.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&us(e,s)}function us(e,t){return X(t.enabled,e)!==!1&&e.isStaleByTime(Pe(t.staleTime,e))}function dn(e,t){return!Ut(e.getCurrentResult(),t)}var jt,le,z,Ue,ce,ve,Vs,un=(Vs=class extends lr{constructor(t){super();w(this,ce);w(this,jt);w(this,le);w(this,z);w(this,Ue);m(this,jt,t.client),this.mutationId=t.mutationId,m(this,z,t.mutationCache),m(this,le,[]),this.state=t.state||hn(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){a(this,le).includes(t)||(a(this,le).push(t),this.clearGcTimeout(),a(this,z).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){m(this,le,a(this,le).filter(s=>s!==t)),this.scheduleGc(),a(this,z).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){a(this,le).length||(this.state.status==="pending"?this.scheduleGc():a(this,z).remove(this))}continue(){var t;return((t=a(this,Ue))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,l,d,u,h,b,j,v,p,x,g,f,k,R,y,F,T,$;const s=()=>{C(this,ce,ve).call(this,{type:"continue"})},n={client:a(this,jt),meta:this.options.meta,mutationKey:this.options.mutationKey};m(this,Ue,or({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(_,M)=>{C(this,ce,ve).call(this,{type:"failed",failureCount:_,error:M})},onPause:()=>{C(this,ce,ve).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>a(this,z).canRun(this)}));const i=this.state.status==="pending",o=!a(this,Ue).canStart();try{if(i)s();else{C(this,ce,ve).call(this,{type:"pending",variables:t,isPaused:o}),a(this,z).config.onMutate&&await a(this,z).config.onMutate(t,this,n);const M=await((l=(c=this.options).onMutate)==null?void 0:l.call(c,t,n));M!==this.state.context&&C(this,ce,ve).call(this,{type:"pending",context:M,variables:t,isPaused:o})}const _=await a(this,Ue).start();return await((u=(d=a(this,z).config).onSuccess)==null?void 0:u.call(d,_,t,this.state.context,this,n)),await((b=(h=this.options).onSuccess)==null?void 0:b.call(h,_,t,this.state.context,n)),await((v=(j=a(this,z).config).onSettled)==null?void 0:v.call(j,_,null,this.state.variables,this.state.context,this,n)),await((x=(p=this.options).onSettled)==null?void 0:x.call(p,_,null,t,this.state.context,n)),C(this,ce,ve).call(this,{type:"success",data:_}),_}catch(_){try{await((f=(g=a(this,z).config).onError)==null?void 0:f.call(g,_,t,this.state.context,this,n))}catch(M){Promise.reject(M)}try{await((R=(k=this.options).onError)==null?void 0:R.call(k,_,t,this.state.context,n))}catch(M){Promise.reject(M)}try{await((F=(y=a(this,z).config).onSettled)==null?void 0:F.call(y,void 0,_,this.state.variables,this.state.context,this,n))}catch(M){Promise.reject(M)}try{await(($=(T=this.options).onSettled)==null?void 0:$.call(T,void 0,_,t,this.state.context,n))}catch(M){Promise.reject(M)}throw C(this,ce,ve).call(this,{type:"error",error:_}),_}finally{a(this,z).runNext(this)}}},jt=new WeakMap,le=new WeakMap,z=new WeakMap,Ue=new WeakMap,ce=new WeakSet,ve=function(t){const s=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=s(this.state),q.batch(()=>{a(this,le).forEach(n=>{n.onMutationUpdate(t)}),a(this,z).notify({mutation:this,type:"updated",action:t})})},Vs);function hn(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var me,ne,Nt,Xs,fn=(Xs=class extends kt{constructor(t={}){super();w(this,me);w(this,ne);w(this,Nt);this.config=t,m(this,me,new Set),m(this,ne,new Map),m(this,Nt,0)}build(t,s,n){const i=new un({client:t,mutationCache:this,mutationId:++St(this,Nt)._,options:t.defaultMutationOptions(s),state:n});return this.add(i),i}add(t){a(this,me).add(t);const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s);n?n.push(t):a(this,ne).set(s,[t])}this.notify({type:"added",mutation:t})}remove(t){if(a(this,me).delete(t)){const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s);if(n)if(n.length>1){const i=n.indexOf(t);i!==-1&&n.splice(i,1)}else n[0]===t&&a(this,ne).delete(s)}}this.notify({type:"removed",mutation:t})}canRun(t){const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s),i=n==null?void 0:n.find(o=>o.state.status==="pending");return!i||i===t}else return!0}runNext(t){var n;const s=_t(t);if(typeof s=="string"){const i=(n=a(this,ne).get(s))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(i==null?void 0:i.continue())??Promise.resolve()}else return Promise.resolve()}clear(){q.batch(()=>{a(this,me).forEach(t=>{this.notify({type:"removed",mutation:t})}),a(this,me).clear(),a(this,ne).clear()})}getAll(){return Array.from(a(this,me))}find(t){const s={exact:!0,...t};return this.getAll().find(n=>Cs(s,n))}findAll(t={}){return this.getAll().filter(s=>Cs(t,s))}notify(t){q.batch(()=>{this.listeners.forEach(s=>{s(t)})})}resumePausedMutations(){const t=this.getAll().filter(s=>s.state.isPaused);return q.batch(()=>Promise.all(t.map(s=>s.continue().catch(J))))}},me=new WeakMap,ne=new WeakMap,Nt=new WeakMap,Xs);function _t(e){var t;return(t=e.options.scope)==null?void 0:t.id}var de,Zs,mn=(Zs=class extends kt{constructor(t={}){super();w(this,de);this.config=t,m(this,de,new Map)}build(t,s,n){const i=s.queryKey,o=s.queryHash??cs(i,s);let c=this.get(o);return c||(c=new on({client:t,queryKey:i,queryHash:o,options:t.defaultQueryOptions(s),state:n,defaultOptions:t.getQueryDefaults(i)}),this.add(c)),c}add(t){a(this,de).has(t.queryHash)||(a(this,de).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const s=a(this,de).get(t.queryHash);s&&(t.destroy(),s===t&&a(this,de).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){q.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return a(this,de).get(t)}getAll(){return[...a(this,de).values()]}find(t){const s={exact:!0,...t};return this.getAll().find(n=>ks(s,n))}findAll(t={}){const s=this.getAll();return Object.keys(t).length>0?s.filter(n=>ks(t,n)):s}notify(t){q.batch(()=>{this.listeners.forEach(s=>{s(t)})})}onFocus(){q.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){q.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},de=new WeakMap,Zs),A,Se,Re,rt,nt,_e,it,at,Ys,pn=(Ys=class{constructor(e={}){w(this,A);w(this,Se);w(this,Re);w(this,rt);w(this,nt);w(this,_e);w(this,it);w(this,at);m(this,A,e.queryCache||new mn),m(this,Se,e.mutationCache||new fn),m(this,Re,e.defaultOptions||{}),m(this,rt,new Map),m(this,nt,new Map),m(this,_e,0)}mount(){St(this,_e)._++,a(this,_e)===1&&(m(this,it,ls.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,A).onFocus())})),m(this,at,Ot.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,A).onOnline())})))}unmount(){var e,t;St(this,_e)._--,a(this,_e)===0&&((e=a(this,it))==null||e.call(this),m(this,it,void 0),(t=a(this,at))==null||t.call(this),m(this,at,void 0))}isFetching(e){return a(this,A).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return a(this,Se).findAll({...e,status:"pending"}).length}getQueryData(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,A).get(t.queryHash))==null?void 0:s.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),s=a(this,A).build(this,t),n=s.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime(Pe(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return a(this,A).findAll(e).map(({queryKey:t,state:s})=>{const n=s.data;return[t,n]})}setQueryData(e,t,s){const n=this.defaultQueryOptions({queryKey:e}),i=a(this,A).get(n.queryHash),o=i==null?void 0:i.state.data,c=Jr(t,o);if(c!==void 0)return a(this,A).build(this,n).setData(c,{...s,manual:!0})}setQueriesData(e,t,s){return q.batch(()=>a(this,A).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,s)]))}getQueryState(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,A).get(t.queryHash))==null?void 0:s.state}removeQueries(e){const t=a(this,A);q.batch(()=>{t.findAll(e).forEach(s=>{t.remove(s)})})}resetQueries(e,t){const s=a(this,A);return q.batch(()=>(s.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const s={revert:!0,...t},n=q.batch(()=>a(this,A).findAll(e).map(i=>i.cancel(s)));return Promise.all(n).then(J).catch(J)}invalidateQueries(e,t={}){return q.batch(()=>(a(this,A).findAll(e).forEach(s=>{s.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const s={...t,cancelRefetch:t.cancelRefetch??!0},n=q.batch(()=>a(this,A).findAll(e).filter(i=>!i.isDisabled()&&!i.isStatic()).map(i=>{let o=i.fetch(void 0,s);return s.throwOnError||(o=o.catch(J)),i.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(J)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const s=a(this,A).build(this,t);return s.isStaleByTime(Pe(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(J).catch(J)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(J).catch(J)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Ot.isOnline()?a(this,Se).resumePausedMutations():Promise.resolve()}getQueryCache(){return a(this,A)}getMutationCache(){return a(this,Se)}getDefaultOptions(){return a(this,Re)}setDefaultOptions(e){m(this,Re,e)}setQueryDefaults(e,t){a(this,rt).set(xt(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...a(this,rt).values()],s={};return t.forEach(n=>{gt(e,n.queryKey)&&Object.assign(s,n.defaultOptions)}),s}setMutationDefaults(e,t){a(this,nt).set(xt(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...a(this,nt).values()],s={};return t.forEach(n=>{gt(e,n.mutationKey)&&Object.assign(s,n.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;const t={...a(this,Re).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=cs(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===ds&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...a(this,Re).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){a(this,A).clear(),a(this,Se).clear()}},A=new WeakMap,Se=new WeakMap,Re=new WeakMap,rt=new WeakMap,nt=new WeakMap,_e=new WeakMap,it=new WeakMap,at=new WeakMap,Ys),hr=Q.createContext(void 0),fr=e=>{const t=Q.useContext(hr);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},xn=({client:e,children:t})=>(Q.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),r.jsx(hr.Provider,{value:e,children:t})),mr=Q.createContext(!1),gn=()=>Q.useContext(mr);mr.Provider;function bn(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var yn=Q.createContext(bn()),vn=()=>Q.useContext(yn),wn=(e,t,s)=>{const n=s!=null&&s.state.error&&typeof e.throwOnError=="function"?ir(e.throwOnError,[s.state.error,s]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},jn=e=>{Q.useEffect(()=>{e.clearReset()},[e])},Nn=({result:e,errorResetBoundary:t,throwOnError:s,query:n,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(i&&e.data===void 0||ir(s,[e.error,n])),kn=e=>{if(e.suspense){const s=i=>i==="static"?i:Math.max(i??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...i)=>s(n(...i)):s(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Cn=(e,t)=>e.isLoading&&e.isFetching&&!t,Sn=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Es=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function Rn(e,t,s){var j,v,p,x;const n=gn(),i=vn(),o=fr(),c=o.defaultQueryOptions(e);(v=(j=o.getDefaultOptions().queries)==null?void 0:j._experimental_beforeQuery)==null||v.call(j,c);const l=o.getQueryCache().get(c.queryHash);c._optimisticResults=n?"isRestoring":"optimistic",kn(c),wn(c,i,l),jn(i);const d=!o.getQueryCache().get(c.queryHash),[u]=Q.useState(()=>new t(o,c)),h=u.getOptimisticResult(c),b=!n&&e.subscribed!==!1;if(Q.useSyncExternalStore(Q.useCallback(g=>{const f=b?u.subscribe(q.batchCalls(g)):J;return u.updateResult(),f},[u,b]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),Q.useEffect(()=>{u.setOptions(c)},[c,u]),Sn(c,h))throw Es(c,u,i);if(Nn({result:h,errorResetBoundary:i,throwOnError:c.throwOnError,query:l,suspense:c.suspense}))throw h.error;if((x=(p=o.getDefaultOptions().queries)==null?void 0:p._experimental_afterQuery)==null||x.call(p,c,h),c.experimental_prefetchInRender&&!bt.isServer()&&Cn(h,n)){const g=d?Es(c,u,i):l==null?void 0:l.promise;g==null||g.catch(J).finally(()=>{u.updateResult()})}return c.notifyOnChangeProps?h:u.trackResult(h)}function se(e,t){return Rn(e,ln)}/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _n=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),pr=(...e)=>e.filter((t,s,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===s).join(" ").trim();/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var Pn={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mn=Q.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:s=2,absoluteStrokeWidth:n,className:i="",children:o,iconNode:c,...l},d)=>Q.createElement("svg",{ref:d,...Pn,width:t,height:t,stroke:e,strokeWidth:n?Number(s)*24/Number(t):s,className:pr("lucide",i),...l},[...c.map(([u,h])=>Q.createElement(u,h)),...Array.isArray(o)?o:[o]]));/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const G=(e,t)=>{const s=Q.forwardRef(({className:n,...i},o)=>Q.createElement(Mn,{ref:o,iconNode:t,className:pr(`lucide-${_n(e)}`,n),...i}));return s.displayName=`${e}`,s};/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const On=G("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fn=G("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xr=G("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const En=G("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ft=G("CircleUserRound",[["path",{d:"M18 20a6 6 0 0 0-12 0",key:"1qehca"}],["circle",{cx:"12",cy:"10",r:"4",key:"1h16sb"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tn=G("Clock3",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16.5 12",key:"1aq6pp"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ts=G("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gr=G("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const An=G("Filter",[["polygon",{points:"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3",key:"1yg77f"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const In=G("Link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ln=G("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Dn=G("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qn=G("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qn=G("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const br=G("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $n=G("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),hs="-",Un=e=>{const t=Kn(e),{conflictingClassGroups:s,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const l=c.split(hs);return l[0]===""&&l.length!==1&&l.shift(),yr(l,t)||zn(c)},getConflictingClassGroupIds:(c,l)=>{const d=s[c]||[];return l&&n[c]?[...d,...n[c]]:d}}},yr=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const s=e[0],n=t.nextPart.get(s),i=n?yr(e.slice(1),n):void 0;if(i)return i;if(t.validators.length===0)return;const o=e.join(hs);return(c=t.validators.find(({validator:l})=>l(o)))==null?void 0:c.classGroupId},As=/^\[(.+)\]$/,zn=e=>{if(As.test(e)){const t=As.exec(e)[1],s=t==null?void 0:t.substring(0,t.indexOf(":"));if(s)return"arbitrary.."+s}},Kn=e=>{const{theme:t,prefix:s}=e,n={nextPart:new Map,validators:[]};return Bn(Object.entries(e.classGroups),s).forEach(([o,c])=>{ts(c,n,o,t)}),n},ts=(e,t,s,n)=>{e.forEach(i=>{if(typeof i=="string"){const o=i===""?t:Is(t,i);o.classGroupId=s;return}if(typeof i=="function"){if(Gn(i)){ts(i(n),t,s,n);return}t.validators.push({validator:i,classGroupId:s});return}Object.entries(i).forEach(([o,c])=>{ts(c,Is(t,o),s,n)})})},Is=(e,t)=>{let s=e;return t.split(hs).forEach(n=>{s.nextPart.has(n)||s.nextPart.set(n,{nextPart:new Map,validators:[]}),s=s.nextPart.get(n)}),s},Gn=e=>e.isThemeGetter,Bn=(e,t)=>t?e.map(([s,n])=>{const i=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,l])=>[t+c,l])):o);return[s,i]}):e,Hn=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,s=new Map,n=new Map;const i=(o,c)=>{s.set(o,c),t++,t>e&&(t=0,n=s,s=new Map)};return{get(o){let c=s.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return i(o,c),c},set(o,c){s.has(o)?s.set(o,c):i(o,c)}}},vr="!",Jn=e=>{const{separator:t,experimentalParseClassName:s}=e,n=t.length===1,i=t[0],o=t.length,c=l=>{const d=[];let u=0,h=0,b;for(let g=0;gh?b-h:void 0;return{modifiers:d,hasImportantModifier:v,baseClassName:p,maybePostfixModifierPosition:x}};return s?l=>s({className:l,parseClassName:c}):c},Wn=e=>{if(e.length<=1)return e;const t=[];let s=[];return e.forEach(n=>{n[0]==="["?(t.push(...s.sort(),n),s=[]):s.push(n)}),t.push(...s.sort()),t},Vn=e=>({cache:Hn(e.cacheSize),parseClassName:Jn(e),...Un(e)}),Xn=/\s+/,Zn=(e,t)=>{const{parseClassName:s,getClassGroupId:n,getConflictingClassGroupIds:i}=t,o=[],c=e.trim().split(Xn);let l="";for(let d=c.length-1;d>=0;d-=1){const u=c[d],{modifiers:h,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:v}=s(u);let p=!!v,x=n(p?j.substring(0,v):j);if(!x){if(!p){l=u+(l.length>0?" "+l:l);continue}if(x=n(j),!x){l=u+(l.length>0?" "+l:l);continue}p=!1}const g=Wn(h).join(":"),f=b?g+vr:g,k=f+x;if(o.includes(k))continue;o.push(k);const R=i(x,p);for(let y=0;y0?" "+l:l)}return l};function Yn(){let e=0,t,s,n="";for(;e{if(typeof e=="string")return e;let t,s="";for(let n=0;nb(h),e());return s=Vn(u),n=s.cache.get,i=s.cache.set,o=l,l(d)}function l(d){const u=n(d);if(u)return u;const h=Zn(d,s);return i(d,h),h}return function(){return o(Yn.apply(null,arguments))}}const E=e=>{const t=s=>s[e]||[];return t.isThemeGetter=!0,t},jr=/^\[(?:([a-z-]+):)?(.+)\]$/i,ti=/^\d+\/\d+$/,si=new Set(["px","full","screen"]),ri=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,ni=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,ii=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ai=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,oi=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ue=e=>He(e)||si.has(e)||ti.test(e),be=e=>lt(e,"length",pi),He=e=>!!e&&!Number.isNaN(Number(e)),qt=e=>lt(e,"number",He),ht=e=>!!e&&Number.isInteger(Number(e)),li=e=>e.endsWith("%")&&He(e.slice(0,-1)),N=e=>jr.test(e),ye=e=>ri.test(e),ci=new Set(["length","size","percentage"]),di=e=>lt(e,ci,Nr),ui=e=>lt(e,"position",Nr),hi=new Set(["image","url"]),fi=e=>lt(e,hi,gi),mi=e=>lt(e,"",xi),ft=()=>!0,lt=(e,t,s)=>{const n=jr.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):s(n[2]):!1},pi=e=>ni.test(e)&&!ii.test(e),Nr=()=>!1,xi=e=>ai.test(e),gi=e=>oi.test(e),bi=()=>{const e=E("colors"),t=E("spacing"),s=E("blur"),n=E("brightness"),i=E("borderColor"),o=E("borderRadius"),c=E("borderSpacing"),l=E("borderWidth"),d=E("contrast"),u=E("grayscale"),h=E("hueRotate"),b=E("invert"),j=E("gap"),v=E("gradientColorStops"),p=E("gradientColorStopPositions"),x=E("inset"),g=E("margin"),f=E("opacity"),k=E("padding"),R=E("saturate"),y=E("scale"),F=E("sepia"),T=E("skew"),$=E("space"),_=E("translate"),M=()=>["auto","contain","none"],I=()=>["auto","hidden","clip","visible","scroll"],U=()=>["auto",N,t],P=()=>[N,t],xe=()=>["",ue,be],Z=()=>["auto",He,N],oe=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Me=()=>["solid","dashed","dotted","double","none"],ct=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ze=()=>["start","end","center","between","around","evenly","stretch"],ge=()=>["","0",N],dt=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Y=()=>[He,N];return{cacheSize:500,separator:":",theme:{colors:[ft],spacing:[ue,be],blur:["none","",ye,N],brightness:Y(),borderColor:[e],borderRadius:["none","","full",ye,N],borderSpacing:P(),borderWidth:xe(),contrast:Y(),grayscale:ge(),hueRotate:Y(),invert:ge(),gap:P(),gradientColorStops:[e],gradientColorStopPositions:[li,be],inset:U(),margin:U(),opacity:Y(),padding:P(),saturate:Y(),scale:Y(),sepia:ge(),skew:Y(),space:P(),translate:P()},classGroups:{aspect:[{aspect:["auto","square","video",N]}],container:["container"],columns:[{columns:[ye]}],"break-after":[{"break-after":dt()}],"break-before":[{"break-before":dt()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...oe(),N]}],overflow:[{overflow:I()}],"overflow-x":[{"overflow-x":I()}],"overflow-y":[{"overflow-y":I()}],overscroll:[{overscroll:M()}],"overscroll-x":[{"overscroll-x":M()}],"overscroll-y":[{"overscroll-y":M()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[x]}],"inset-x":[{"inset-x":[x]}],"inset-y":[{"inset-y":[x]}],start:[{start:[x]}],end:[{end:[x]}],top:[{top:[x]}],right:[{right:[x]}],bottom:[{bottom:[x]}],left:[{left:[x]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ht,N]}],basis:[{basis:U()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",N]}],grow:[{grow:ge()}],shrink:[{shrink:ge()}],order:[{order:["first","last","none",ht,N]}],"grid-cols":[{"grid-cols":[ft]}],"col-start-end":[{col:["auto",{span:["full",ht,N]},N]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[ft]}],"row-start-end":[{row:["auto",{span:[ht,N]},N]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",N]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",N]}],gap:[{gap:[j]}],"gap-x":[{"gap-x":[j]}],"gap-y":[{"gap-y":[j]}],"justify-content":[{justify:["normal",...ze()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...ze(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...ze(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[g]}],mx:[{mx:[g]}],my:[{my:[g]}],ms:[{ms:[g]}],me:[{me:[g]}],mt:[{mt:[g]}],mr:[{mr:[g]}],mb:[{mb:[g]}],ml:[{ml:[g]}],"space-x":[{"space-x":[$]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[$]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",N,t]}],"min-w":[{"min-w":[N,t,"min","max","fit"]}],"max-w":[{"max-w":[N,t,"none","full","min","max","fit","prose",{screen:[ye]},ye]}],h:[{h:[N,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[N,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ye,be]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",qt]}],"font-family":[{font:[ft]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",N]}],"line-clamp":[{"line-clamp":["none",He,qt]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ue,N]}],"list-image":[{"list-image":["none",N]}],"list-style-type":[{list:["none","disc","decimal",N]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[f]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Me(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ue,be]}],"underline-offset":[{"underline-offset":["auto",ue,N]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:P()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",N]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",N]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[f]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...oe(),ui]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",di]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},fi]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[p]}],"gradient-via-pos":[{via:[p]}],"gradient-to-pos":[{to:[p]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[f]}],"border-style":[{border:[...Me(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[f]}],"divide-style":[{divide:Me()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...Me()]}],"outline-offset":[{"outline-offset":[ue,N]}],"outline-w":[{outline:[ue,be]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:xe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[f]}],"ring-offset-w":[{"ring-offset":[ue,be]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ye,mi]}],"shadow-color":[{shadow:[ft]}],opacity:[{opacity:[f]}],"mix-blend":[{"mix-blend":[...ct(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":ct()}],filter:[{filter:["","none"]}],blur:[{blur:[s]}],brightness:[{brightness:[n]}],contrast:[{contrast:[d]}],"drop-shadow":[{"drop-shadow":["","none",ye,N]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[h]}],invert:[{invert:[b]}],saturate:[{saturate:[R]}],sepia:[{sepia:[F]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[s]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[d]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[h]}],"backdrop-invert":[{"backdrop-invert":[b]}],"backdrop-opacity":[{"backdrop-opacity":[f]}],"backdrop-saturate":[{"backdrop-saturate":[R]}],"backdrop-sepia":[{"backdrop-sepia":[F]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",N]}],duration:[{duration:Y()}],ease:[{ease:["linear","in","out","in-out",N]}],delay:[{delay:Y()}],animate:[{animate:["none","spin","ping","pulse","bounce",N]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[y]}],"scale-x":[{"scale-x":[y]}],"scale-y":[{"scale-y":[y]}],rotate:[{rotate:[ht,N]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[T]}],"skew-y":[{"skew-y":[T]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",N]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",N]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":P()}],"scroll-mx":[{"scroll-mx":P()}],"scroll-my":[{"scroll-my":P()}],"scroll-ms":[{"scroll-ms":P()}],"scroll-me":[{"scroll-me":P()}],"scroll-mt":[{"scroll-mt":P()}],"scroll-mr":[{"scroll-mr":P()}],"scroll-mb":[{"scroll-mb":P()}],"scroll-ml":[{"scroll-ml":P()}],"scroll-p":[{"scroll-p":P()}],"scroll-px":[{"scroll-px":P()}],"scroll-py":[{"scroll-py":P()}],"scroll-ps":[{"scroll-ps":P()}],"scroll-pe":[{"scroll-pe":P()}],"scroll-pt":[{"scroll-pt":P()}],"scroll-pr":[{"scroll-pr":P()}],"scroll-pb":[{"scroll-pb":P()}],"scroll-pl":[{"scroll-pl":P()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",N]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ue,be,qt]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},yi=ei(bi),vi=new pn({defaultOptions:{queries:{retry:1}}}),Ls=12,wi=12,ji=10080*60*1e3,Ni=1e3;function ie(...e){return yi(Lr(e))}async function re(e){const t=await fetch(e,{headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`${t.status} ${t.statusText}`);return t.json()}function ae(e){if(e==null)return"n/a";const t=Math.max(0,Math.floor(e));if(t<60)return`${t}s`;const s=Math.floor(t/60);return s<60?`${s}m ${t%60}s`:`${Math.floor(s/60)}h ${s%60}m`}const ki=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}),Ci=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});function Ct(e){if(!e)return null;const t=new Date(e);return Number.isNaN(t.getTime())?null:t}function Si(e){const t=Ct(e);return t?ki.format(t):e??""}function pt(e){const t=Ct(e);return t?Ci.format(t):e??""}function kr(e,t){const s=Ct(e);if(!s)return e??"";const n=t-s.getTime(),i=Math.abs(n);if(i>ji)return pt(e);const o=n>=0?"ago":"from now",c=Math.round(i/1e3);if(c<45)return n>=0?"just now":"soon";if(c<90)return`1m ${o}`;const l=Math.round(c/60);if(l<60)return`${l}m ${o}`;if(l<90)return`1h ${o}`;const d=Math.round(l/60);return d<24?`${d}h ${o}`:d<36?`1d ${o}`:`${Math.round(d/24)}d ${o}`}function pe({value:e,compact:t=!1,relative:s=!1,now:n=Date.now()}){const i=Ct(e);return i?r.jsx("time",{dateTime:i.toISOString(),title:`UTC: ${i.toISOString()}`,children:s?kr(e,n):t?pt(e):Si(e)}):r.jsx(r.Fragment,{children:e??""})}function Cr(e,t){const s=Ct(e);return s?Math.max(0,Math.floor((t-s.getTime())/1e3)):null}function fs(e,t){return e.status==="running"?Cr(e.started_at,t)??e.runtime_seconds:e.runtime_seconds}function ms(e,t){return e.status==="pending"?Cr(e.created_at,t)??e.queue_wait_seconds:e.queue_wait_seconds}function Ri(e){const[t,s]=W.useState(()=>Date.now());return W.useEffect(()=>{if(!e)return;s(Date.now());const n=window.setInterval(()=>s(Date.now()),Ni);return()=>window.clearInterval(n)},[e]),t}function _i(e){return(e??"").split(/\r?\n/).map(s=>s.trim()).find(Boolean)??""}function Et(e,t,s=1){const n=_i(t),i=s>1?` (${s})`:"";return n?`${e}${i}: ${n}`:`${e}${i}`}function Tt(e){return e==="openclaw_stdout"||e==="openclaw_stderr"}function Sr(e){return e.map(t=>t==null?void 0:t.trim()).filter(Boolean).join(` +`)}function Pi(e){const t=[];for(const s of e){const n=t[t.length-1];if(n&&Tt(s.event_type)&&n.eventType===s.event_type){n.count+=1,n.meta=s.ts,n.detail=Sr([n.detail,s.detail]),n.summary=Et(s.summary,n.detail,n.count);continue}t.push({id:String(s.id),badge:s.event_type,meta:s.ts,summary:Tt(s.event_type)?Et(s.summary,s.detail):s.summary,detail:s.detail,eventType:s.event_type,count:1})}return t}function Mi(e){const t=[];return e.forEach((s,n)=>{const i=t[t.length-1];if(i&&Tt(s.kind)&&i.kind===s.kind){i.count+=1,i.meta=s.timestamp,i.text=Sr([i.text,s.text]),i.summary=Et(`${s.role} · ${s.kind}`,i.text,i.count);return}t.push({id:`${s.timestamp??"entry"}-${n}`,badge:s.title,meta:s.timestamp,summary:Tt(s.kind)?Et(`${s.role} · ${s.kind}`,s.text):`${s.role} · ${s.kind}`,text:s.text,kind:s.kind,count:1})}),t}function Ds(e,t,s,n){return e==="openclaw_stdout"?!1:t||s>=n-2}function Oi(e){return{pending:{badge:"border-amber-300 bg-amber-50 text-amber-800",dot:"bg-amber-500"},running:{badge:"border-blue-300 bg-blue-50 text-blue-700",dot:"bg-blue-600"},blocked:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},denied:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},done:{badge:"border-emerald-300 bg-emerald-50 text-emerald-700",dot:"bg-emerald-600"},waiting_approval:{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}[e]??{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}function Fi(e,t){const s=new URLSearchParams;for(const[n,i]of Object.entries(e))i.trim()&&s.set(n,i.trim());return s.set("limit",String(t)),`/api/jobs?${s.toString()}`}function ot(e){try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:"#"}catch{return"#"}}function Rr(e){return`/jobs/${e}`}function qs(e){try{return JSON.parse(e.data)}catch{return null}}function Ei(e,t){return e.some(s=>s.id===t.id)?e:[...e,t]}function Ti(e,t){const s=Qs(t);return e.some(n=>Qs(n)===s)?e:[...e,t]}function Qs(e){return`${e.timestamp??""}:${e.role}:${e.kind}:${e.title}:${e.text}`}function Ai(e=window.location.pathname){const t=e.match(/^\/jobs\/(\d+)\/?$/);return t?Number(t[1]):null}function Ii(){var xe,Z,oe,Me,ct,ze,ge,dt,Y,gs,bs,ys;const e=fr(),[t,s]=W.useState({status:"",repo:"",thread:"",action:"",intent:"",actor:""}),[n,i]=W.useState(Ls),[o,c]=W.useState(()=>window.location.pathname),l=Ai(o),d=l!==null,u=l,h=se({queryKey:["metrics"],queryFn:()=>re("/api/metrics/summary"),enabled:!d}),b=se({queryKey:["me"],queryFn:()=>re("/api/me"),refetchInterval:!1}),j=se({queryKey:["about"],queryFn:()=>re("/api/about")}),v=se({queryKey:["job-actors"],queryFn:()=>re("/api/jobs/actors"),enabled:!d}),p=se({queryKey:["jobs",t,n],queryFn:()=>re(Fi(t,n)),enabled:!d}),x=se({queryKey:["processes"],queryFn:()=>re("/api/processes"),enabled:!d}),g=se({queryKey:["alerts"],queryFn:()=>re("/api/alerts"),enabled:!d}),f=se({queryKey:["job",u],queryFn:()=>re(`/api/jobs/${u}`),enabled:u!==null}),k=se({queryKey:["job-session",u],queryFn:()=>re(`/api/jobs/${u}/session`),enabled:u!==null}),R=se({queryKey:["job-session-events",u],queryFn:()=>re(`/api/jobs/${u}/session/events`),enabled:u!==null}),y=se({queryKey:["job-session-transcript",u],queryFn:()=>re(`/api/jobs/${u}/session/transcript`),enabled:u!==null});W.useEffect(()=>{if(u===null)return;const D=new EventSource(`/api/jobs/${u}/session/stream`);return D.addEventListener("session_event",It=>{const Ke=qs(It);Ke&&(e.setQueryData(["job-session-events",u],Oe=>({events:Ei((Oe==null?void 0:Oe.events)??[],Ke)})),e.invalidateQueries({queryKey:["job",u]}),e.invalidateQueries({queryKey:["jobs"]}))}),D.addEventListener("transcript_entry",It=>{const Ke=qs(It);!Ke||Ke.job_id!==u||e.setQueryData(["job-session-transcript",u],Oe=>({entries:Ti((Oe==null?void 0:Oe.entries)??[],Ke.entry)}))}),D.onerror=()=>{D.close()},()=>D.close()},[u,e]),W.useEffect(()=>{const D=()=>{c(window.location.pathname)};return window.addEventListener("popstate",D),()=>window.removeEventListener("popstate",D)},[]);const F=W.useCallback(D=>{window.history.pushState({},"",Rr(D)),c(window.location.pathname)},[]),T=((xe=h.data)==null?void 0:xe.metrics.status_counts)??{},$=((Z=p.data)==null?void 0:Z.jobs)??[],_=W.useCallback(D=>{s(D),i(Ls)},[]),M=u?((oe=f.data)==null?void 0:oe.job)??null:null,I=$.some(D=>D.status==="running"||D.status==="pending")||(M==null?void 0:M.status)==="running"||(M==null?void 0:M.status)==="pending",U=Ri(I),P=r.jsx(qi,{selectedJobId:u,selectedJob:M,loading:f.isLoading,error:f.error,session:(Me=k.data)==null?void 0:Me.session,sessionEvents:(ct=R.data)==null?void 0:ct.events,transcript:(ze=y.data)==null?void 0:ze.entries,now:U});return r.jsxs("div",{className:"min-h-screen bg-background text-foreground",children:[r.jsx("header",{className:"border-b border-slate-800 bg-slate-950 text-white",children:r.jsxs("div",{className:"mx-auto flex w-full max-w-[1440px] items-center justify-between gap-3 px-4 py-4 md:px-6",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsx("h1",{className:"truncate text-xl font-semibold",children:"GitHub Agent Bridge"}),r.jsx(Li,{about:j.data})]}),r.jsx(Qi,{user:(ge=b.data)==null?void 0:ge.user,loading:b.isLoading})]})}),r.jsx("main",{className:"mx-auto grid w-full max-w-[1440px] gap-4 px-3 py-4 sm:px-4 md:px-6 md:py-5",children:l!==null?r.jsx(Di,{jobId:l,detail:P,onRefresh:()=>{f.refetch(),k.refetch(),R.refetch(),y.refetch()}}):r.jsxs(r.Fragment,{children:[h.error?r.jsx(Be,{tone:"error",text:h.error.message}):null,r.jsxs("section",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Summary metrics",children:[r.jsx(Pt,{title:"Pending",value:T.pending??0,icon:r.jsx(Tn,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Running",value:T.running??0,icon:r.jsx(On,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Blocked",value:T.blocked??0,icon:r.jsx(br,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Done",value:T.done??0,icon:r.jsx(En,{className:"h-5 w-5"})})]}),r.jsxs("section",{className:"grid gap-3",children:[r.jsx($i,{count:$.length,limit:n,loading:p.isLoading,onRefresh:()=>p.refetch()}),r.jsxs(Fe,{title:"Recent jobs",flushHeader:!0,children:[r.jsx(Ui,{filters:t,actorOptions:((dt=v.data)==null?void 0:dt.actors)??[],onChange:_}),p.error?r.jsx(Be,{tone:"error",text:p.error.message}):null,r.jsx(Ki,{jobs:$,loading:p.isLoading,onViewJob:F,now:U}),$.length>=n?r.jsx("div",{className:"mt-3 flex justify-center",children:r.jsx("button",{className:"inline-flex h-9 items-center justify-center rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:()=>i(D=>D+wi),children:"Load more jobs"})}):null]})]}),r.jsxs("section",{className:"grid gap-4",children:[r.jsxs(Fe,{title:"Process activity",action:r.jsx(At,{onClick:()=>x.refetch()}),children:[x.error?r.jsx(Be,{tone:"error",text:x.error.message}):null,r.jsx(Xi,{data:x.data,loading:x.isLoading})]}),r.jsxs(Fe,{title:"Monitor alerts",action:r.jsx(At,{onClick:()=>g.refetch()}),children:[g.error?r.jsx(Be,{tone:"error",text:g.error.message}):null,r.jsx(Zi,{alerts:(Y=g.data)==null?void 0:Y.alerts,loading:g.isLoading,now:U})]})]}),r.jsxs("section",{className:"grid gap-4 xl:grid-cols-3",children:[r.jsx(Fe,{title:"Runtime percentiles",children:r.jsx($s,{label:"runtime",values:(gs=h.data)==null?void 0:gs.metrics.runtime_seconds})}),r.jsx(Fe,{title:"Jobs per day",children:r.jsx(Wi,{values:(bs=h.data)==null?void 0:bs.metrics.by_created_day,loading:h.isLoading,totalJobs:Vi(T)})}),r.jsx(Fe,{title:"Queue wait percentiles",children:r.jsx($s,{label:"queue wait",values:(ys=h.data)==null?void 0:ys.metrics.queue_wait_seconds})})]})]})})]})}function Li({about:e}){const t=e!=null&&e.version?`v${e.version}`:"version loading";return r.jsxs("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-slate-300",children:[r.jsx("span",{children:"Read-only operational dashboard"}),r.jsx("span",{className:"font-mono text-xs text-slate-400",children:t}),e!=null&&e.repository_url?r.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-slate-200 hover:underline",href:ot(e.repository_url),rel:"noreferrer",target:"_blank",children:[r.jsx(gr,{className:"h-3.5 w-3.5","aria-hidden":!0}),"GitHub"]}):null]})}function Di({jobId:e,detail:t,onRefresh:s}){return r.jsxs("div",{className:"grid min-w-0 gap-3 sm:gap-4",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("a",{className:"inline-flex h-9 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",href:"/",children:[r.jsx(Fn,{className:"h-4 w-4","aria-hidden":!0}),"Dashboard"]}),r.jsx(At,{onClick:s})]}),r.jsx(Fe,{title:`Job #${e}`,className:"p-3 sm:p-4",children:t})]})}function qi({selectedJobId:e,selectedJob:t,loading:s,error:n,session:i,sessionEvents:o,transcript:c,now:l}){return t?r.jsx(Bi,{job:t,session:i,sessionEvents:o,transcript:c,now:l}):e!==null&&s?r.jsx(K,{text:"Loading selected job..."}):e!==null&&n?r.jsx(Be,{tone:"error",text:`Job #${e}: ${n.message}`}):r.jsx(K,{text:"Select a job to inspect its timeline, worklog and GitHub links."})}function Qi({user:e,loading:t}){const s=e!=null&&e.login?`@${e.login}`:t?"Loading profile...":"GitHub OAuth",n=e!=null&&e.avatar_url?r.jsx("img",{className:"h-10 w-10 rounded-full border border-slate-700 bg-slate-800",src:e.avatar_url,alt:e.login?`${e.login} avatar`:"",referrerPolicy:"no-referrer"}):r.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-slate-700 bg-slate-900",children:r.jsx(Ft,{className:"h-5 w-5","aria-hidden":!0})}),i=e!=null&&e.html_url?r.jsx("a",{className:"truncate font-semibold text-white hover:underline",href:ot(e.html_url),rel:"noreferrer",target:"_blank",children:s}):r.jsx("div",{className:"truncate font-semibold text-white",children:s});return r.jsxs("div",{className:"flex max-w-full shrink-0 items-center gap-3 text-sm text-slate-300","aria-label":e!=null&&e.login?`Signed in as ${e.login}`:"Dashboard account",children:[r.jsx(qn,{className:"hidden h-4 w-4 shrink-0 sm:block","aria-hidden":!0}),r.jsxs("div",{className:"hidden min-w-0 text-right sm:block",children:[i,r.jsx("div",{className:"text-xs text-slate-400",children:"Signed in · read-only"})]}),n]})}function $i({count:e,limit:t,loading:s,onRefresh:n}){return r.jsxs("div",{className:"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-lg border border-border bg-white px-3 py-3 shadow-sm md:px-4",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsx("h2",{className:"text-base font-semibold",children:"Jobs"}),r.jsx("p",{className:"text-xs text-muted",children:s?"Refreshing latest jobs...":`Showing ${e} of the latest ${t} requested jobs`})]}),r.jsx(At,{onClick:n,compactOnMobile:!0})]})}function Fe({title:e,action:t,children:s,className:n,flushHeader:i=!1}){return r.jsxs("section",{className:ie("min-w-0 rounded-lg border border-border bg-panel p-4 shadow-sm",n),children:[r.jsxs("div",{className:ie("flex items-center justify-between gap-3",!i&&"mb-4"),children:[r.jsx("h2",{className:"text-sm font-semibold",children:e}),t]}),s]})}function Pt({title:e,value:t,icon:s}){return r.jsxs("div",{className:"rounded-lg border border-border bg-panel p-3 shadow-sm md:p-4",children:[r.jsxs("div",{className:"flex items-center justify-between text-muted",children:[r.jsx("span",{className:"text-sm font-medium",children:e}),s]}),r.jsx("strong",{className:"mt-3 block text-2xl leading-none md:mt-4 md:text-3xl",children:t})]})}function Ui({filters:e,actorOptions:t,onChange:s}){const[n,i]=W.useState(e);return W.useEffect(()=>i(e),[e]),r.jsxs("details",{className:"my-3 rounded-md border border-border bg-slate-50/70",children:[r.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-2 text-sm font-semibold marker:hidden",children:[r.jsxs("span",{className:"inline-flex items-center gap-2",children:[r.jsx(An,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Filters"]}),r.jsx(xr,{className:"h-4 w-4 text-muted","aria-hidden":!0})]}),r.jsxs("form",{className:"grid gap-3 border-t border-border bg-white p-3 md:grid-cols-3 xl:grid-cols-8",onSubmit:o=>{o.preventDefault(),s(n)},children:[r.jsx(Ge,{label:"Status",children:r.jsxs("select",{className:"control",value:n.status,onChange:o=>i({...n,status:o.target.value}),children:[r.jsx("option",{value:"",children:"All"}),r.jsx("option",{value:"pending",children:"pending"}),r.jsx("option",{value:"running",children:"running"}),r.jsx("option",{value:"blocked",children:"blocked"}),r.jsx("option",{value:"done",children:"done"}),r.jsx("option",{value:"denied",children:"denied"}),r.jsx("option",{value:"waiting_approval",children:"waiting_approval"})]})}),r.jsx(Ge,{label:"Repository",children:r.jsx("input",{className:"control",value:n.repo,placeholder:"owner/repo",onChange:o=>i({...n,repo:o.target.value})})}),r.jsx(Ge,{label:"Thread",children:r.jsx("input",{className:"control",value:n.thread,inputMode:"numeric",placeholder:"issue or PR",onChange:o=>i({...n,thread:o.target.value})})}),r.jsx(Ge,{label:"Action",children:r.jsx("input",{className:"control",value:n.action,placeholder:"reply_comment",onChange:o=>i({...n,action:o.target.value})})}),r.jsx(Ge,{label:"Actor",className:"xl:col-span-2",children:r.jsx(zi,{value:n.actor,options:t,onChange:o=>i({...n,actor:o})})}),r.jsx(Ge,{label:"Intent",children:r.jsxs("select",{className:"control",value:n.intent,onChange:o=>i({...n,intent:o.target.value}),children:[r.jsx("option",{value:"",children:"All"}),r.jsx("option",{value:"review_only",children:"review_only"}),r.jsx("option",{value:"work_allowed",children:"work_allowed"})]})}),r.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 self-end rounded-md bg-primary px-3 text-sm font-semibold text-white",type:"submit",children:[r.jsx(Dn,{className:"h-4 w-4","aria-hidden":!0}),"Apply"]})]})]})}function zi({value:e,options:t,onChange:s}){const[n,i]=W.useState(!1),o=e.trim().replace(/^@/,"").toLowerCase(),c=t.filter(d=>!o||d.login.toLowerCase().includes(o)).slice(0,8),l=t.find(d=>d.login.toLowerCase()===o);return r.jsxs("div",{className:"relative min-w-0",children:[r.jsxs("div",{className:"control flex items-center gap-2 px-2",children:[l?r.jsx("img",{className:"h-5 w-5 shrink-0 rounded-full bg-slate-100",src:ot(l.avatar_url??""),alt:`${l.login} avatar`,referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-4 w-4 shrink-0 text-muted","aria-hidden":!0}),r.jsx("input",{className:"min-w-0 flex-1 bg-transparent font-mono text-sm outline-none",value:e,placeholder:"@login",onChange:d=>{s(d.target.value),i(!0)},onFocus:()=>i(!0),onBlur:()=>window.setTimeout(()=>i(!1),100)}),e?r.jsx("button",{className:"rounded-sm p-1 text-muted hover:bg-slate-100",type:"button","aria-label":"Clear actor filter",onClick:()=>s(""),children:r.jsx($n,{className:"h-3.5 w-3.5","aria-hidden":!0})}):null]}),n&&c.length>0?r.jsx("div",{className:"absolute left-0 right-0 z-20 mt-1 max-h-72 overflow-auto rounded-md border border-border bg-white p-1 shadow-lg",children:c.map(d=>r.jsxs("button",{className:"flex w-full items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-slate-50",type:"button",onMouseDown:u=>u.preventDefault(),onClick:()=>{s(d.login),i(!1)},children:[d.avatar_url?r.jsx("img",{className:"h-6 w-6 shrink-0 rounded-full bg-slate-100",src:ot(d.avatar_url),alt:`${d.login} avatar`,referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-5 w-5 shrink-0 text-muted","aria-hidden":!0}),r.jsxs("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-foreground",children:["@",d.login]}),r.jsx("span",{className:"shrink-0 rounded-full bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold text-muted",children:d.job_count})]},d.login))}):null]})}function Ge({label:e,children:t,className:s}){return r.jsxs("label",{className:ie("grid min-w-0 gap-1 text-xs font-semibold text-muted",s),children:[e,t]})}function Ki({jobs:e,loading:t,onViewJob:s,now:n}){return t&&e.length===0?r.jsx(K,{text:"Loading jobs..."}):e.length===0?r.jsx(K,{text:"No jobs match the current filters."}):r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"grid gap-2 md:hidden",children:e.map(i=>r.jsx(Gi,{job:i,onViewJob:s,now:n},i.id))}),r.jsx("div",{className:"hidden max-h-[640px] overflow-auto rounded-md border border-border md:block",children:r.jsxs("table",{className:"min-w-full border-collapse text-sm",children:[r.jsx("thead",{children:r.jsxs("tr",{className:"sticky top-0 border-b border-border bg-panel text-left text-xs text-muted",children:[r.jsx("th",{className:"px-2 py-2 font-semibold",children:"ID"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Status"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Repo / thread"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Action"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Actor"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Attempts"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Queue wait"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Runtime"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Updated"})]})}),r.jsx("tbody",{children:e.map(i=>r.jsxs("tr",{className:"cursor-pointer border-b border-border hover:bg-slate-50",onClick:()=>s(i.id),children:[r.jsxs("td",{className:"px-2 py-3 font-mono",children:["#",i.id]}),r.jsx("td",{className:"px-2 py-3",children:r.jsx(xs,{status:i.status})}),r.jsxs("td",{className:"px-2 py-3",children:[r.jsx("div",{className:"font-mono",children:i.repo??i.work_key}),r.jsxs("div",{className:"text-xs text-muted",children:["thread ",i.thread??"n/a"]})]}),r.jsxs("td",{className:"px-2 py-3",children:[r.jsx("div",{children:i.action}),r.jsx("div",{className:"text-xs text-muted",children:i.intent})]}),r.jsx("td",{className:"px-2 py-3",children:r.jsx(ps,{actor:i.trigger_actor,avatarUrl:i.trigger_actor_avatar_url})}),r.jsx("td",{className:"px-2 py-3",children:i.attempts}),r.jsx("td",{className:"px-2 py-3",children:ae(ms(i,n))}),r.jsx("td",{className:"px-2 py-3",children:ae(fs(i,n))}),r.jsx("td",{className:"px-2 py-3 font-mono text-xs",children:r.jsx(pe,{value:i.updated_at,compact:!0,relative:!0,now:n})})]},i.id))})]})})]})}function Gi({job:e,onViewJob:t,now:s}){return r.jsx("article",{className:"rounded-md border border-border bg-white shadow-[0_1px_0_rgba(15,23,42,0.03)]",children:r.jsxs("button",{className:"grid w-full gap-2 p-3 text-left hover:bg-slate-50",type:"button",onClick:()=>t(e.id),children:[r.jsxs("div",{className:"flex items-start justify-between gap-2",children:[r.jsxs("div",{className:"min-w-0 space-y-1",children:[r.jsxs("div",{className:"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-2",children:[r.jsxs("span",{className:"shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),r.jsx("span",{className:"truncate font-mono text-sm",children:e.repo??e.work_key})]}),r.jsx("div",{className:"line-clamp-2 text-sm leading-snug text-foreground",children:e.subject}),r.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[r.jsxs("span",{children:["thread ",e.thread??"n/a"," · ",e.action]}),r.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})]})]}),r.jsx(xs,{status:e.status})]}),r.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[r.jsx(ee,{label:"Wait",value:ae(ms(e,s))}),r.jsx(ee,{label:"Runtime",value:ae(fs(e,s))}),r.jsx(ee,{label:"Updated",value:r.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:s})})]})]})})}function ps({actor:e,avatarUrl:t,framed:s=!1}){const n=t?r.jsx("img",{className:"h-4 w-4 shrink-0 rounded-full bg-slate-100",src:ot(t),alt:e?`${e} avatar`:"",referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),i=r.jsxs(r.Fragment,{children:[n,r.jsx("span",{className:"min-w-0 truncate",children:e?`@${e}`:"unknown actor"})]});return s?r.jsx("span",{className:"inline-flex h-7 max-w-full items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-muted",children:i}):r.jsx("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 font-mono text-xs text-muted",children:i})}function Bi({job:e,session:t,sessionEvents:s,transcript:n,now:i,compact:o=!1}){var v;const c=Rr(e.id),l=s??[],d=n??[],u=Pi(l),h=Mi(d),b=fs(e,i),j=ms(e,i);return r.jsxs("div",{className:"grid min-w-0 gap-4",children:[r.jsxs("div",{className:"grid gap-2",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx(xs,{status:e.status}),r.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:c,children:[r.jsx(In,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.id]}),r.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url,framed:!0})]}),r.jsx("div",{className:"min-w-0 break-words font-mono text-sm [overflow-wrap:anywhere]",children:e.work_key}),r.jsx("p",{className:"min-w-0 break-words text-sm text-muted [overflow-wrap:anywhere]",children:e.subject})]}),r.jsxs("div",{className:ie("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-3"),children:[r.jsx(ee,{label:"Queue wait",value:ae(j)}),r.jsx(ee,{label:e.status==="running"?"Running for":"Runtime",value:ae(b)}),r.jsx(ee,{label:"Coalesced",value:String(e.coalesced_count)})]}),r.jsxs("div",{className:ie("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[r.jsx(ee,{label:"Created",value:r.jsx(pe,{value:e.created_at,compact:!0,relative:!0,now:i})}),r.jsx(ee,{label:"Started",value:e.started_at?r.jsx(pe,{value:e.started_at,compact:!0,relative:!0,now:i}):"n/a"}),r.jsx(ee,{label:"Updated",value:r.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:i})}),r.jsx(ee,{label:"Finished",value:e.finished_at?r.jsx(pe,{value:e.finished_at,compact:!0,relative:!0,now:i}):"n/a"})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Timeline"}),r.jsx("div",{className:"grid min-w-0 gap-3",children:(e.worklog??[]).length>0?(v=e.worklog)==null?void 0:v.map(p=>r.jsxs("div",{className:"min-w-0 border-l-2 border-primary pl-3",children:[r.jsx("div",{className:"text-sm font-semibold",children:p.phase}),r.jsx("div",{className:"font-mono text-xs text-muted",children:r.jsx(pe,{value:p.ts,relative:!0,now:i})}),r.jsx("div",{className:"break-words text-sm [overflow-wrap:anywhere]",children:p.summary}),p.detail?r.jsx("div",{className:"mt-1 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:p.detail}):null]},p.id)):r.jsx(K,{text:"No worklog entries."})})]}),r.jsxs("div",{children:[r.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Qn,{className:"h-4 w-4","aria-hidden":!0}),"OpenClaw session"]}),t?r.jsxs("div",{className:"grid gap-3",children:[r.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[r.jsx(ee,{label:"Session ID",value:t.id}),r.jsx(ee,{label:"Source",value:t.source})]}),r.jsx("p",{className:"break-words text-xs text-muted [overflow-wrap:anywhere]",children:t.detail})]}):r.jsx(K,{text:"Session correlation is loading."})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Agent activity"}),r.jsx("div",{className:"grid max-h-[460px] min-w-0 gap-2 overflow-auto pr-1",children:u.length>0?u.map((p,x)=>r.jsx(Ji,{event:p,defaultOpen:Ds(p.eventType,e.status==="running",x,u.length),now:i},p.id)):r.jsx(K,{text:e.status==="running"?"Waiting for live agent output...":"No agent activity has been recorded for this session."})})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Session transcript"}),r.jsx("div",{className:"grid max-h-[620px] min-w-0 gap-2 overflow-auto pr-1",children:h.length>0?h.map((p,x)=>r.jsx(Hi,{entry:p,defaultOpen:Ds(p.kind,e.status==="running",x,h.length),now:i},p.id)):r.jsx(K,{text:e.status==="running"?"Waiting for live transcript entries...":"No OpenClaw transcript entries are available for this session."})})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"GitHub links"}),r.jsx("ul",{className:"grid gap-2 text-sm",children:e.github_urls.length>0?e.github_urls.map(p=>r.jsx("li",{children:r.jsxs("a",{className:"break-all text-primary hover:underline [overflow-wrap:anywhere]",href:ot(p),rel:"noreferrer",target:"_blank",children:[r.jsx(gr,{className:"mr-1 inline h-3.5 w-3.5 align-[-2px]","aria-hidden":!0}),p]})},p)):r.jsx("li",{className:"text-muted",children:"No links recorded."})})]})]})}function Hi({entry:e,defaultOpen:t,now:s}){return r.jsx(_r,{badge:e.badge,meta:r.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:r.jsx("pre",{className:"max-h-72 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.text})})}function Ji({event:e,defaultOpen:t,now:s}){return r.jsx(_r,{badge:e.badge,meta:r.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:e.detail?r.jsx("pre",{className:"max-h-56 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.detail}):null})}function _r({badge:e,meta:t,count:s,summary:n,defaultOpen:i,children:o}){const[c,l]=W.useState(!!i);return r.jsxs("details",{className:"group min-w-0 rounded border border-border bg-slate-50/60",open:c,onToggle:d=>l(d.currentTarget.open),children:[r.jsxs("summary",{className:"grid cursor-pointer list-none gap-1 px-2 py-1.5 marker:hidden hover:bg-white",children:[r.jsxs("div",{className:"grid min-w-0 gap-1 sm:flex sm:items-center sm:justify-between sm:gap-2",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[r.jsx(xr,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),r.jsx("span",{className:"truncate font-mono text-[11px] font-semibold text-muted",children:e}),s&&s>1?r.jsx("span",{className:"rounded-sm border border-border px-1 font-mono text-[10px] text-muted",children:s}):null]}),r.jsx("span",{className:"min-w-0 truncate pl-5 font-mono text-[11px] text-muted sm:shrink-0 sm:pl-0",children:t})]}),r.jsx("div",{className:"min-w-0 break-words pl-5 text-xs text-foreground [overflow-wrap:anywhere] sm:truncate",children:n})]}),r.jsx("div",{className:"min-w-0 border-t border-border bg-white px-2 py-2",children:o})]})}function $s({label:e,values:t}){const s=[{name:"median",seconds:(t==null?void 0:t.median)??0},{name:"p90",seconds:(t==null?void 0:t.p90)??0},{name:"p99",seconds:(t==null?void 0:t.p99)??0}];return r.jsx("div",{className:"h-56",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(er,{data:s,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"name"}),r.jsx(as,{tickFormatter:ae}),r.jsx(os,{formatter:n=>[ae(Number(n)),e]}),r.jsx(tr,{dataKey:"seconds",fill:"#0969da",radius:[4,4,0,0]})]})})})}function Wi({values:e,loading:t,totalJobs:s}){const n=Object.entries(e??{}).map(([i,o])=>({day:i,count:o}));return t&&n.length===0?r.jsx(K,{text:"Loading job history..."}):n.length===0?r.jsx(K,{text:s>0?"Job history has no valid creation dates.":"No job history available."}):r.jsx("div",{className:"h-56",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(er,{data:n,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"day",minTickGap:16}),r.jsx(as,{allowDecimals:!1}),r.jsx(os,{formatter:i=>[Number(i),"jobs"]}),r.jsx(tr,{dataKey:"count",fill:"#16a34a",radius:[4,4,0,0]})]})})})}function Vi(e){return Object.values(e).reduce((t,s)=>t+s,0)}function Xi({data:e,loading:t}){var b,j,v,p,x,g;if(t&&!e)return r.jsx(K,{text:"Loading process activity..."});if(!e)return r.jsx(K,{text:"No process snapshot available."});const s=e.executor.children??[],n=s.flatMap(f=>Mr(f)),i=n.reduce((f,k)=>f+k.cpu_ticks,0),o=n.reduce((f,k)=>f+Yi(k),0),c=e.executor.service==="active",l=n.slice(0,8).map(f=>({label:`pid ${f.pid}`,ticks:f.cpu_ticks})),d=(e.samples??[]).map(f=>({label:pt(f.ts),ticks:f.cpu_ticks,io:f.io_bytes,active:f.active_since_last_sample?"active":"quiet"})),u=d.length>0?d:l,h=(b=e.samples)==null?void 0:b[e.samples.length-1];return r.jsxs("div",{className:"grid gap-4",children:[r.jsx("div",{className:"rounded-md border border-slate-200 bg-slate-50 p-3",children:r.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx("span",{className:ie("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",c?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-white text-slate-600"),children:c?"active":"idle"}),r.jsxs("span",{className:"font-mono text-xs text-muted",children:["service ",e.executor.service]})]}),r.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:e.running_jobs.length>0?`${e.running_jobs.length} running job${e.running_jobs.length===1?"":"s"}`:"No running jobs"}),e.running_jobs.length>0?r.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:e.running_jobs.slice(0,4).map(f=>r.jsxs("span",{className:"inline-flex min-h-6 items-center gap-1.5 rounded-full border border-blue-200 bg-white px-2 font-mono text-[11px] font-semibold text-blue-700",children:[r.jsx("span",{className:"h-2 w-2 rounded-full bg-blue-600 animate-live-pulse","aria-hidden":!0}),"#",f.id," ",ae(f.age_seconds)]},f.id))}):null,h?r.jsxs("p",{className:"mt-1 text-xs text-muted",children:["Last persisted sample ",pt(h.ts)," · ",h.active_since_last_sample?"activity observed":`quiet ${ae(h.idle_seconds)}`]}):null,r.jsx("p",{className:"mt-1 text-xs text-muted",children:e.detail})]}),r.jsxs("div",{className:"grid min-w-[190px] grid-cols-3 gap-2 text-center text-xs",children:[r.jsx(Qt,{label:"PID",value:e.executor.pid?String(e.executor.pid):"n/a"}),r.jsx(Qt,{label:"Children",value:String(n.length)}),r.jsx(Qt,{label:"CPU ticks",value:String(i)})]})]})}),r.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[r.jsx(Mt,{label:"Live process",value:((j=e.signals)==null?void 0:j.live_process.state)??(n.length>0?"live":"no_child_process"),detail:`${((v=e.signals)==null?void 0:v.live_process.child_count)??n.length} children`}),r.jsx(Mt,{label:"Process activity",value:((p=e.signals)==null?void 0:p.process_activity.state)??(h!=null&&h.active_since_last_sample?"active":"quiet"),detail:h?`sample ${pt(h.ts)}`:"no sample"}),r.jsx(Mt,{label:"Semantic progress",value:(x=e.signals)!=null&&x.semantic_progress.length?"recent":"none",detail:Us(e.running_jobs,"semantic_progress")}),r.jsx(Mt,{label:"Visible progress",value:(g=e.signals)!=null&&g.visible_progress.length?"streaming":"none",detail:Us(e.running_jobs,"visible_progress")})]}),e.alerts.length>0?r.jsx(Be,{tone:"error",text:e.alerts[0]}):null,r.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[r.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[r.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Ts,{className:"h-4 w-4","aria-hidden":!0}),d.length>0?"CPU history":"CPU ticks"]}),r.jsxs("span",{className:"font-mono text-xs text-muted",children:[Or(o)," I/O"]})]}),u.length>0?r.jsx("div",{className:"h-40",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(Ar,{data:u,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"label",tick:!1}),r.jsx(as,{allowDecimals:!1,tick:{fontSize:11}}),r.jsx(os,{formatter:f=>[Number(f),"cpu ticks"]}),r.jsx(Ir,{type:"monotone",dataKey:"ticks",stroke:"#0f766e",strokeWidth:2,dot:{r:3},activeDot:{r:5},isAnimationActive:!1})]})})}):r.jsx(K,{text:"No executor CPU samples available."})]}),r.jsxs("div",{className:"min-w-0",children:[r.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Ts,{className:"h-4 w-4","aria-hidden":!0}),"Executor children"]}),s.length>0?r.jsx("div",{className:"grid gap-2",children:s.map(f=>r.jsx(Pr,{process:f},f.pid))}):r.jsx(K,{text:"No child process detected for the executor."})]})]})]})}function Zi({alerts:e,loading:t,now:s}){if(t&&!e)return r.jsx(K,{text:"Loading monitor alerts..."});const n=e??[];return n.length===0?r.jsx(K,{text:"No active monitor alerts."}):r.jsx("div",{className:"grid gap-2",children:n.slice(0,5).map(i=>r.jsxs("div",{className:"rounded-md border border-red-200 bg-red-50 p-2.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-semibold text-red-700",children:[r.jsx(br,{className:"h-3.5 w-3.5","aria-hidden":!0}),r.jsx("span",{children:i.severity}),r.jsx("span",{className:"font-normal text-red-600",children:kr(i.last_seen,s)}),i.observations>1?r.jsxs("span",{className:"rounded-full border border-red-200 bg-white px-1.5",children:[i.observations,"x"]}):null]}),r.jsx("p",{className:"mt-1 break-words text-sm font-medium text-red-950 [overflow-wrap:anywhere]",children:i.message})]},i.fingerprint))})}function Pr({process:e}){var n,i;const t=((n=e.io_bytes)==null?void 0:n.read_bytes)??0,s=((i=e.io_bytes)==null?void 0:i.write_bytes)??0;return r.jsxs("div",{className:"rounded-md border border-border bg-white p-2.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[r.jsxs("span",{className:"font-mono",children:["pid ",e.pid]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["state ",e.state]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["cpu ",e.cpu_ticks]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["I/O ",Or(t+s)]})]}),r.jsx("div",{className:"mt-2 break-words font-mono text-xs text-muted",children:e.cmd||"unknown command"}),e.children&&e.children.length>0?r.jsx("div",{className:"mt-3 border-l-2 border-border pl-3",children:e.children.map(o=>r.jsx(Pr,{process:o},o.pid))}):null]})}function Qt({label:e,value:t}){return r.jsxs("div",{className:"rounded-md border border-border bg-white px-2 py-2",children:[r.jsx("div",{className:"font-mono text-sm font-semibold text-foreground",children:t}),r.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Mt({label:e,value:t,detail:s}){return r.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-2.5",children:[r.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),r.jsx("div",{className:"mt-1 truncate text-sm font-semibold text-foreground",children:t}),r.jsx("div",{className:"mt-1 truncate font-mono text-[11px] text-muted",children:s})]})}function Us(e,t){const s=e.find(i=>i[t]),n=s==null?void 0:s[t];return!s||!n?"no running heartbeat":`#${s.id} ${n.phase} ${ae(n.age_seconds??null)}`}function Mr(e){return[e,...(e.children??[]).flatMap(t=>Mr(t))]}function Yi(e){var t,s;return(((t=e.io_bytes)==null?void 0:t.read_bytes)??0)+(((s=e.io_bytes)==null?void 0:s.write_bytes)??0)}function Or(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ee({label:e,value:t}){return r.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[r.jsx("div",{className:"text-xs font-semibold text-muted",children:e}),r.jsx("div",{className:"mt-1 min-w-0 break-words text-sm [overflow-wrap:anywhere]",children:t})]})}function xs({status:e}){const t=Oi(e),s=e==="running"||e==="pending";return r.jsxs("span",{className:ie("inline-flex min-h-6 items-center gap-1.5 rounded-full border px-2 text-xs font-semibold",t.badge),children:[r.jsx("span",{className:ie("h-2.5 w-2.5 rounded-full",t.dot,s&&"animate-live-pulse"),"aria-hidden":!0}),e]})}function K({text:e}){return r.jsx("div",{className:"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted",children:e})}function Be({tone:e,text:t}){return r.jsx("div",{className:ie("rounded-md border p-3 text-sm",e==="error"&&"border-red-300 bg-red-50 text-red-700"),children:t})}function At({onClick:e,compactOnMobile:t=!1}){return r.jsxs("button",{className:ie("inline-flex h-8 items-center justify-center gap-2 rounded-md border border-border text-sm font-semibold text-foreground hover:bg-slate-50",t?"w-8 px-0 sm:w-auto sm:px-3":"px-3"),onClick:e,type:"button","aria-label":"Refresh",children:[r.jsx(Ln,{className:"h-4 w-4","aria-hidden":!0}),r.jsx("span",{className:ie(t&&"hidden sm:inline"),children:"Refresh"})]})}const zs=document.getElementById("root");zs&&Ur.createRoot(zs).render(r.jsx(W.StrictMode,{children:r.jsx(xn,{client:vi,children:r.jsx(Ii,{})})})); diff --git a/src/github_agent_bridge/dashboard_static/assets/index-DZ0faviD.css b/src/github_agent_bridge/dashboard_static/assets/index-CDukmhDa.css similarity index 77% rename from src/github_agent_bridge/dashboard_static/assets/index-DZ0faviD.css rename to src/github_agent_bridge/dashboard_static/assets/index-CDukmhDa.css index 859153d..668a82c 100644 --- a/src/github_agent_bridge/dashboard_static/assets/index-DZ0faviD.css +++ b/src/github_agent_bridge/dashboard_static/assets/index-CDukmhDa.css @@ -1 +1 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}*{box-sizing:border-box}body{margin:0;min-width:320px;overflow-x:hidden;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0}#root{overflow-x:hidden}.animate-live-pulse{animation:live-pulse 1.25s ease-in-out infinite}.control{height:36px;width:100%;border-radius:6px;border:1px solid hsl(214 20% 88%);background:#fff;padding:0 10px;color:#1a222e;font:inherit}.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.left-0{left:0}.right-0{right:0}.top-0{top:0}.z-20{z-index:20}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.max-h-56{max-height:14rem}.max-h-72{max-height:18rem}.max-h-\[460px\]{max-height:460px}.max-h-\[620px\]{max-height:620px}.max-h-\[640px\]{max-height:640px}.min-h-6{min-height:1.5rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[190px\]{min-width:190px}.min-w-full{min-width:100%}.max-w-\[1440px\]{max-width:1440px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-1{row-gap:.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:8px}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-border{--tw-border-opacity: 1;border-color:hsl(214 20% 88% / var(--tw-border-opacity, 1))}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-primary{--tw-border-opacity: 1;border-color:hsl(212 92% 42% / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{--tw-bg-opacity: 1;background-color:hsl(210 20% 98% / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-panel{--tw-bg-opacity: 1;background-color:hsl(0 0% 100% / var(--tw-bg-opacity, 1))}.bg-primary{--tw-bg-opacity: 1;background-color:hsl(212 92% 42% / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-50\/60{background-color:#f8fafc99}.bg-slate-50\/70{background-color:#f8fafcb3}.bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-1{padding:.25rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-5{padding-left:1.25rem}.pr-1{padding-right:.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-\[-2px\]{vertical-align:-2px}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{--tw-text-opacity: 1;color:hsl(216 28% 14% / var(--tw-text-opacity, 1))}.text-muted{--tw-text-opacity: 1;color:hsl(215 16% 47% / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:hsl(212 92% 42% / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-950{--tw-text-opacity: 1;color:rgb(69 10 10 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.shadow-\[0_1px_0_rgba\(15\,23\,42\,0\.03\)\]{--tw-shadow: 0 1px 0 rgba(15,23,42,.03);--tw-shadow-colored: 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}@keyframes live-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.72)}}@media(prefers-reduced-motion:reduce){.animate-live-pulse{animation:none}}.marker\:hidden *::marker{display:none}.marker\:hidden::marker{display:none}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.group[open] .group-open\:rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media(min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:w-auto{width:auto}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:gap-3{gap:.75rem}.sm\:gap-4{gap:1rem}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:p-4{padding:1rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:pl-0{padding-left:0}}@media(min-width:768px){.md\:mt-4{margin-top:1rem}.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:p-4{padding:1rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}}@media(min-width:1024px){.lg\:grid-cols-\[minmax\(0\,0\.9fr\)_minmax\(0\,1\.1fr\)\]{grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr)}}@media(min-width:1280px){.xl\:col-span-2{grid-column:span 2 / span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}} +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}*{box-sizing:border-box}body{margin:0;min-width:320px;overflow-x:hidden;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0}#root{overflow-x:hidden}.animate-live-pulse{animation:live-pulse 1.25s ease-in-out infinite}.control{height:36px;width:100%;border-radius:6px;border:1px solid hsl(214 20% 88%);background:#fff;padding:0 10px;color:#1a222e;font:inherit}.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.left-0{left:0}.right-0{right:0}.top-0{top:0}.z-20{z-index:20}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.max-h-56{max-height:14rem}.max-h-72{max-height:18rem}.max-h-\[460px\]{max-height:460px}.max-h-\[620px\]{max-height:620px}.max-h-\[640px\]{max-height:640px}.min-h-6{min-height:1.5rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[190px\]{min-width:190px}.min-w-full{min-width:100%}.max-w-\[1440px\]{max-width:1440px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-1{row-gap:.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:8px}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-border{--tw-border-opacity: 1;border-color:hsl(214 20% 88% / var(--tw-border-opacity, 1))}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-primary{--tw-border-opacity: 1;border-color:hsl(212 92% 42% / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{--tw-bg-opacity: 1;background-color:hsl(210 20% 98% / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-panel{--tw-bg-opacity: 1;background-color:hsl(0 0% 100% / var(--tw-bg-opacity, 1))}.bg-primary{--tw-bg-opacity: 1;background-color:hsl(212 92% 42% / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-50\/60{background-color:#f8fafc99}.bg-slate-50\/70{background-color:#f8fafcb3}.bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-1{padding:.25rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-5{padding-left:1.25rem}.pr-1{padding-right:.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-\[-2px\]{vertical-align:-2px}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{--tw-text-opacity: 1;color:hsl(216 28% 14% / var(--tw-text-opacity, 1))}.text-muted{--tw-text-opacity: 1;color:hsl(215 16% 47% / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:hsl(212 92% 42% / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-950{--tw-text-opacity: 1;color:rgb(69 10 10 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.shadow-\[0_1px_0_rgba\(15\,23\,42\,0\.03\)\]{--tw-shadow: 0 1px 0 rgba(15,23,42,.03);--tw-shadow-colored: 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}@keyframes live-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.72)}}@media(prefers-reduced-motion:reduce){.animate-live-pulse{animation:none}}.marker\:hidden *::marker{display:none}.marker\:hidden::marker{display:none}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.group[open] .group-open\:rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media(min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:w-auto{width:auto}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:gap-3{gap:.75rem}.sm\:gap-4{gap:1rem}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:p-4{padding:1rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:pl-0{padding-left:0}}@media(min-width:768px){.md\:mt-4{margin-top:1rem}.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:p-4{padding:1rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}}@media(min-width:1024px){.lg\:grid-cols-\[minmax\(0\,0\.9fr\)_minmax\(0\,1\.1fr\)\]{grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr)}}@media(min-width:1280px){.xl\:col-span-2{grid-column:span 2 / span 2}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}} diff --git a/src/github_agent_bridge/dashboard_static/index.html b/src/github_agent_bridge/dashboard_static/index.html index f8710f4..24ba977 100644 --- a/src/github_agent_bridge/dashboard_static/index.html +++ b/src/github_agent_bridge/dashboard_static/index.html @@ -4,9 +4,9 @@ GitHub Agent Bridge Dashboard - + - +

diff --git a/tests/test_backend.py b/tests/test_backend.py index 570cc87..423d068 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -6,6 +6,7 @@ import pytest from fastapi.testclient import TestClient +from github_agent_bridge import __version__ from github_agent_bridge.backend import DashboardConfig, _encode_session, _session_stream_events, _sign, create_app from github_agent_bridge.dashboard_data import get_job_detail, job_session, job_session_events, job_session_transcript, list_job_actors, list_jobs, metrics_summary from github_agent_bridge.monitor import MonitorReport @@ -49,6 +50,21 @@ def test_dashboard_status_is_read_only_and_lists_recent_jobs(tmp_path): assert jobs.json()["jobs"][0]["trigger_actor_avatar_url"] is None +def test_dashboard_about_exposes_package_version_and_repository(tmp_path): + db = tmp_path / "bridge.sqlite3" + JobQueue(db) + client = TestClient(create_app(DashboardConfig(db=db, require_auth=False))) + + response = client.get("/api/about") + + assert response.status_code == 200 + assert response.json() == { + "service": "github-agent-bridge-dashboard", + "version": __version__, + "repository_url": "https://github.com/pilipilisbot/github-agent-bridge", + } + + def test_dashboard_serves_built_react_ui_with_existing_auth(tmp_path): db = tmp_path / "bridge.sqlite3" static_dir = tmp_path / "static" From 70f8e13c4c28af9d5e9b4db3ed3925315bc53f4a Mon Sep 17 00:00:00 2001 From: GISCE Bot Date: Tue, 26 May 2026 19:57:30 +0000 Subject: [PATCH 02/14] fix: support forwarded github notifications --- src/github_agent_bridge/cli.py | 4 +-- src/github_agent_bridge/parser.py | 46 +++++++++++++++++++++++++------ src/github_agent_bridge/policy.py | 11 ++++++-- src/github_agent_bridge/queue.py | 4 +-- src/github_agent_bridge/reader.py | 4 +-- tests/test_manual_enqueue_cli.py | 28 ++++++++++++++++++- tests/test_parser.py | 16 +++++------ tests/test_policy.py | 25 +++++++++++++++++ tests/test_queue.py | 2 +- 9 files changed, 112 insertions(+), 28 deletions(-) diff --git a/src/github_agent_bridge/cli.py b/src/github_agent_bridge/cli.py index e4511f2..fb084ff 100644 --- a/src/github_agent_bridge/cli.py +++ b/src/github_agent_bridge/cli.py @@ -18,7 +18,7 @@ from .models import Notification, utc_now from .monitor import MonitorThresholds, monitor, report_json from .observability import DEFAULT_PROCESS_SAMPLE_RETENTION_SECONDS -from .parser import decode_header_value, extract_body_text, parse_auth_results +from .parser import decode_header_value, extract_body_text, is_github_notification_message, parse_auth_results from .policy import Policy from .queue import JobQueue from .reader import ImapConfig, ImapReader, imap_mailbox_arg @@ -34,7 +34,7 @@ def load_policy(path: str | None) -> Policy: def msg_to_notification(msg, uid: int | None = None) -> Notification | None: from_addr = decode_header_value(msg.get("From", "")) - if "notifications@github.com" not in from_addr.lower(): + if not is_github_notification_message(msg, from_addr): return None return Notification( uid=uid, diff --git a/src/github_agent_bridge/parser.py b/src/github_agent_bridge/parser.py index 19a3b20..0b035de 100644 --- a/src/github_agent_bridge/parser.py +++ b/src/github_agent_bridge/parser.py @@ -8,9 +8,9 @@ REVIEW_ONLY_PATTERNS = ("fes-ne una review", "fes una review", "fes review", "fer una review", "fes-ne una revisio", "fes-ne una revisió", "fes una revisio", "fes una revisió", "fer una revisio", "fer una revisió", "review de la pr", "revisió de la pr", "revisio de la pr", "revisa aquesta pr", "revisa els canvis", "revisar els canvis", "com veus els canvis", "què et semblen els canvis", "que et semblen els canvis", "what do you think of these changes", "please review", "can you review") IMPLEMENTATION_PATTERNS = ("fes els canvis", "fes-ho", "implementa", "modifica", "canvia", "arregla", "corregeix", "fix", "push", "commit", "aplica", "resol", "resolve") -BOT_MENTION_PATTERNS = ("@pilipilisbot", "pilipilisbot", "you are receiving this because you were mentioned") -ASSIGNMENT_PATTERNS = ("assigned you", "assigned to you", "you were assigned", "you are assigned", "assigned pilipilisbot", "assigned @pilipilisbot") -REVIEW_REQUEST_PATTERNS = ("requested your review", "requested a review from you", "you were requested for review", "review requested", "requested review from pilipilisbot", "requested review from @pilipilisbot", "requested @pilipilisbot") +BOT_MENTION_PATTERNS = ("you are receiving this because you were mentioned",) +ASSIGNMENT_PATTERNS = ("assigned you", "assigned to you", "you were assigned", "you are assigned") +REVIEW_REQUEST_PATTERNS = ("requested your review", "requested a review from you", "you were requested for review", "review requested") COPILOT_REVIEW_PATTERNS = ("copilot-pull-request-reviewer", "github-copilot", "github copilot", "copilot reviewed", "copilot commented", "copilot left a comment", "copilot suggested", "copilot requested changes") WORKFLOW_RUN_FAILED_PATTERNS = ("run failed", "workflow run failed", "workflow failed", "job failed", "failing after") @@ -37,13 +37,41 @@ def parse_auth_results(msg: Message) -> dict[str, bool]: return {"spf": "spf=pass" in raw, "dkim": "dkim=pass" in raw, "dmarc": "dmarc=pass" in raw} +def is_github_notification_message(msg: Message, from_addr: str | None = None) -> bool: + """Return True for direct GitHub notifications and Google Groups rewrites. + + GISCE routes GitHub mail through a Google Group, so incoming notifications can + arrive as `From: ... via GISCE Bot ` while retaining the + GitHub reply address, message id and X-GitHub headers. + """ + sender = (from_addr or decode_header_value(msg.get("From", ""))).lower() + if "notifications@github.com" in sender: + return True + reply_to = decode_header_value(msg.get("Reply-To", "")).lower() + message_id = decode_header_value(msg.get("Message-ID", "")).lower() + return ( + bool(msg.get("X-GitHub-Recipient")) + and bool(msg.get("X-GitHub-Reason")) + and "@reply.github.com" in reply_to + and "github.com" in message_id + ) + + def _contains_any(text: str, patterns: tuple[str, ...]) -> bool: return any(p in text for p in patterns) -def github_event_flags(subject: str, body: str) -> dict[str, bool]: +def _bot_patterns(bot_logins: set[str] | None) -> tuple[str, ...]: + names = sorted({login.lower().lstrip("@") for login in (bot_logins or set()) if login.strip()}) + return tuple(pattern for name in names for pattern in (f"@{name}", name)) + + +def github_event_flags(subject: str, body: str, bot_logins: set[str] | None = None) -> dict[str, bool]: text = f"{subject}\n{body}".lower() - return {"bot_mentioned": _contains_any(text, BOT_MENTION_PATTERNS), "assigned": _contains_any(text, ASSIGNMENT_PATTERNS), "review_requested": _contains_any(text, REVIEW_REQUEST_PATTERNS), "copilot_review": _contains_any(text, COPILOT_REVIEW_PATTERNS)} + bot_patterns = _bot_patterns(bot_logins) + assignment_patterns = ASSIGNMENT_PATTERNS + tuple(f"assigned {p}" for p in bot_patterns) + review_patterns = REVIEW_REQUEST_PATTERNS + tuple(f"requested review from {p}" for p in bot_patterns) + tuple(f"requested {p}" for p in bot_patterns) + return {"bot_mentioned": _contains_any(text, BOT_MENTION_PATTERNS + bot_patterns), "assigned": _contains_any(text, assignment_patterns), "review_requested": _contains_any(text, review_patterns), "copilot_review": _contains_any(text, COPILOT_REVIEW_PATTERNS)} def _looks_like_pr_thread(subject: str, body: str) -> bool: @@ -51,9 +79,9 @@ def _looks_like_pr_thread(subject: str, body: str) -> bool: return bool(re.search(r"\bpr #\d+\b|\bpull request #\d+\b", text) or re.search(r"github\.com/[^/]+/[^/]+/pull/\d+", text)) -def classify_work_intent(subject: str, body: str) -> str: +def classify_work_intent(subject: str, body: str, bot_logins: set[str] | None = None) -> str: text = f"{subject}\n{body}".lower() - flags = github_event_flags(subject, body) + flags = github_event_flags(subject, body, bot_logins) asks_review = flags["review_requested"] or _contains_any(text, REVIEW_ONLY_PATTERNS) asks_implementation = flags["assigned"] or _contains_any(text, IMPLEMENTATION_PATTERNS) if asks_review and not asks_implementation: @@ -66,9 +94,9 @@ def classify_work_intent(subject: str, body: str) -> str: return "work_allowed" -def classify_github_action(subject: str, body: str) -> str: +def classify_github_action(subject: str, body: str, bot_logins: set[str] | None = None) -> str: text = f"{subject}\n{body}".lower() - flags = github_event_flags(subject, body) + flags = github_event_flags(subject, body, bot_logins) if re.search(r"github\.com/[^/]+/[^/]+/actions/runs/\d+", text) and _contains_any(text, WORKFLOW_RUN_FAILED_PATTERNS): return "workflow_run_failed" if "merged" in text: diff --git a/src/github_agent_bridge/policy.py b/src/github_agent_bridge/policy.py index 350a71f..c65c4e6 100644 --- a/src/github_agent_bridge/policy.py +++ b/src/github_agent_bridge/policy.py @@ -60,7 +60,7 @@ class FeedbackLearning: @dataclass(frozen=True) class Policy: - source_from: str = "notifications@github.com" + source_from: str | tuple[str, ...] = "notifications@github.com" required_url_prefix: str = "https://github.com/" message_id_domain: str = "github.com" trusted_repos: set[str] = field(default_factory=set) @@ -73,6 +73,7 @@ class Policy: org_routes: dict[str, Route] = field(default_factory=dict) repo_roles: dict[str, str] = field(default_factory=dict) org_roles: dict[str, str] = field(default_factory=dict) + bot_logins: set[str] = field(default_factory=set) prompt_overrides: PromptOverrides = field(default_factory=PromptOverrides) feedback_learning: FeedbackLearning = field(default_factory=FeedbackLearning) @@ -150,7 +151,7 @@ def feedback_learning(raw: dict) -> FeedbackLearning: ) return cls( - source_from=source.get("from", cls.source_from), + source_from=tuple(source.get("from")) if isinstance(source.get("from"), list) else source.get("from", cls.source_from), required_url_prefix=source.get("requiredUrlPrefix", cls.required_url_prefix), message_id_domain=source.get("messageIdDomain", cls.message_id_domain), trusted_repos={r.lower() for r in data.get("trustedRepos", [])}, @@ -161,13 +162,17 @@ def feedback_learning(raw: dict) -> FeedbackLearning: trusted_auto_actions=set(actions.get("trustedAuto", ["reply_comment", "open_issue", "submit_review", "sync_after_merge", "workflow_run_failed"])), repo_routes=routes(data.get("repoRoutes", {})), org_routes=routes(data.get("orgRoutes", {})), repo_roles=roles(data.get("repoRoles", {})), org_roles=roles(data.get("orgRoles", {})), + bot_logins={str(login).lower().lstrip("@") for login in data.get("botLogins", []) if str(login).strip()}, prompt_overrides=prompt_overrides(data.get("promptOverrides", {})), feedback_learning=feedback_learning(data.get("feedbackLearning", {})), ) def trusted_source(self, n: Notification, ctx: GitHubContext) -> bool: auth_ok = all(bool(n.auth.get(k)) for k in ("spf", "dkim", "dmarc")) if n.auth else True - return self.source_from in n.from_addr and auth_ok and any(u.startswith(self.required_url_prefix) for u in ctx.urls) and self.message_id_domain in n.message_id + sources = (self.source_from,) if isinstance(self.source_from, str) else self.source_from + from_addr = n.from_addr.lower() + source_ok = any(str(source).lower() in from_addr for source in sources) + return source_ok and auth_ok and any(u.startswith(self.required_url_prefix) for u in ctx.urls) and self.message_id_domain in n.message_id def repo_trusted(self, repo: str | None) -> bool: if not repo: diff --git a/src/github_agent_bridge/queue.py b/src/github_agent_bridge/queue.py index 5d0903c..ae57d89 100644 --- a/src/github_agent_bridge/queue.py +++ b/src/github_agent_bridge/queue.py @@ -44,8 +44,8 @@ def init(self) -> None: def enqueue(self, n: Notification, policy: Policy) -> tuple[Job | None, str]: ctx = extract_github_context(n.body) - action = classify_github_action(n.subject, n.body) - intent = classify_work_intent(n.subject, n.body) + action = classify_github_action(n.subject, n.body, policy.bot_logins) + intent = classify_work_intent(n.subject, n.body, policy.bot_logins) decision = policy.decision(n, ctx, action) status = {"auto": "done", "ask": "waiting_approval", "deny": "denied"}.get(decision, "pending") now = utc_now() diff --git a/src/github_agent_bridge/reader.py b/src/github_agent_bridge/reader.py index 6b267f1..d5ab2b0 100644 --- a/src/github_agent_bridge/reader.py +++ b/src/github_agent_bridge/reader.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from .models import Notification -from .parser import decode_header_value, extract_body_text, parse_auth_results +from .parser import decode_header_value, extract_body_text, is_github_notification_message, parse_auth_results from .policy import Policy from .queue import JobQueue @@ -57,7 +57,7 @@ def fetch_once(self) -> int: from_addr = decode_header_value(msg.get("From", "")) subject = decode_header_value(msg.get("Subject", "")) message_id = decode_header_value(msg.get("Message-ID", "")) - if "notifications@github.com" in from_addr.lower(): + if is_github_notification_message(msg, from_addr): n = Notification(uid=uid, message_id=message_id, subject=subject, from_addr=from_addr, body=extract_body_text(msg), auth=parse_auth_results(msg)) self.queue.enqueue(n, self.policy) # Only GitHub notifications belong to this bounded context. diff --git a/tests/test_manual_enqueue_cli.py b/tests/test_manual_enqueue_cli.py index 313b062..2ec4a1f 100644 --- a/tests/test_manual_enqueue_cli.py +++ b/tests/test_manual_enqueue_cli.py @@ -1,6 +1,7 @@ import json +from email.message import EmailMessage -from github_agent_bridge.cli import _parse_github_comment_url, notification_from_comment_url +from github_agent_bridge.cli import _parse_github_comment_url, msg_to_notification, notification_from_comment_url from github_agent_bridge.parser import extract_github_context @@ -32,3 +33,28 @@ def fake_gh(args, gh_bin="gh"): assert ctx.repo == "gisce/erp" assert ctx.issue_number == 27675 assert ctx.comment_id == 4419572864 + + +def test_giscebot_mention_classifies_as_reply_comment(): + from github_agent_bridge.parser import classify_github_action + + body = "@giscebot pots mirar això?\nhttps://github.com/gisce/erp/pull/27675#issuecomment-4419572864" + + assert classify_github_action("Re: [gisce/erp] Example (PR #27675)", body, {"giscebot"}) == "reply_comment" + + +def test_msg_to_notification_accepts_google_group_rewritten_github_mail(): + msg = EmailMessage() + msg["From"] = "'Eduard Carreras' via GISCE Bot " + msg["Reply-To"] = "gisce/erp " + msg["Message-ID"] = "" + msg["Subject"] = "Re: [gisce/erp] Example (PR #27853)" + msg["X-GitHub-Recipient"] = "giscebot" + msg["X-GitHub-Reason"] = "mention" + msg.set_content("https://github.com/gisce/erp/pull/27853#issuecomment-4547966148") + + n = msg_to_notification(msg, uid=6) + + assert n is not None + assert n.uid == 6 + assert n.from_addr == "'Eduard Carreras' via GISCE Bot " diff --git a/tests/test_parser.py b/tests/test_parser.py index 0695a70..5312235 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -46,7 +46,7 @@ def test_extract_pr_comment_context_before_workflow_run_link(): def test_mentions_are_actionable(): - assert classify_github_action("Re: [x] PR", "@pilipilisbot fes-ho") == "reply_comment" + assert classify_github_action("Re: [x] PR", "@pilipilisbot fes-ho", {"pilipilisbot"}) == "reply_comment" assert classify_github_action("Re: [x] PR", "You are receiving this because you were mentioned.") == "reply_comment" @@ -71,23 +71,23 @@ def test_review_request_uses_formal_review_flow(): subject = "Re: [gisce/erp] Permitir caller en los dominios (PR #27315)" body = "ecarreras requested review from @pilipilisbot on this pull request." - assert classify_github_action(subject, body) == "submit_review" - assert classify_work_intent(subject, body) == "review_only" + assert classify_github_action(subject, body, {"pilipilisbot"}) == "submit_review" + assert classify_work_intent(subject, body, {"pilipilisbot"}) == "review_only" def test_pr_review_followup_is_read_only_without_explicit_implementation(): subject = "Re: [gisce/erp] Permitir caller en los dominios (PR #27315)" body = "@pilipilisbot però la transacció en què s'executa que entra per eval_domain és amb una transacció readonly" - assert classify_github_action(subject, body) == "reply_comment" - assert classify_work_intent(subject, body) == "review_only" + assert classify_github_action(subject, body, {"pilipilisbot"}) == "reply_comment" + assert classify_work_intent(subject, body, {"pilipilisbot"}) == "review_only" def test_pr_followup_can_still_request_explicit_implementation(): subject = "Re: [gisce/erp] Permitir caller en los dominios (PR #27315)" body = "@pilipilisbot aplica el canvi i fes push" - assert classify_github_action(subject, body) == "reply_comment" + assert classify_github_action(subject, body, {"pilipilisbot"}) == "reply_comment" assert classify_work_intent(subject, body) == "work_allowed" @@ -95,5 +95,5 @@ def test_pr_assignment_allows_work(): subject = "Re: [gisce/erp] Permitir caller en los dominios (PR #27315)" body = "ecarreras assigned @pilipilisbot to this pull request." - assert classify_github_action(subject, body) == "open_issue" - assert classify_work_intent(subject, body) == "work_allowed" + assert classify_github_action(subject, body, {"pilipilisbot"}) == "open_issue" + assert classify_work_intent(subject, body, {"pilipilisbot"}) == "work_allowed" diff --git a/tests/test_policy.py b/tests/test_policy.py index 1ba4a94..afd80cd 100644 --- a/tests/test_policy.py +++ b/tests/test_policy.py @@ -10,6 +10,22 @@ def test_trusted_org_auto_trusted(): assert Policy(trusted_orgs={"gisce"}).decision(n, ctx, "reply_comment") == "auto_trusted" +def test_trusted_source_accepts_configured_forwarder(): + body = "@giscebot https://github.com/gisce/erp/pull/27853#issuecomment-4547966148" + n = Notification( + 1, + "", + "subj", + "'Eduard Carreras' via GISCE Bot ", + body, + auth={"spf": True, "dkim": True, "dmarc": True}, + ) + ctx = extract_github_context(body) + policy = Policy(source_from=("notifications@github.com", "giscebot@gisce.net"), trusted_orgs={"gisce"}) + + assert policy.decision(n, ctx, "reply_comment") == "auto_trusted" + + def test_enabled_repos_restricts_canary_scope(): n = Notification(1, "", "subj", "notifications@github.com", "", auth={"spf": True, "dkim": True, "dmarc": True}) erp = extract_github_context("@pilipilisbot https://github.com/gisce/erp/issues/1#issuecomment-1") @@ -46,6 +62,15 @@ def test_policy_from_file_loads_roles_and_rejects_unknown(tmp_path): raise AssertionError("expected ValueError for unknown repo role") +def test_policy_from_file_loads_bot_logins(tmp_path): + policy_file = tmp_path / "policy.json" + policy_file.write_text('{"botLogins": ["@GISCEBot", "pilipilisbot"]}') + + policy = Policy.from_file(policy_file) + + assert policy.bot_logins == {"giscebot", "pilipilisbot"} + + def test_policy_from_file_loads_feedback_learning(tmp_path): policy_file = tmp_path / "policy.json" policy_file.write_text('{"feedbackLearning": {"enabled": false, "minConfidence": 0.7, "autoApproveConfidence": 0.9, "maxEventsPerRun": 3, "model": "test-model", "thinking": "medium", "sessionId": "feedback-test"}}') diff --git a/tests/test_queue.py b/tests/test_queue.py index 584d07c..1a653fa 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -12,7 +12,7 @@ def notif(uid, mid, body): def policy(): - return Policy(trusted_orgs={"gisce"}) + return Policy(trusted_orgs={"gisce"}, bot_logins={"pilipilisbot"}) def test_enqueue_and_coalesce_same_work_key(tmp_path, monkeypatch): From f5cae8dbce8f3e4d2542202390acf442f96680c1 Mon Sep 17 00:00:00 2001 From: Pilipilis Date: Tue, 26 May 2026 20:11:45 +0000 Subject: [PATCH 03/14] docs: add mobile version screenshot --- .../issue-50/version-link-mobile.png | Bin 0 -> 56659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/screenshots/issue-50/version-link-mobile.png diff --git a/docs/screenshots/issue-50/version-link-mobile.png b/docs/screenshots/issue-50/version-link-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..5050a9bb0fc44781fc30539a5fadcc51e9a77e08 GIT binary patch literal 56659 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 Date: Tue, 26 May 2026 20:42:24 +0000 Subject: [PATCH 04/14] fix: preserve default bot login policy --- README.md | 4 +++ docs/policy-reference.md | 46 +++++++++++++++++++++++++++++-- policy.example.json | 8 +++++- src/github_agent_bridge/policy.py | 9 ++++-- tests/test_policy.py | 15 ++++++++++ 5 files changed, 76 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5a7fbf5..2a245b2 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,10 @@ The bridge is conservative by default. `policy.json` decides what is trusted, wh ```json { + "source": { + "from": ["notifications@github.com", "giscebot@gisce.net"] + }, + "botLogins": ["pilipilisbot"], "trustedOrgs": ["your-org"], "enabledRepos": ["your-org/your-repo"], "orgRoutes": { diff --git a/docs/policy-reference.md b/docs/policy-reference.md index 9e92fa9..3353656 100644 --- a/docs/policy-reference.md +++ b/docs/policy-reference.md @@ -44,11 +44,12 @@ gab --policy ~/.config/github-agent-bridge/policy.json enqueue-comment-url ... ```json { "source": { - "from": "notifications@github.com", + "from": ["notifications@github.com", "giscebot@gisce.net"], "requiredAuth": ["spf=pass", "dkim=pass", "dmarc=pass"], "requiredUrlPrefix": "https://github.com/", "messageIdDomain": "github.com" }, + "botLogins": ["pilipilisbot"], "trustedRepos": ["your-org/your-repo"], "trustedOrgs": ["your-org"], "enabledRepos": ["your-org/your-repo"], @@ -97,6 +98,7 @@ gab --policy ~/.config/github-agent-bridge/policy.json enqueue-comment-url ... | `orgRoutes` | object | `{}` | Per-owner delivery routes used when no `repoRoutes` entry matches. | | `repoRoles` | object | `{}` | Exact per-repo operating role. Takes precedence over `orgRoles`. | | `orgRoles` | object | `{}` | Per-owner operating role used when no `repoRoles` entry matches. | +| `botLogins` | array of strings | `["pilipilisbot"]` | GitHub login names that should count as addressed bots when classifying mentions, assignments, and review requests. | | `actions` | object | built-in action defaults | Maps classified notification actions to policy decisions. | | `promptOverrides` | object | `{}` | Optional Markdown files that replace selected packaged prompt resources. | | `feedbackLearning` | object | `{ "enabled": true, "minConfidence": 0.5, "autoApproveConfidence": 0.8 }` | Controls candidate capture, autonomous learning, and prompt threshold for feedback rules. | @@ -109,7 +111,7 @@ Unknown top-level keys are ignored by the current implementation. | Key | Type | Default | Meaning | | --- | --- | --- | --- | -| `from` | string | `notifications@github.com` | Required substring in the decoded email `From` header. | +| `from` | string or array of strings | `notifications@github.com` | Required substring in the decoded email `From` header. Use an array when GitHub notifications are forwarded or rewritten by a trusted mail gateway while GitHub reply headers and message ids are preserved. | | `requiredUrlPrefix` | string | `https://github.com/` | At least one extracted URL must start with this prefix. | | `messageIdDomain` | string | `github.com` | Required substring in the email `Message-ID`. | | `requiredAuth` | array of strings | currently documented only | Intended SPF/DKIM/DMARC requirements. See note below. | @@ -123,7 +125,7 @@ Current auth behavior: Source trust fails when any of these are false: ```text -source.from is in From header +any configured source.from value is in From header AND auth is OK AND at least one GitHub URL has source.requiredUrlPrefix AND Message-ID contains source.messageIdDomain @@ -131,6 +133,44 @@ AND Message-ID contains source.messageIdDomain If source trust fails, the decision is always `deny`. +Example with Google Groups or similar forwarded GitHub notifications: + +```json +{ + "source": { + "from": ["notifications@github.com", "giscebot@gisce.net"], + "requiredUrlPrefix": "https://github.com/", + "messageIdDomain": "github.com" + } +} +``` + +The parser still requires GitHub-specific headers, a GitHub reply address, GitHub message id content, and normal source trust before forwarded messages are accepted. + +## `botLogins` + +`botLogins` defines the GitHub accounts that count as the addressed bot for mention, assignment, and review-request classification. + +Default: + +```json +{ + "botLogins": ["pilipilisbot"] +} +``` + +Configured names are case-insensitive and may include or omit the leading `@`. + +Example: + +```json +{ + "botLogins": ["pilipilisbot", "giscebot"] +} +``` + +With this policy, comments that mention `@giscebot`, assignments to `@giscebot`, and review requests from `@giscebot` are classified the same way as the default `@pilipilisbot` notifications. Set an explicit empty array only if the deployment should rely on GitHub footer text such as “You are receiving this because you were mentioned” instead of login matching. + ## `trustedRepos` Exact repositories trusted for `trustedAuto` actions. diff --git a/policy.example.json b/policy.example.json index 24940cd..5f7edf0 100644 --- a/policy.example.json +++ b/policy.example.json @@ -1,6 +1,9 @@ { "source": { - "from": "notifications@github.com", + "from": [ + "notifications@github.com", + "giscebot@gisce.net" + ], "requiredAuth": [ "spf=pass", "dkim=pass", @@ -10,6 +13,9 @@ "messageIdDomain": "github.com" }, "trustedRepos": [], + "botLogins": [ + "pilipilisbot" + ], "trustedOrgs": [ "your-org" ], diff --git a/src/github_agent_bridge/policy.py b/src/github_agent_bridge/policy.py index c65c4e6..20c2ea1 100644 --- a/src/github_agent_bridge/policy.py +++ b/src/github_agent_bridge/policy.py @@ -21,6 +21,7 @@ "worktree", } DEFAULT_REPO_ROLE = "contributor" +DEFAULT_BOT_LOGINS = frozenset({"pilipilisbot"}) @dataclass(frozen=True) @@ -73,7 +74,7 @@ class Policy: org_routes: dict[str, Route] = field(default_factory=dict) repo_roles: dict[str, str] = field(default_factory=dict) org_roles: dict[str, str] = field(default_factory=dict) - bot_logins: set[str] = field(default_factory=set) + bot_logins: set[str] = field(default_factory=lambda: set(DEFAULT_BOT_LOGINS)) prompt_overrides: PromptOverrides = field(default_factory=PromptOverrides) feedback_learning: FeedbackLearning = field(default_factory=FeedbackLearning) @@ -162,7 +163,11 @@ def feedback_learning(raw: dict) -> FeedbackLearning: trusted_auto_actions=set(actions.get("trustedAuto", ["reply_comment", "open_issue", "submit_review", "sync_after_merge", "workflow_run_failed"])), repo_routes=routes(data.get("repoRoutes", {})), org_routes=routes(data.get("orgRoutes", {})), repo_roles=roles(data.get("repoRoles", {})), org_roles=roles(data.get("orgRoles", {})), - bot_logins={str(login).lower().lstrip("@") for login in data.get("botLogins", []) if str(login).strip()}, + bot_logins=( + {str(login).lower().lstrip("@") for login in data.get("botLogins", []) if str(login).strip()} + if "botLogins" in data + else set(DEFAULT_BOT_LOGINS) + ), prompt_overrides=prompt_overrides(data.get("promptOverrides", {})), feedback_learning=feedback_learning(data.get("feedbackLearning", {})), ) diff --git a/tests/test_policy.py b/tests/test_policy.py index afd80cd..e792025 100644 --- a/tests/test_policy.py +++ b/tests/test_policy.py @@ -71,6 +71,21 @@ def test_policy_from_file_loads_bot_logins(tmp_path): assert policy.bot_logins == {"giscebot", "pilipilisbot"} +def test_policy_keeps_default_bot_login_when_not_configured(tmp_path): + policy_file = tmp_path / "policy.json" + policy_file.write_text("{}") + + assert Policy().bot_logins == {"pilipilisbot"} + assert Policy.from_file(policy_file).bot_logins == {"pilipilisbot"} + + +def test_policy_allows_explicit_empty_bot_logins(tmp_path): + policy_file = tmp_path / "policy.json" + policy_file.write_text('{"botLogins": []}') + + assert Policy.from_file(policy_file).bot_logins == set() + + def test_policy_from_file_loads_feedback_learning(tmp_path): policy_file = tmp_path / "policy.json" policy_file.write_text('{"feedbackLearning": {"enabled": false, "minConfidence": 0.7, "autoApproveConfidence": 0.9, "maxEventsPerRun": 3, "model": "test-model", "thinking": "medium", "sessionId": "feedback-test"}}') From 5800393eff426a469ac006433ec9c13508265b44 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 26 May 2026 21:22:12 +0000 Subject: [PATCH 05/14] chore(release): 0.19.0 [skip ci] --- CHANGELOG.md | 13 +++++++++++++ pyproject.toml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 609eed6..6a9886b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ +## v0.19.0 (2026-05-26) + +### Documentation + +- Add mobile version screenshot + ([`f5cae8d`](https://github.com/pilipilisbot/github-agent-bridge/commit/f5cae8dbce8f3e4d2542202390acf442f96680c1)) + +### Features + +- Show bridge version in dashboard + ([`c2711d6`](https://github.com/pilipilisbot/github-agent-bridge/commit/c2711d63d1bab18f4df7a90600841da5f24439fa)) + + ## v0.18.7 (2026-05-25) ### Bug Fixes diff --git a/pyproject.toml b/pyproject.toml index 454b4f7..2c687c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "github-agent-bridge" -version = "0.18.7" +version = "0.19.0" description = "GitHub notification to OpenClaw agent bridge for Pilipilis" readme = "README.md" requires-python = ">=3.11" From e26c41b78a0e7f3d0a3452b8d7e91cc56ab81bb2 Mon Sep 17 00:00:00 2001 From: GISCE Bot Date: Tue, 26 May 2026 21:27:25 +0000 Subject: [PATCH 06/14] fix: treat approved reviews as non-actionable --- src/github_agent_bridge/dispatch.py | 3 +++ tests/test_github_followup_detection.py | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/github_agent_bridge/dispatch.py b/src/github_agent_bridge/dispatch.py index 666a5cb..b1eaeff 100644 --- a/src/github_agent_bridge/dispatch.py +++ b/src/github_agent_bridge/dispatch.py @@ -131,6 +131,9 @@ def is_non_actionable_review(self, ctx: GitHubContext) -> bool: review = self.pull_request_review(ctx) if not review: return False + state = (review.get("state") or "").upper() + if state == "APPROVED": + return True body = (review.get("body") or "").lower() non_actionable_markers = ( "generated no new comments", diff --git a/tests/test_github_followup_detection.py b/tests/test_github_followup_detection.py index 48eb7ca..780cf79 100644 --- a/tests/test_github_followup_detection.py +++ b/tests/test_github_followup_detection.py @@ -65,6 +65,28 @@ def test_visible_followup_ignores_review_comment_before_trigger(): assert github.visible_followup_after_trigger(ctx) is None +def test_approved_review_is_non_actionable(): + ctx = GitHubContext( + urls=["https://github.com/gisce/erp/pull/27805#pullrequestreview-4325056741"], + repo="gisce/erp", + issue_number=27805, + review_id=4325056741, + ) + github = RecordingGitHubClient( + { + ("api", "repos/gisce/erp/pulls/27805/reviews/4325056741"): json.dumps( + { + "state": "APPROVED", + "body": "Looks good after the follow-up commit.", + "submitted_at": "2026-05-20T03:59:00Z", + } + ), + } + ) + + assert github.is_non_actionable_review(ctx) is True + + def test_visible_followup_for_issue_comment_returns_newest_bot_comment_after_trigger(): ctx = GitHubContext( urls=["https://github.com/pilipilisbot/github-agent-bridge/pull/13#issuecomment-4524715895"], From ea5e9350bc4b726a5ec02f8e09cccd1c9adaeb47 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 26 May 2026 21:42:54 +0000 Subject: [PATCH 07/14] chore(release): 0.19.1 [skip ci] --- CHANGELOG.md | 14 ++++++++++++++ pyproject.toml | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a9886b..077e02a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ +## v0.19.1 (2026-05-26) + +### Bug Fixes + +- Preserve default bot login policy + ([`80dfee9`](https://github.com/pilipilisbot/github-agent-bridge/commit/80dfee9481dc8cdc011bc144ee50552ea3e21e43)) + +- Support forwarded github notifications + ([`70f8e13`](https://github.com/pilipilisbot/github-agent-bridge/commit/70f8e13c4c28af9d5e9b4db3ed3925315bc53f4a)) + +- Treat approved reviews as non-actionable + ([`e26c41b`](https://github.com/pilipilisbot/github-agent-bridge/commit/e26c41b78a0e7f3d0a3452b8d7e91cc56ab81bb2)) + + ## v0.19.0 (2026-05-26) ### Documentation diff --git a/pyproject.toml b/pyproject.toml index 2c687c8..a9a4748 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "github-agent-bridge" -version = "0.19.0" +version = "0.19.1" description = "GitHub notification to OpenClaw agent bridge for Pilipilis" readme = "README.md" requires-python = ">=3.11" From 747887182f28ba64dacd86523a178c4844d4a060 Mon Sep 17 00:00:00 2001 From: GISCE Bot Date: Tue, 26 May 2026 21:52:05 +0000 Subject: [PATCH 08/14] fix: accept github app bot trigger actors --- src/github_agent_bridge/actors.py | 2 +- tests/test_queue.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/github_agent_bridge/actors.py b/src/github_agent_bridge/actors.py index 4e6a457..fb668ad 100644 --- a/src/github_agent_bridge/actors.py +++ b/src/github_agent_bridge/actors.py @@ -11,7 +11,7 @@ from .models import GitHubContext, Notification -LOGIN_RE = re.compile(r"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?$") +LOGIN_RE = re.compile(r"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?(?:\[bot\])?$") RESERVED_SENDERS = {"github", "notifications"} diff --git a/tests/test_queue.py b/tests/test_queue.py index 1a653fa..b0dbe67 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -76,6 +76,35 @@ def fake_actor(ctx, *, gh_bin="gh"): assert job.trigger_actor_avatar_url == "https://avatars.githubusercontent.com/u/294235?v=4" +def test_enqueue_accepts_github_app_bot_actor_from_context(tmp_path, monkeypatch): + def fake_actor(ctx, *, gh_bin="gh"): + from github_agent_bridge.actors import TriggerActor + + return TriggerActor( + login="copilot-pull-request-reviewer[bot]", + avatar_url="https://avatars.githubusercontent.com/in/946600?v=4", + ) + + monkeypatch.setattr("github_agent_bridge.actors.github_actor_details_for_context", fake_actor) + q = JobQueue(tmp_path / "q.sqlite3") + + job, state = q.enqueue( + Notification( + uid=1, + message_id="<1@github.com>", + subject="Re: [gisce/erp] PR", + from_addr="GitHub ", + body="https://github.com/gisce/erp/pull/1#pullrequestreview-99", + auth={"spf": True, "dkim": True, "dmarc": True}, + ), + policy(), + ) + + assert state == "enqueued" + assert job.trigger_actor == "copilot-pull-request-reviewer[bot]" + assert job.trigger_actor_avatar_url == "https://avatars.githubusercontent.com/in/946600?v=4" + + def test_enqueue_falls_back_to_context_actor_for_generic_github_sender(tmp_path, monkeypatch): calls = [] From 9a45ea2834e4598c15d55213b0fca1f9ecde3e75 Mon Sep 17 00:00:00 2001 From: GISCE Bot Date: Wed, 27 May 2026 05:27:43 +0000 Subject: [PATCH 09/14] test: cover github app bot actor normalization --- tests/test_actors.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/tests/test_actors.py b/tests/test_actors.py index 6e207a4..6bd079e 100644 --- a/tests/test_actors.py +++ b/tests/test_actors.py @@ -4,7 +4,13 @@ import sqlite3 import subprocess -from github_agent_bridge.actors import actor_endpoint, backfill_trigger_actors, trigger_actor_from_notification +from github_agent_bridge.actors import ( + actor_details_from_github_payload, + actor_endpoint, + backfill_trigger_actors, + normalize_github_login, + trigger_actor_from_notification, +) from github_agent_bridge.models import GitHubContext, Notification from github_agent_bridge.policy import Policy from github_agent_bridge.queue import JobQueue @@ -23,6 +29,25 @@ def test_trigger_actor_from_notification_uses_github_sender_login(): assert trigger_actor_from_notification(n) == "ecarreras" +def test_normalize_github_login_accepts_github_app_bot_suffix(): + assert normalize_github_login("copilot-pull-request-reviewer[bot]") == "copilot-pull-request-reviewer[bot]" + + +def test_actor_details_from_github_payload_accepts_github_app_bot_login(): + actor = actor_details_from_github_payload( + { + "user": { + "login": "copilot-pull-request-reviewer[bot]", + "avatar_url": "https://avatars.githubusercontent.com/in/946600?v=4", + } + } + ) + + assert actor is not None + assert actor.login == "copilot-pull-request-reviewer[bot]" + assert actor.avatar_url == "https://avatars.githubusercontent.com/in/946600?v=4" + + def test_actor_endpoint_prefers_exact_trigger_resource(): assert actor_endpoint(GitHubContext(urls=[], repo="gisce/erp", issue_number=1, comment_id=99)) == "repos/gisce/erp/issues/comments/99" assert actor_endpoint(GitHubContext(urls=[], repo="gisce/erp", issue_number=1)) == "repos/gisce/erp/issues/1" From ba393caad9d90ace3fee580ba97606cdbda138c2 Mon Sep 17 00:00:00 2001 From: GISCE Bot Date: Wed, 27 May 2026 09:46:49 +0000 Subject: [PATCH 10/14] fix: route dashboard login and use configured gh --- src/github_agent_bridge/actors.py | 16 ++++++++++++---- src/github_agent_bridge/backend.py | 19 +++++++++++++++++-- tests/test_actors.py | 7 +++++++ tests/test_backend.py | 18 ++++++++++++++---- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/github_agent_bridge/actors.py b/src/github_agent_bridge/actors.py index fb668ad..94f916e 100644 --- a/src/github_agent_bridge/actors.py +++ b/src/github_agent_bridge/actors.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import os import re import sqlite3 import subprocess @@ -15,6 +16,10 @@ RESERVED_SENDERS = {"github", "notifications"} +def default_gh_bin() -> str: + return os.getenv("GITHUB_AGENT_BRIDGE_GH_BIN", "gh") + + @dataclass(frozen=True) class TriggerActor: login: str @@ -43,7 +48,8 @@ def trigger_actor_details_from_notification(notification: Notification) -> Trigg return TriggerActor(login=login, avatar_url=github_avatar_url(login)) if login else None -def trigger_actor_details_for_enqueue(notification: Notification, ctx: GitHubContext, *, gh_bin: str = "gh") -> TriggerActor | None: +def trigger_actor_details_for_enqueue(notification: Notification, ctx: GitHubContext, *, gh_bin: str | None = None) -> TriggerActor | None: + gh_bin = gh_bin or default_gh_bin() return github_actor_details_for_context(ctx, gh_bin=gh_bin) or trigger_actor_details_from_notification(notification) @@ -86,7 +92,8 @@ def actor_endpoint(ctx: GitHubContext) -> str | None: return None -def github_actor_details_for_context(ctx: GitHubContext, *, gh_bin: str = "gh") -> TriggerActor | None: +def github_actor_details_for_context(ctx: GitHubContext, *, gh_bin: str | None = None) -> TriggerActor | None: + gh_bin = gh_bin or default_gh_bin() endpoint = actor_endpoint(ctx) if endpoint is None: return None @@ -103,12 +110,13 @@ def github_actor_details_for_context(ctx: GitHubContext, *, gh_bin: str = "gh") return actor_details_from_github_payload(payload if isinstance(payload, dict) else {}) -def github_actor_for_context(ctx: GitHubContext, *, gh_bin: str = "gh") -> str | None: +def github_actor_for_context(ctx: GitHubContext, *, gh_bin: str | None = None) -> str | None: actor = github_actor_details_for_context(ctx, gh_bin=gh_bin) return actor.login if actor else None -def backfill_trigger_actors(db: str | Path, *, gh_bin: str = "gh", limit: int | None = None, dry_run: bool = False) -> dict[str, Any]: +def backfill_trigger_actors(db: str | Path, *, gh_bin: str | None = None, limit: int | None = None, dry_run: bool = False) -> dict[str, Any]: + gh_bin = gh_bin or default_gh_bin() path = Path(db).expanduser() if not path.exists(): return {"db_exists": False, "checked": 0, "updated": 0, "missing": 0, "dry_run": dry_run} diff --git a/src/github_agent_bridge/backend.py b/src/github_agent_bridge/backend.py index 7c00ecf..be140af 100644 --- a/src/github_agent_bridge/backend.py +++ b/src/github_agent_bridge/backend.py @@ -252,6 +252,15 @@ async def current_profile(request: Request) -> dict[str, Any]: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="not_authorized") return profile + async def require_dashboard_profile_or_login(request: Request) -> RedirectResponse | None: + try: + await current_profile(request) + except HTTPException as exc: + if exc.status_code == status.HTTP_401_UNAUTHORIZED and config.oauth_ready: + return RedirectResponse("/auth/login", status_code=status.HTTP_302_FOUND) + raise + return None + @app.exception_handler(sqlite3.OperationalError) async def database_unavailable(_: Request, exc: sqlite3.OperationalError) -> JSONResponse: return JSONResponse({"error": "database_unavailable", "detail": str(exc)}, status_code=status.HTTP_503_SERVICE_UNAVAILABLE, headers=_redacted_headers()) @@ -275,11 +284,17 @@ def dashboard_index() -> FileResponse: return FileResponse(index, headers=_redacted_headers()) @app.get("/") - def dashboard(_: str = Depends(current_user)) -> FileResponse: + async def dashboard(request: Request) -> Response: + redirect = await require_dashboard_profile_or_login(request) + if redirect is not None: + return redirect return dashboard_index() @app.get("/jobs/{job_path:path}") - def dashboard_job(job_path: str, _: str = Depends(current_user)) -> FileResponse: + async def dashboard_job(job_path: str, request: Request) -> Response: + redirect = await require_dashboard_profile_or_login(request) + if redirect is not None: + return redirect return dashboard_index() @app.get("/api/status") diff --git a/tests/test_actors.py b/tests/test_actors.py index 6bd079e..367f7b8 100644 --- a/tests/test_actors.py +++ b/tests/test_actors.py @@ -8,6 +8,7 @@ actor_details_from_github_payload, actor_endpoint, backfill_trigger_actors, + default_gh_bin, normalize_github_login, trigger_actor_from_notification, ) @@ -33,6 +34,12 @@ def test_normalize_github_login_accepts_github_app_bot_suffix(): assert normalize_github_login("copilot-pull-request-reviewer[bot]") == "copilot-pull-request-reviewer[bot]" +def test_default_gh_bin_uses_service_environment(monkeypatch): + monkeypatch.setenv("GITHUB_AGENT_BRIDGE_GH_BIN", "/opt/bin/gh") + + assert default_gh_bin() == "/opt/bin/gh" + + def test_actor_details_from_github_payload_accepts_github_app_bot_login(): actor = actor_details_from_github_payload( { diff --git a/tests/test_backend.py b/tests/test_backend.py index 423d068..a1c05da 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -111,17 +111,27 @@ def test_dashboard_job_frontend_route_falls_back_for_deep_links(tmp_path): assert "root" in response.text -def test_dashboard_ui_requires_auth_by_default(tmp_path): +def test_dashboard_ui_redirects_to_oauth_login_by_default(tmp_path): db = tmp_path / "bridge.sqlite3" static_dir = tmp_path / "static" static_dir.mkdir() (static_dir / "index.html").write_text("
", encoding="utf-8") JobQueue(db) - app = create_app(DashboardConfig(db=db, static_dir=static_dir, secret_key="secret", allowed_users={"alice"})) + app = create_app( + DashboardConfig( + db=db, + static_dir=static_dir, + secret_key="secret", + oauth_client_id="client", + oauth_client_secret="client-secret", + allowed_users={"alice"}, + ) + ) - response = TestClient(app).get("/") + response = TestClient(app, follow_redirects=False).get("/") - assert response.status_code == 401 + assert response.status_code == 302 + assert response.headers["location"] == "/auth/login" def test_dashboard_ui_reports_missing_build_after_auth(tmp_path): From a9f4c1828ff35283903bf2ede11ad8649fd2f5dd Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 27 May 2026 12:28:13 +0000 Subject: [PATCH 11/14] chore(release): 0.19.2 [skip ci] --- CHANGELOG.md | 16 ++++++++++++++++ pyproject.toml | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 077e02a..f91a11c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ +## v0.19.2 (2026-05-27) + +### Bug Fixes + +- Accept github app bot trigger actors + ([`7478871`](https://github.com/pilipilisbot/github-agent-bridge/commit/747887182f28ba64dacd86523a178c4844d4a060)) + +- Route dashboard login and use configured gh + ([`ba393ca`](https://github.com/pilipilisbot/github-agent-bridge/commit/ba393caad9d90ace3fee580ba97606cdbda138c2)) + +### Testing + +- Cover github app bot actor normalization + ([`9a45ea2`](https://github.com/pilipilisbot/github-agent-bridge/commit/9a45ea2834e4598c15d55213b0fca1f9ecde3e75)) + + ## v0.19.1 (2026-05-26) ### Bug Fixes diff --git a/pyproject.toml b/pyproject.toml index a9a4748..3348337 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "github-agent-bridge" -version = "0.19.1" +version = "0.19.2" description = "GitHub notification to OpenClaw agent bridge for Pilipilis" readme = "README.md" requires-python = ">=3.11" From 50d5d3d652052f9cbd5741d7cdc25c0787e4f182 Mon Sep 17 00:00:00 2001 From: Pilipilis Date: Thu, 28 May 2026 13:56:50 +0000 Subject: [PATCH 12/14] feat: allow dashboard access by github team --- docs/dashboard-github-oauth.md | 16 +++++++----- docs/installation.md | 1 + docs/operations.md | 1 + src/github_agent_bridge/backend.py | 29 ++++++++++++++++++--- tests/test_backend.py | 41 +++++++++++++++++++++++++++++- 5 files changed, 77 insertions(+), 11 deletions(-) diff --git a/docs/dashboard-github-oauth.md b/docs/dashboard-github-oauth.md index df5aadd..195bf04 100644 --- a/docs/dashboard-github-oauth.md +++ b/docs/dashboard-github-oauth.md @@ -44,9 +44,10 @@ loopback-only unless it is behind HTTPS and an authenticated reverse proxy. 6. Create the app, then copy the **Client ID**. 7. Generate a **Client secret** and copy it into the private environment file. -The dashboard currently requests `read:user read:org`. `read:org` is required -when access is granted by `GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_ORGS`, -especially for private organization membership. +The dashboard requests `read:user` by default. It also requests `read:org` when +access is granted by `GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_ORGS` or +`GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS`, especially for private +organization and team membership. ## Configure the Dashboard Environment @@ -59,6 +60,7 @@ GITHUB_OAUTH_CLIENT_ID=replace-with-github-oauth-client-id GITHUB_OAUTH_CLIENT_SECRET=replace-with-github-oauth-client-secret GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_USERS=your-github-login GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_ORGS= +GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS= EOF chmod 600 ~/.config/github-agent-bridge/env ``` @@ -77,12 +79,14 @@ Use at least one authorization allowlist: - `GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_USERS`: comma-separated GitHub logins. - `GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_ORGS`: comma-separated GitHub organizations whose members may access the dashboard. +- `GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS`: comma-separated GitHub teams in + `org/team-slug` form whose members may access the dashboard. -If both allowlists are empty, any authenticated GitHub user is accepted. That is +If all allowlists are empty, any authenticated GitHub user is accepted. That is only appropriate for isolated local development. -Team-level allowlists and per-repository dashboard scopes are part of the issue -#4 architecture but are not implemented in the current dashboard backend. +Per-repository dashboard scopes are part of the issue #4 architecture but are +not implemented in the current dashboard backend. ## Start the Service diff --git a/docs/installation.md b/docs/installation.md index f612f3c..8386931 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -245,6 +245,7 @@ GITHUB_AGENT_BRIDGE_DASHBOARD_SECRET_KEY=replace-with-random-secret GITHUB_OAUTH_CLIENT_ID=replace-with-github-oauth-client-id GITHUB_OAUTH_CLIENT_SECRET=replace-with-github-oauth-client-secret GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_USERS=your-github-login +GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS= EOF ``` diff --git a/docs/operations.md b/docs/operations.md index 2280335..3942e3c 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -127,6 +127,7 @@ GITHUB_OAUTH_CLIENT_ID=replace-with-github-oauth-client-id GITHUB_OAUTH_CLIENT_SECRET=replace-with-github-oauth-client-secret GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_USERS=alice,bob GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_ORGS=example-org +GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS=example-org/platform ``` See [`dashboard-github-oauth.md`](dashboard-github-oauth.md) for the GitHub diff --git a/src/github_agent_bridge/backend.py b/src/github_agent_bridge/backend.py index be140af..f18a80d 100644 --- a/src/github_agent_bridge/backend.py +++ b/src/github_agent_bridge/backend.py @@ -44,6 +44,7 @@ GITHUB_AUTHORIZE_URL = "https://github.com/login/oauth/authorize" GITHUB_TOKEN_URL = "https://github.com/login/oauth/access_token" GITHUB_USER_URL = "https://api.github.com/user" +GITHUB_TEAMS_URL = "https://api.github.com/user/teams" PROJECT_REPOSITORY_URL = "https://github.com/pilipilisbot/github-agent-bridge" SESSION_VERSION = 1 @@ -58,6 +59,7 @@ def __init__( oauth_client_secret: str | None = None, allowed_users: set[str] | None = None, allowed_orgs: set[str] | None = None, + allowed_teams: set[str] | None = None, require_auth: bool = True, static_dir: str | Path | None = None, ) -> None: @@ -67,6 +69,7 @@ def __init__( self.oauth_client_secret = oauth_client_secret or os.getenv("GITHUB_OAUTH_CLIENT_SECRET", "") self.allowed_users = allowed_users if allowed_users is not None else _csv_env("GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_USERS") self.allowed_orgs = allowed_orgs if allowed_orgs is not None else _csv_env("GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_ORGS") + self.allowed_teams = allowed_teams if allowed_teams is not None else _csv_env("GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS") self.require_auth = require_auth self.static_dir = Path(static_dir or os.getenv("GITHUB_AGENT_BRIDGE_DASHBOARD_STATIC_DIR", Path(__file__).with_name("dashboard_static"))).expanduser() @@ -76,7 +79,7 @@ def oauth_ready(self) -> bool: @property def has_authorization_policy(self) -> bool: - return bool(self.allowed_users or self.allowed_orgs) + return bool(self.allowed_users or self.allowed_orgs or self.allowed_teams) def _csv_env(name: str) -> set[str]: @@ -193,12 +196,23 @@ def _profile_from_login(login: str) -> dict[str, str]: } -def _github_json(url: str, token: str) -> dict[str, Any]: +def _github_json(url: str, token: str) -> Any: req = urllib.request.Request(url, headers={"Accept": "application/vnd.github+json", "Authorization": f"Bearer {token}", "User-Agent": "github-agent-bridge-dashboard"}) with urllib.request.urlopen(req, timeout=10) as response: return json.loads(response.read().decode("utf-8")) +def _team_key(team: dict[str, Any]) -> str | None: + org = team.get("organization") + if not isinstance(org, dict): + return None + org_login = str(org.get("login", "")).lower() + slug = str(team.get("slug", "")).lower() + if not org_login or not slug: + return None + return f"{org_login}/{slug}" + + def _exchange_code(config: DashboardConfig, code: str) -> str: data = urllib.parse.urlencode({ "client_id": config.oauth_client_id, @@ -223,7 +237,14 @@ def _is_allowed(config: DashboardConfig, login: str, token: str | None = None) - orgs = _github_json("https://api.github.com/user/orgs", token) except (urllib.error.URLError, TimeoutError): return False - return any(str(org.get("login", "")).lower() in config.allowed_orgs for org in orgs if isinstance(org, dict)) + if any(str(org.get("login", "")).lower() in config.allowed_orgs for org in orgs if isinstance(org, dict)): + return True + if config.allowed_teams and token: + try: + teams = _github_json(GITHUB_TEAMS_URL, token) + except (urllib.error.URLError, TimeoutError): + return False + return any(key in config.allowed_teams for key in (_team_key(team) for team in teams if isinstance(team, dict)) if key) return not config.has_authorization_policy @@ -435,7 +456,7 @@ def login() -> RedirectResponse: raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="oauth_not_configured") state = secrets.token_urlsafe(24) scopes = ["read:user"] - if config.allowed_orgs: + if config.allowed_orgs or config.allowed_teams: scopes.append("read:org") params = urllib.parse.urlencode({"client_id": config.oauth_client_id, "scope": " ".join(scopes), "state": state}) response = RedirectResponse(f"{GITHUB_AUTHORIZE_URL}?{params}", status_code=status.HTTP_302_FOUND) diff --git a/tests/test_backend.py b/tests/test_backend.py index a1c05da..cf78517 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -7,7 +7,7 @@ from fastapi.testclient import TestClient from github_agent_bridge import __version__ -from github_agent_bridge.backend import DashboardConfig, _encode_session, _session_stream_events, _sign, create_app +from github_agent_bridge.backend import DashboardConfig, _encode_session, _is_allowed, _session_stream_events, _sign, create_app from github_agent_bridge.dashboard_data import get_job_detail, job_session, job_session_events, job_session_transcript, list_job_actors, list_jobs, metrics_summary from github_agent_bridge.monitor import MonitorReport from github_agent_bridge.models import Notification @@ -488,6 +488,45 @@ def test_dashboard_oauth_login_requests_org_scope_only_for_org_allowlist(tmp_pat assert query["scope"] == ["read:user read:org"] +def test_dashboard_oauth_login_requests_org_scope_for_team_allowlist(tmp_path): + db = tmp_path / "bridge.sqlite3" + JobQueue(db) + app = create_app( + DashboardConfig( + db=db, + secret_key="secret", + oauth_client_id="client-id", + oauth_client_secret="client-secret", + allowed_teams={"example/platform"}, + ) + ) + + response = TestClient(app, follow_redirects=False).get("/auth/login") + + assert response.status_code == 302 + query = parse_qs(urlparse(response.headers["location"]).query) + assert query["scope"] == ["read:user read:org"] + + +def test_dashboard_session_authorization_allows_configured_team(monkeypatch): + def fake_github_json(url, token): + assert token == "token" + assert url.endswith("/user/teams") + return [ + {"slug": "other", "organization": {"login": "example"}}, + {"slug": "platform", "organization": {"login": "Example"}}, + ] + + monkeypatch.setattr("github_agent_bridge.backend._github_json", fake_github_json) + config = DashboardConfig( + secret_key="secret", + allowed_teams={"example/platform"}, + ) + + assert _is_allowed(config, "alice", "token") is True + assert _is_allowed(config, "alice", None) is False + + def test_dashboard_processes_exposes_live_executor_snapshot(tmp_path, monkeypatch): db = tmp_path / "bridge.sqlite3" q = JobQueue(db) From b615d43e21aae76900f5aad53109f545c1e987f7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 28 May 2026 14:22:50 +0000 Subject: [PATCH 13/14] chore(release): 0.20.0 [skip ci] --- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f91a11c..2ea97d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ +## v0.20.0 (2026-05-28) + +### Features + +- Allow dashboard access by github team + ([`50d5d3d`](https://github.com/pilipilisbot/github-agent-bridge/commit/50d5d3d652052f9cbd5741d7cdc25c0787e4f182)) + + ## v0.19.2 (2026-05-27) ### Bug Fixes diff --git a/pyproject.toml b/pyproject.toml index 3348337..0001ad4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "github-agent-bridge" -version = "0.19.2" +version = "0.20.0" description = "GitHub notification to OpenClaw agent bridge for Pilipilis" readme = "README.md" requires-python = ">=3.11" From d2e034c4b1b915541ecc7ff46d234293ecadc7a8 Mon Sep 17 00:00:00 2001 From: GISCE Bot Date: Fri, 29 May 2026 20:09:51 +0000 Subject: [PATCH 14/14] fix: keep dashboard session stream live --- dashboard/src/main.test.tsx | 9 +++++++++ dashboard/src/main.tsx | 15 ++++++++++++--- docs/operations.md | 13 +++++++++++++ .../{index-CBKWFP7m.js => index-BZrEZTtS.js} | 18 +++++++++--------- .../dashboard_static/index.html | 2 +- 5 files changed, 44 insertions(+), 13 deletions(-) rename src/github_agent_bridge/dashboard_static/assets/{index-CBKWFP7m.js => index-BZrEZTtS.js} (59%) diff --git a/dashboard/src/main.test.tsx b/dashboard/src/main.test.tsx index 64680fe..a71fff1 100644 --- a/dashboard/src/main.test.tsx +++ b/dashboard/src/main.test.tsx @@ -9,6 +9,7 @@ import { groupSessionEvents, groupTranscriptEntries, selectedJobIdFromPath, + shouldRefreshJobForSessionEvent, } from "./main"; describe("dashboard routing and API query helpers", () => { @@ -34,6 +35,14 @@ describe("dashboard routing and API query helpers", () => { expect(selectedJobIdFromPath("/jobs/not-a-number")).toBeNull(); expect(selectedJobIdFromPath("/jobs/45/activity")).toBeNull(); }); + + it("refreshes job data only for session events that can change job state", () => { + expect(shouldRefreshJobForSessionEvent("claimed")).toBe(true); + expect(shouldRefreshJobForSessionEvent("dispatch_finished")).toBe(true); + expect(shouldRefreshJobForSessionEvent("done")).toBe(true); + expect(shouldRefreshJobForSessionEvent("openclaw_stdout")).toBe(false); + expect(shouldRefreshJobForSessionEvent("openclaw_stderr")).toBe(false); + }); }); describe("status badges", () => { diff --git a/dashboard/src/main.tsx b/dashboard/src/main.tsx index ffcf898..8139f08 100644 --- a/dashboard/src/main.tsx +++ b/dashboard/src/main.tsx @@ -469,6 +469,10 @@ function transcriptKey(item: TranscriptEntry) { return `${item.timestamp ?? ""}:${item.role}:${item.kind}:${item.title}:${item.text}`; } +function shouldRefreshJobForSessionEvent(eventType: string) { + return ["claimed", "dispatch_started", "dispatch_finished", "done", "blocked", "denied", "waiting_approval"].includes(eventType); +} + function selectedJobIdFromPath(pathname = window.location.pathname) { const match = pathname.match(/^\/jobs\/(\d+)\/?$/); return match ? Number(match[1]) : null; @@ -519,8 +523,10 @@ function App() { queryClient.setQueryData<{ events: SessionEvent[] }>(["job-session-events", selectedJobId], (current) => ({ events: appendUniqueById(current?.events ?? [], event), })); - queryClient.invalidateQueries({ queryKey: ["job", selectedJobId] }); - queryClient.invalidateQueries({ queryKey: ["jobs"] }); + if (shouldRefreshJobForSessionEvent(event.event_type)) { + queryClient.invalidateQueries({ queryKey: ["job", selectedJobId] }); + queryClient.invalidateQueries({ queryKey: ["jobs"] }); + } }); source.addEventListener("transcript_entry", (message) => { const payload = parseSseData<{ job_id: number; entry: TranscriptEntry }>(message); @@ -530,7 +536,9 @@ function App() { })); }); source.onerror = () => { - source.close(); + queryClient.invalidateQueries({ queryKey: ["job", selectedJobId] }); + queryClient.invalidateQueries({ queryKey: ["job-session-events", selectedJobId] }); + queryClient.invalidateQueries({ queryKey: ["job-session-transcript", selectedJobId] }); }; return () => source.close(); }, [selectedJobId, queryClient]); @@ -1473,6 +1481,7 @@ export { groupSessionEvents, groupTranscriptEntries, selectedJobIdFromPath, + shouldRefreshJobForSessionEvent, }; const root = document.getElementById("root"); diff --git a/docs/operations.md b/docs/operations.md index 3942e3c..2b87a76 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -222,6 +222,19 @@ before it is returned to the authenticated dashboard. The process activity panel uses persisted process samples for a compact CPU history line chart when monitor samples exist, and falls back to the live executor snapshot otherwise. +When publishing the dashboard through nginx, disable buffering for the proxied +dashboard location so SSE events flush immediately: + +```nginx +location / { + proxy_pass http://127.0.0.1:8765; + proxy_http_version 1.1; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 1h; +} +``` + ## Operational SLOs | Signal | Target | diff --git a/src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js b/src/github_agent_bridge/dashboard_static/assets/index-BZrEZTtS.js similarity index 59% rename from src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js rename to src/github_agent_bridge/dashboard_static/assets/index-BZrEZTtS.js index ea1af40..a2cd7ab 100644 --- a/src/github_agent_bridge/dashboard_static/assets/index-CBKWFP7m.js +++ b/src/github_agent_bridge/dashboard_static/assets/index-BZrEZTtS.js @@ -1,4 +1,4 @@ -var vs=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=(e,t,s)=>(Lt(e,t,"read from private field"),s?s.call(e):t.get(e)),w=(e,t,s)=>t.has(e)?vs("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),m=(e,t,s,n)=>(Lt(e,t,"write to private field"),n?n.call(e,s):t.set(e,s),s),C=(e,t,s)=>(Lt(e,t,"access private method"),s);var St=(e,t,s,n)=>({set _(i){m(e,t,i,s)},get _(){return a(e,t,n)}});import{e as Fr,f as Er,g as Tr,r as Q,R as W,c as rs,b as Ar,C as ns,X as is,Y as as,T as os,L as Ir,a as er,B as tr,d as Lr}from"./charts-DRWoArYU.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();var Dt={exports:{}},ut={};/** +var vs=e=>{throw TypeError(e)};var qt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=(e,t,s)=>(qt(e,t,"read from private field"),s?s.call(e):t.get(e)),w=(e,t,s)=>t.has(e)?vs("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),m=(e,t,s,n)=>(qt(e,t,"write to private field"),n?n.call(e,s):t.set(e,s),s),C=(e,t,s)=>(qt(e,t,"access private method"),s);var St=(e,t,s,n)=>({set _(i){m(e,t,i,s)},get _(){return a(e,t,n)}});import{e as Fr,f as Er,g as Tr,r as D,R as W,c as rs,b as Ar,C as ns,X as is,Y as as,T as os,L as Ir,a as er,B as tr,d as qr}from"./charts-DRWoArYU.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&n(c)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();var Lt={exports:{}},ut={};/** * @license React * react-jsx-runtime.production.min.js * @@ -6,7 +6,7 @@ var vs=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=( * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var ws;function Dr(){if(ws)return ut;ws=1;var e=Fr(),t=Symbol.for("react.element"),s=Symbol.for("react.fragment"),n=Object.prototype.hasOwnProperty,i=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(l,d,u){var h,b={},j=null,v=null;u!==void 0&&(j=""+u),d.key!==void 0&&(j=""+d.key),d.ref!==void 0&&(v=d.ref);for(h in d)n.call(d,h)&&!o.hasOwnProperty(h)&&(b[h]=d[h]);if(l&&l.defaultProps)for(h in d=l.defaultProps,d)b[h]===void 0&&(b[h]=d[h]);return{$$typeof:t,type:l,key:j,ref:v,props:b,_owner:i.current}}return ut.Fragment=s,ut.jsx=c,ut.jsxs=c,ut}var js;function qr(){return js||(js=1,Dt.exports=Dr()),Dt.exports}var r=qr(),Rt={},Ns;function Qr(){if(Ns)return Rt;Ns=1;var e=Er();return Rt.createRoot=e.createRoot,Rt.hydrateRoot=e.hydrateRoot,Rt}var $r=Qr();const Ur=Tr($r);var kt=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Te,we,Je,Ks,zr=(Ks=class extends kt{constructor(){super();w(this,Te);w(this,we);w(this,Je);m(this,Je,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){a(this,we)||this.setEventListener(a(this,Je))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,we))==null||t.call(this),m(this,we,void 0))}setEventListener(t){var s;m(this,Je,t),(s=a(this,we))==null||s.call(this),m(this,we,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){a(this,Te)!==t&&(m(this,Te,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(s=>{s(t)})}isFocused(){var t;return typeof a(this,Te)=="boolean"?a(this,Te):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Te=new WeakMap,we=new WeakMap,Je=new WeakMap,Ks),ls=new zr,Kr={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},je,ss,Gs,Gr=(Gs=class{constructor(){w(this,je,Kr);w(this,ss,!1)}setTimeoutProvider(e){m(this,je,e)}setTimeout(e,t){return a(this,je).setTimeout(e,t)}clearTimeout(e){a(this,je).clearTimeout(e)}setInterval(e,t){return a(this,je).setInterval(e,t)}clearInterval(e){a(this,je).clearInterval(e)}},je=new WeakMap,ss=new WeakMap,Gs),Ee=new Gr;function Br(e){setTimeout(e,0)}var Hr=typeof window>"u"||"Deno"in globalThis;function J(){}function Jr(e,t){return typeof e=="function"?e(t):e}function $t(e){return typeof e=="number"&&e>=0&&e!==1/0}function sr(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Pe(e,t){return typeof e=="function"?e(t):e}function X(e,t){return typeof e=="function"?e(t):e}function ks(e,t){const{type:s="all",exact:n,fetchStatus:i,predicate:o,queryKey:c,stale:l}=e;if(c){if(n){if(t.queryHash!==cs(c,t.options))return!1}else if(!gt(t.queryKey,c))return!1}if(s!=="all"){const d=t.isActive();if(s==="active"&&!d||s==="inactive"&&d)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||i&&i!==t.state.fetchStatus||o&&!o(t))}function Cs(e,t){const{exact:s,status:n,predicate:i,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(s){if(xt(t.options.mutationKey)!==xt(o))return!1}else if(!gt(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||i&&!i(t))}function cs(e,t){return((t==null?void 0:t.queryKeyHashFn)||xt)(e)}function xt(e){return JSON.stringify(e,(t,s)=>zt(s)?Object.keys(s).sort().reduce((n,i)=>(n[i]=s[i],n),{}):s)}function gt(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(s=>gt(e[s],t[s])):!1}var Wr=Object.prototype.hasOwnProperty;function rr(e,t,s=0){if(e===t)return e;if(s>500)return t;const n=Ss(e)&&Ss(t);if(!n&&!(zt(e)&&zt(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),l=c.length,d=n?new Array(l):{};let u=0;for(let h=0;h{Ee.setTimeout(t,e)})}function Kt(e,t,s){return typeof s.structuralSharing=="function"?s.structuralSharing(e,t):s.structuralSharing!==!1?rr(e,t):t}function Xr(e,t,s=0){const n=[...e,t];return s&&n.length>s?n.slice(1):n}function Zr(e,t,s=0){const n=[t,...e];return s&&n.length>s?n.slice(0,-1):n}var ds=Symbol();function nr(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===ds?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ir(e,t){return typeof e=="function"?e(...t):!!e}function Yr(e,t,s){let n=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??(i=t()),n||(n=!0,i.aborted?s():i.addEventListener("abort",s,{once:!0})),i)}),e}var bt=(()=>{let e=()=>Hr;return{isServer(){return e()},setIsServer(t){e=t}}})();function Gt(){let e,t;const s=new Promise((i,o)=>{e=i,t=o});s.status="pending",s.catch(()=>{});function n(i){Object.assign(s,i),delete s.resolve,delete s.reject}return s.resolve=i=>{n({status:"fulfilled",value:i}),e(i)},s.reject=i=>{n({status:"rejected",reason:i}),t(i)},s}var en=Br;function tn(){let e=[],t=0,s=l=>{l()},n=l=>{l()},i=en;const o=l=>{t?e.push(l):i(()=>{s(l)})},c=()=>{const l=e;e=[],l.length&&i(()=>{n(()=>{l.forEach(d=>{s(d)})})})};return{batch:l=>{let d;t++;try{d=l()}finally{t--,t||c()}return d},batchCalls:l=>(...d)=>{o(()=>{l(...d)})},schedule:o,setNotifyFunction:l=>{s=l},setBatchNotifyFunction:l=>{n=l},setScheduler:l=>{i=l}}}var q=tn(),We,Ne,Ve,Bs,sn=(Bs=class extends kt{constructor(){super();w(this,We,!0);w(this,Ne);w(this,Ve);m(this,Ve,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",n)}}})}onSubscribe(){a(this,Ne)||this.setEventListener(a(this,Ve))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,Ne))==null||t.call(this),m(this,Ne,void 0))}setEventListener(t){var s;m(this,Ve,t),(s=a(this,Ne))==null||s.call(this),m(this,Ne,t(this.setOnline.bind(this)))}setOnline(t){a(this,We)!==t&&(m(this,We,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return a(this,We)}},We=new WeakMap,Ne=new WeakMap,Ve=new WeakMap,Bs),Ot=new sn;function rn(e){return Math.min(1e3*2**e,3e4)}function ar(e){return(e??"online")==="online"?Ot.isOnline():!0}var Bt=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function or(e){let t=!1,s=0,n;const i=Gt(),o=()=>i.status!=="pending",c=x=>{var g;if(!o()){const f=new Bt(x);j(f),(g=e.onCancel)==null||g.call(e,f)}},l=()=>{t=!0},d=()=>{t=!1},u=()=>ls.isFocused()&&(e.networkMode==="always"||Ot.isOnline())&&e.canRun(),h=()=>ar(e.networkMode)&&e.canRun(),b=x=>{o()||(n==null||n(),i.resolve(x))},j=x=>{o()||(n==null||n(),i.reject(x))},v=()=>new Promise(x=>{var g;n=f=>{(o()||u())&&x(f)},(g=e.onPause)==null||g.call(e)}).then(()=>{var x;n=void 0,o()||(x=e.onContinue)==null||x.call(e)}),p=()=>{if(o())return;let x;const g=s===0?e.initialPromise:void 0;try{x=g??e.fn()}catch(f){x=Promise.reject(f)}Promise.resolve(x).then(b).catch(f=>{var T;if(o())return;const k=e.retry??(bt.isServer()?0:3),R=e.retryDelay??rn,y=typeof R=="function"?R(s,f):R,F=k===!0||typeof k=="number"&&su()?void 0:v()).then(()=>{t?j(f):p()})})};return{promise:i,status:()=>i.status,cancel:c,continue:()=>(n==null||n(),i),cancelRetry:l,continueRetry:d,canStart:h,start:()=>(h()?p():v().then(p),i)}}var Ae,Hs,lr=(Hs=class{constructor(){w(this,Ae)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),$t(this.gcTime)&&m(this,Ae,Ee.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(bt.isServer()?1/0:300*1e3))}clearGcTimeout(){a(this,Ae)!==void 0&&(Ee.clearTimeout(a(this,Ae)),m(this,Ae,void 0))}},Ae=new WeakMap,Hs);function nn(e){return{onFetch:(t,s)=>{var h,b,j,v,p;const n=t.options,i=(j=(b=(h=t.fetchOptions)==null?void 0:h.meta)==null?void 0:b.fetchMore)==null?void 0:j.direction,o=((v=t.state.data)==null?void 0:v.pages)||[],c=((p=t.state.data)==null?void 0:p.pageParams)||[];let l={pages:[],pageParams:[]},d=0;const u=async()=>{let x=!1;const g=R=>{Yr(R,()=>t.signal,()=>x=!0)},f=nr(t.options,t.fetchOptions),k=async(R,y,F)=>{if(x)return Promise.reject(t.signal.reason);if(y==null&&R.pages.length)return Promise.resolve(R);const $=(()=>{const U={client:t.client,queryKey:t.queryKey,pageParam:y,direction:F?"backward":"forward",meta:t.options.meta};return g(U),U})(),_=await f($),{maxPages:M}=t.options,I=F?Zr:Xr;return{pages:I(R.pages,_,M),pageParams:I(R.pageParams,y,M)}};if(i&&o.length){const R=i==="backward",y=R?an:_s,F={pages:o,pageParams:c},T=y(n,F);l=await k(F,T,R)}else{const R=e??o.length;do{const y=d===0?c[0]??n.initialPageParam:_s(n,l);if(d>0&&y==null)break;l=await k(l,y),d++}while(d{var x,g;return(g=(x=t.options).persister)==null?void 0:g.call(x,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},s)}:t.fetchFn=u}}}function _s(e,{pages:t,pageParams:s}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,s[n],s):void 0}function an(e,{pages:t,pageParams:s}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,s[0],s):void 0}var Xe,Ie,Ze,te,Le,L,yt,De,V,cr,he,Js,on=(Js=class extends lr{constructor(t){super();w(this,V);w(this,Xe);w(this,Ie);w(this,Ze);w(this,te);w(this,Le);w(this,L);w(this,yt);w(this,De);m(this,De,!1),m(this,yt,t.defaultOptions),this.setOptions(t.options),this.observers=[],m(this,Le,t.client),m(this,te,a(this,Le).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,m(this,Ie,Ms(this.options)),this.state=t.state??a(this,Ie),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return a(this,Xe)}get promise(){var t;return(t=a(this,L))==null?void 0:t.promise}setOptions(t){if(this.options={...a(this,yt),...t},t!=null&&t._type&&m(this,Xe,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=Ms(this.options);s.data!==void 0&&(this.setState(Ps(s.data,s.dataUpdatedAt)),m(this,Ie,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&a(this,te).remove(this)}setData(t,s){const n=Kt(this.state.data,t,this.options);return C(this,V,he).call(this,{data:n,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),n}setState(t){C(this,V,he).call(this,{type:"setState",state:t})}cancel(t){var n,i;const s=(n=a(this,L))==null?void 0:n.promise;return(i=a(this,L))==null||i.cancel(t),s?s.then(J).catch(J):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return a(this,Ie)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>X(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ds||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Pe(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!sr(this.state.dataUpdatedAt,t)}onFocus(){var s;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,L))==null||s.continue()}onOnline(){var s;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,L))==null||s.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),a(this,te).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(s=>s!==t),this.observers.length||(a(this,L)&&(a(this,De)||C(this,V,cr).call(this)?a(this,L).cancel({revert:!0}):a(this,L).cancelRetry()),this.scheduleGc()),a(this,te).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||C(this,V,he).call(this,{type:"invalidate"})}async fetch(t,s){var u,h,b,j,v,p,x,g,f,k,R;if(this.state.fetchStatus!=="idle"&&((u=a(this,L))==null?void 0:u.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(a(this,L))return a(this,L).continueRetry(),a(this,L).promise}if(t&&this.setOptions(t),!this.options.queryFn){const y=this.observers.find(F=>F.options.queryFn);y&&this.setOptions(y.options)}const n=new AbortController,i=y=>{Object.defineProperty(y,"signal",{enumerable:!0,get:()=>(m(this,De,!0),n.signal)})},o=()=>{const y=nr(this.options,s),T=(()=>{const $={client:a(this,Le),queryKey:this.queryKey,meta:this.meta};return i($),$})();return m(this,De,!1),this.options.persister?this.options.persister(y,T,this):y(T)},l=(()=>{const y={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:a(this,Le),state:this.state,fetchFn:o};return i(y),y})(),d=a(this,Xe)==="infinite"?nn(this.options.pages):this.options.behavior;d==null||d.onFetch(l,this),m(this,Ze,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((h=l.fetchOptions)==null?void 0:h.meta))&&C(this,V,he).call(this,{type:"fetch",meta:(b=l.fetchOptions)==null?void 0:b.meta}),m(this,L,or({initialPromise:s==null?void 0:s.initialPromise,fn:l.fetchFn,onCancel:y=>{y instanceof Bt&&y.revert&&this.setState({...a(this,Ze),fetchStatus:"idle"}),n.abort()},onFail:(y,F)=>{C(this,V,he).call(this,{type:"failed",failureCount:y,error:F})},onPause:()=>{C(this,V,he).call(this,{type:"pause"})},onContinue:()=>{C(this,V,he).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0}));try{const y=await a(this,L).start();if(y===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(y),(v=(j=a(this,te).config).onSuccess)==null||v.call(j,y,this),(x=(p=a(this,te).config).onSettled)==null||x.call(p,y,this.state.error,this),y}catch(y){if(y instanceof Bt){if(y.silent)return a(this,L).promise;if(y.revert){if(this.state.data===void 0)throw y;return this.state.data}}throw C(this,V,he).call(this,{type:"error",error:y}),(f=(g=a(this,te).config).onError)==null||f.call(g,y,this),(R=(k=a(this,te).config).onSettled)==null||R.call(k,this.state.data,y,this),y}finally{this.scheduleGc()}}},Xe=new WeakMap,Ie=new WeakMap,Ze=new WeakMap,te=new WeakMap,Le=new WeakMap,L=new WeakMap,yt=new WeakMap,De=new WeakMap,V=new WeakSet,cr=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},he=function(t){const s=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...dr(n.data,this.options),fetchMeta:t.meta??null};case"success":const i={...n,...Ps(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return m(this,Ze,t.manual?i:void 0),i;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=s(this.state),q.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),a(this,te).notify({query:this,type:"updated",action:t})})},Js);function dr(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:ar(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Ps(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Ms(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,s=t!==void 0,n=s?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:s?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var H,S,vt,B,qe,Ye,fe,ke,wt,et,tt,Qe,$e,Ce,st,O,mt,Ht,Jt,Wt,Vt,Xt,Zt,Yt,ur,Ws,ln=(Ws=class extends kt{constructor(t,s){super();w(this,O);w(this,H);w(this,S);w(this,vt);w(this,B);w(this,qe);w(this,Ye);w(this,fe);w(this,ke);w(this,wt);w(this,et);w(this,tt);w(this,Qe);w(this,$e);w(this,Ce);w(this,st,new Set);this.options=s,m(this,H,t),m(this,ke,null),m(this,fe,Gt()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(a(this,S).addObserver(this),Os(a(this,S),this.options)?C(this,O,mt).call(this):this.updateResult(),C(this,O,Vt).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return es(a(this,S),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return es(a(this,S),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,C(this,O,Xt).call(this),C(this,O,Zt).call(this),a(this,S).removeObserver(this)}setOptions(t){const s=this.options,n=a(this,S);if(this.options=a(this,H).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof X(this.options.enabled,a(this,S))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");C(this,O,Yt).call(this),a(this,S).setOptions(this.options),s._defaulted&&!Ut(this.options,s)&&a(this,H).getQueryCache().notify({type:"observerOptionsUpdated",query:a(this,S),observer:this});const i=this.hasListeners();i&&Fs(a(this,S),n,this.options,s)&&C(this,O,mt).call(this),this.updateResult(),i&&(a(this,S)!==n||X(this.options.enabled,a(this,S))!==X(s.enabled,a(this,S))||Pe(this.options.staleTime,a(this,S))!==Pe(s.staleTime,a(this,S)))&&C(this,O,Ht).call(this);const o=C(this,O,Jt).call(this);i&&(a(this,S)!==n||X(this.options.enabled,a(this,S))!==X(s.enabled,a(this,S))||o!==a(this,Ce))&&C(this,O,Wt).call(this,o)}getOptimisticResult(t){const s=a(this,H).getQueryCache().build(a(this,H),t),n=this.createResult(s,t);return dn(this,n)&&(m(this,B,n),m(this,Ye,this.options),m(this,qe,a(this,S).state)),n}getCurrentResult(){return a(this,B)}trackResult(t,s){return new Proxy(t,{get:(n,i)=>(this.trackProp(i),s==null||s(i),i==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&a(this,fe).status==="pending"&&a(this,fe).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,i))})}trackProp(t){a(this,st).add(t)}getCurrentQuery(){return a(this,S)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=a(this,H).defaultQueryOptions(t),n=a(this,H).getQueryCache().build(a(this,H),s);return n.fetch().then(()=>this.createResult(n,s))}fetch(t){return C(this,O,mt).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),a(this,B)))}createResult(t,s){var M;const n=a(this,S),i=this.options,o=a(this,B),c=a(this,qe),l=a(this,Ye),u=t!==n?t.state:a(this,vt),{state:h}=t;let b={...h},j=!1,v;if(s._optimisticResults){const I=this.hasListeners(),U=!I&&Os(t,s),P=I&&Fs(t,n,s,i);(U||P)&&(b={...b,...dr(h.data,t.options)}),s._optimisticResults==="isRestoring"&&(b.fetchStatus="idle")}let{error:p,errorUpdatedAt:x,status:g}=b;v=b.data;let f=!1;if(s.placeholderData!==void 0&&v===void 0&&g==="pending"){let I;o!=null&&o.isPlaceholderData&&s.placeholderData===(l==null?void 0:l.placeholderData)?(I=o.data,f=!0):I=typeof s.placeholderData=="function"?s.placeholderData((M=a(this,tt))==null?void 0:M.state.data,a(this,tt)):s.placeholderData,I!==void 0&&(g="success",v=Kt(o==null?void 0:o.data,I,s),j=!0)}if(s.select&&v!==void 0&&!f)if(o&&v===(c==null?void 0:c.data)&&s.select===a(this,wt))v=a(this,et);else try{m(this,wt,s.select),v=s.select(v),v=Kt(o==null?void 0:o.data,v,s),m(this,et,v),m(this,ke,null)}catch(I){m(this,ke,I)}a(this,ke)&&(p=a(this,ke),v=a(this,et),x=Date.now(),g="error");const k=b.fetchStatus==="fetching",R=g==="pending",y=g==="error",F=R&&k,T=v!==void 0,_={status:g,fetchStatus:b.fetchStatus,isPending:R,isSuccess:g==="success",isError:y,isInitialLoading:F,isLoading:F,data:v,dataUpdatedAt:b.dataUpdatedAt,error:p,errorUpdatedAt:x,failureCount:b.fetchFailureCount,failureReason:b.fetchFailureReason,errorUpdateCount:b.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:b.dataUpdateCount>u.dataUpdateCount||b.errorUpdateCount>u.errorUpdateCount,isFetching:k,isRefetching:k&&!R,isLoadingError:y&&!T,isPaused:b.fetchStatus==="paused",isPlaceholderData:j,isRefetchError:y&&T,isStale:us(t,s),refetch:this.refetch,promise:a(this,fe),isEnabled:X(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const I=_.data!==void 0,U=_.status==="error"&&!I,P=oe=>{U?oe.reject(_.error):I&&oe.resolve(_.data)},xe=()=>{const oe=m(this,fe,_.promise=Gt());P(oe)},Z=a(this,fe);switch(Z.status){case"pending":t.queryHash===n.queryHash&&P(Z);break;case"fulfilled":(U||_.data!==Z.value)&&xe();break;case"rejected":(!U||_.error!==Z.reason)&&xe();break}}return _}updateResult(){const t=a(this,B),s=this.createResult(a(this,S),this.options);if(m(this,qe,a(this,S).state),m(this,Ye,this.options),a(this,qe).data!==void 0&&m(this,tt,a(this,S)),Ut(s,t))return;m(this,B,s);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:i}=this.options,o=typeof i=="function"?i():i;if(o==="all"||!o&&!a(this,st).size)return!0;const c=new Set(o??a(this,st));return this.options.throwOnError&&c.add("error"),Object.keys(a(this,B)).some(l=>{const d=l;return a(this,B)[d]!==t[d]&&c.has(d)})};C(this,O,ur).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&C(this,O,Vt).call(this)}},H=new WeakMap,S=new WeakMap,vt=new WeakMap,B=new WeakMap,qe=new WeakMap,Ye=new WeakMap,fe=new WeakMap,ke=new WeakMap,wt=new WeakMap,et=new WeakMap,tt=new WeakMap,Qe=new WeakMap,$e=new WeakMap,Ce=new WeakMap,st=new WeakMap,O=new WeakSet,mt=function(t){C(this,O,Yt).call(this);let s=a(this,S).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(J)),s},Ht=function(){C(this,O,Xt).call(this);const t=Pe(this.options.staleTime,a(this,S));if(bt.isServer()||a(this,B).isStale||!$t(t))return;const n=sr(a(this,B).dataUpdatedAt,t)+1;m(this,Qe,Ee.setTimeout(()=>{a(this,B).isStale||this.updateResult()},n))},Jt=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(a(this,S)):this.options.refetchInterval)??!1},Wt=function(t){C(this,O,Zt).call(this),m(this,Ce,t),!(bt.isServer()||X(this.options.enabled,a(this,S))===!1||!$t(a(this,Ce))||a(this,Ce)===0)&&m(this,$e,Ee.setInterval(()=>{(this.options.refetchIntervalInBackground||ls.isFocused())&&C(this,O,mt).call(this)},a(this,Ce)))},Vt=function(){C(this,O,Ht).call(this),C(this,O,Wt).call(this,C(this,O,Jt).call(this))},Xt=function(){a(this,Qe)!==void 0&&(Ee.clearTimeout(a(this,Qe)),m(this,Qe,void 0))},Zt=function(){a(this,$e)!==void 0&&(Ee.clearInterval(a(this,$e)),m(this,$e,void 0))},Yt=function(){const t=a(this,H).getQueryCache().build(a(this,H),this.options);if(t===a(this,S))return;const s=a(this,S);m(this,S,t),m(this,vt,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},ur=function(t){q.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(a(this,B))}),a(this,H).getQueryCache().notify({query:a(this,S),type:"observerResultsUpdated"})})},Ws);function cn(e,t){return X(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&X(t.retryOnMount,e)===!1)}function Os(e,t){return cn(e,t)||e.state.data!==void 0&&es(e,t,t.refetchOnMount)}function es(e,t,s){if(X(t.enabled,e)!==!1&&Pe(t.staleTime,e)!=="static"){const n=typeof s=="function"?s(e):s;return n==="always"||n!==!1&&us(e,t)}return!1}function Fs(e,t,s,n){return(e!==t||X(n.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&us(e,s)}function us(e,t){return X(t.enabled,e)!==!1&&e.isStaleByTime(Pe(t.staleTime,e))}function dn(e,t){return!Ut(e.getCurrentResult(),t)}var jt,le,z,Ue,ce,ve,Vs,un=(Vs=class extends lr{constructor(t){super();w(this,ce);w(this,jt);w(this,le);w(this,z);w(this,Ue);m(this,jt,t.client),this.mutationId=t.mutationId,m(this,z,t.mutationCache),m(this,le,[]),this.state=t.state||hn(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){a(this,le).includes(t)||(a(this,le).push(t),this.clearGcTimeout(),a(this,z).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){m(this,le,a(this,le).filter(s=>s!==t)),this.scheduleGc(),a(this,z).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){a(this,le).length||(this.state.status==="pending"?this.scheduleGc():a(this,z).remove(this))}continue(){var t;return((t=a(this,Ue))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,l,d,u,h,b,j,v,p,x,g,f,k,R,y,F,T,$;const s=()=>{C(this,ce,ve).call(this,{type:"continue"})},n={client:a(this,jt),meta:this.options.meta,mutationKey:this.options.mutationKey};m(this,Ue,or({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(_,M)=>{C(this,ce,ve).call(this,{type:"failed",failureCount:_,error:M})},onPause:()=>{C(this,ce,ve).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>a(this,z).canRun(this)}));const i=this.state.status==="pending",o=!a(this,Ue).canStart();try{if(i)s();else{C(this,ce,ve).call(this,{type:"pending",variables:t,isPaused:o}),a(this,z).config.onMutate&&await a(this,z).config.onMutate(t,this,n);const M=await((l=(c=this.options).onMutate)==null?void 0:l.call(c,t,n));M!==this.state.context&&C(this,ce,ve).call(this,{type:"pending",context:M,variables:t,isPaused:o})}const _=await a(this,Ue).start();return await((u=(d=a(this,z).config).onSuccess)==null?void 0:u.call(d,_,t,this.state.context,this,n)),await((b=(h=this.options).onSuccess)==null?void 0:b.call(h,_,t,this.state.context,n)),await((v=(j=a(this,z).config).onSettled)==null?void 0:v.call(j,_,null,this.state.variables,this.state.context,this,n)),await((x=(p=this.options).onSettled)==null?void 0:x.call(p,_,null,t,this.state.context,n)),C(this,ce,ve).call(this,{type:"success",data:_}),_}catch(_){try{await((f=(g=a(this,z).config).onError)==null?void 0:f.call(g,_,t,this.state.context,this,n))}catch(M){Promise.reject(M)}try{await((R=(k=this.options).onError)==null?void 0:R.call(k,_,t,this.state.context,n))}catch(M){Promise.reject(M)}try{await((F=(y=a(this,z).config).onSettled)==null?void 0:F.call(y,void 0,_,this.state.variables,this.state.context,this,n))}catch(M){Promise.reject(M)}try{await(($=(T=this.options).onSettled)==null?void 0:$.call(T,void 0,_,t,this.state.context,n))}catch(M){Promise.reject(M)}throw C(this,ce,ve).call(this,{type:"error",error:_}),_}finally{a(this,z).runNext(this)}}},jt=new WeakMap,le=new WeakMap,z=new WeakMap,Ue=new WeakMap,ce=new WeakSet,ve=function(t){const s=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=s(this.state),q.batch(()=>{a(this,le).forEach(n=>{n.onMutationUpdate(t)}),a(this,z).notify({mutation:this,type:"updated",action:t})})},Vs);function hn(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var me,ne,Nt,Xs,fn=(Xs=class extends kt{constructor(t={}){super();w(this,me);w(this,ne);w(this,Nt);this.config=t,m(this,me,new Set),m(this,ne,new Map),m(this,Nt,0)}build(t,s,n){const i=new un({client:t,mutationCache:this,mutationId:++St(this,Nt)._,options:t.defaultMutationOptions(s),state:n});return this.add(i),i}add(t){a(this,me).add(t);const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s);n?n.push(t):a(this,ne).set(s,[t])}this.notify({type:"added",mutation:t})}remove(t){if(a(this,me).delete(t)){const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s);if(n)if(n.length>1){const i=n.indexOf(t);i!==-1&&n.splice(i,1)}else n[0]===t&&a(this,ne).delete(s)}}this.notify({type:"removed",mutation:t})}canRun(t){const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s),i=n==null?void 0:n.find(o=>o.state.status==="pending");return!i||i===t}else return!0}runNext(t){var n;const s=_t(t);if(typeof s=="string"){const i=(n=a(this,ne).get(s))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(i==null?void 0:i.continue())??Promise.resolve()}else return Promise.resolve()}clear(){q.batch(()=>{a(this,me).forEach(t=>{this.notify({type:"removed",mutation:t})}),a(this,me).clear(),a(this,ne).clear()})}getAll(){return Array.from(a(this,me))}find(t){const s={exact:!0,...t};return this.getAll().find(n=>Cs(s,n))}findAll(t={}){return this.getAll().filter(s=>Cs(t,s))}notify(t){q.batch(()=>{this.listeners.forEach(s=>{s(t)})})}resumePausedMutations(){const t=this.getAll().filter(s=>s.state.isPaused);return q.batch(()=>Promise.all(t.map(s=>s.continue().catch(J))))}},me=new WeakMap,ne=new WeakMap,Nt=new WeakMap,Xs);function _t(e){var t;return(t=e.options.scope)==null?void 0:t.id}var de,Zs,mn=(Zs=class extends kt{constructor(t={}){super();w(this,de);this.config=t,m(this,de,new Map)}build(t,s,n){const i=s.queryKey,o=s.queryHash??cs(i,s);let c=this.get(o);return c||(c=new on({client:t,queryKey:i,queryHash:o,options:t.defaultQueryOptions(s),state:n,defaultOptions:t.getQueryDefaults(i)}),this.add(c)),c}add(t){a(this,de).has(t.queryHash)||(a(this,de).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const s=a(this,de).get(t.queryHash);s&&(t.destroy(),s===t&&a(this,de).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){q.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return a(this,de).get(t)}getAll(){return[...a(this,de).values()]}find(t){const s={exact:!0,...t};return this.getAll().find(n=>ks(s,n))}findAll(t={}){const s=this.getAll();return Object.keys(t).length>0?s.filter(n=>ks(t,n)):s}notify(t){q.batch(()=>{this.listeners.forEach(s=>{s(t)})})}onFocus(){q.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){q.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},de=new WeakMap,Zs),A,Se,Re,rt,nt,_e,it,at,Ys,pn=(Ys=class{constructor(e={}){w(this,A);w(this,Se);w(this,Re);w(this,rt);w(this,nt);w(this,_e);w(this,it);w(this,at);m(this,A,e.queryCache||new mn),m(this,Se,e.mutationCache||new fn),m(this,Re,e.defaultOptions||{}),m(this,rt,new Map),m(this,nt,new Map),m(this,_e,0)}mount(){St(this,_e)._++,a(this,_e)===1&&(m(this,it,ls.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,A).onFocus())})),m(this,at,Ot.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,A).onOnline())})))}unmount(){var e,t;St(this,_e)._--,a(this,_e)===0&&((e=a(this,it))==null||e.call(this),m(this,it,void 0),(t=a(this,at))==null||t.call(this),m(this,at,void 0))}isFetching(e){return a(this,A).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return a(this,Se).findAll({...e,status:"pending"}).length}getQueryData(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,A).get(t.queryHash))==null?void 0:s.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),s=a(this,A).build(this,t),n=s.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime(Pe(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return a(this,A).findAll(e).map(({queryKey:t,state:s})=>{const n=s.data;return[t,n]})}setQueryData(e,t,s){const n=this.defaultQueryOptions({queryKey:e}),i=a(this,A).get(n.queryHash),o=i==null?void 0:i.state.data,c=Jr(t,o);if(c!==void 0)return a(this,A).build(this,n).setData(c,{...s,manual:!0})}setQueriesData(e,t,s){return q.batch(()=>a(this,A).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,s)]))}getQueryState(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,A).get(t.queryHash))==null?void 0:s.state}removeQueries(e){const t=a(this,A);q.batch(()=>{t.findAll(e).forEach(s=>{t.remove(s)})})}resetQueries(e,t){const s=a(this,A);return q.batch(()=>(s.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const s={revert:!0,...t},n=q.batch(()=>a(this,A).findAll(e).map(i=>i.cancel(s)));return Promise.all(n).then(J).catch(J)}invalidateQueries(e,t={}){return q.batch(()=>(a(this,A).findAll(e).forEach(s=>{s.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const s={...t,cancelRefetch:t.cancelRefetch??!0},n=q.batch(()=>a(this,A).findAll(e).filter(i=>!i.isDisabled()&&!i.isStatic()).map(i=>{let o=i.fetch(void 0,s);return s.throwOnError||(o=o.catch(J)),i.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(J)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const s=a(this,A).build(this,t);return s.isStaleByTime(Pe(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(J).catch(J)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(J).catch(J)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Ot.isOnline()?a(this,Se).resumePausedMutations():Promise.resolve()}getQueryCache(){return a(this,A)}getMutationCache(){return a(this,Se)}getDefaultOptions(){return a(this,Re)}setDefaultOptions(e){m(this,Re,e)}setQueryDefaults(e,t){a(this,rt).set(xt(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...a(this,rt).values()],s={};return t.forEach(n=>{gt(e,n.queryKey)&&Object.assign(s,n.defaultOptions)}),s}setMutationDefaults(e,t){a(this,nt).set(xt(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...a(this,nt).values()],s={};return t.forEach(n=>{gt(e,n.mutationKey)&&Object.assign(s,n.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;const t={...a(this,Re).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=cs(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===ds&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...a(this,Re).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){a(this,A).clear(),a(this,Se).clear()}},A=new WeakMap,Se=new WeakMap,Re=new WeakMap,rt=new WeakMap,nt=new WeakMap,_e=new WeakMap,it=new WeakMap,at=new WeakMap,Ys),hr=Q.createContext(void 0),fr=e=>{const t=Q.useContext(hr);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},xn=({client:e,children:t})=>(Q.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),r.jsx(hr.Provider,{value:e,children:t})),mr=Q.createContext(!1),gn=()=>Q.useContext(mr);mr.Provider;function bn(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var yn=Q.createContext(bn()),vn=()=>Q.useContext(yn),wn=(e,t,s)=>{const n=s!=null&&s.state.error&&typeof e.throwOnError=="function"?ir(e.throwOnError,[s.state.error,s]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},jn=e=>{Q.useEffect(()=>{e.clearReset()},[e])},Nn=({result:e,errorResetBoundary:t,throwOnError:s,query:n,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(i&&e.data===void 0||ir(s,[e.error,n])),kn=e=>{if(e.suspense){const s=i=>i==="static"?i:Math.max(i??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...i)=>s(n(...i)):s(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Cn=(e,t)=>e.isLoading&&e.isFetching&&!t,Sn=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Es=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function Rn(e,t,s){var j,v,p,x;const n=gn(),i=vn(),o=fr(),c=o.defaultQueryOptions(e);(v=(j=o.getDefaultOptions().queries)==null?void 0:j._experimental_beforeQuery)==null||v.call(j,c);const l=o.getQueryCache().get(c.queryHash);c._optimisticResults=n?"isRestoring":"optimistic",kn(c),wn(c,i,l),jn(i);const d=!o.getQueryCache().get(c.queryHash),[u]=Q.useState(()=>new t(o,c)),h=u.getOptimisticResult(c),b=!n&&e.subscribed!==!1;if(Q.useSyncExternalStore(Q.useCallback(g=>{const f=b?u.subscribe(q.batchCalls(g)):J;return u.updateResult(),f},[u,b]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),Q.useEffect(()=>{u.setOptions(c)},[c,u]),Sn(c,h))throw Es(c,u,i);if(Nn({result:h,errorResetBoundary:i,throwOnError:c.throwOnError,query:l,suspense:c.suspense}))throw h.error;if((x=(p=o.getDefaultOptions().queries)==null?void 0:p._experimental_afterQuery)==null||x.call(p,c,h),c.experimental_prefetchInRender&&!bt.isServer()&&Cn(h,n)){const g=d?Es(c,u,i):l==null?void 0:l.promise;g==null||g.catch(J).finally(()=>{u.updateResult()})}return c.notifyOnChangeProps?h:u.trackResult(h)}function se(e,t){return Rn(e,ln)}/** + */var ws;function Lr(){if(ws)return ut;ws=1;var e=Fr(),t=Symbol.for("react.element"),s=Symbol.for("react.fragment"),n=Object.prototype.hasOwnProperty,i=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function c(l,d,u){var h,b={},j=null,v=null;u!==void 0&&(j=""+u),d.key!==void 0&&(j=""+d.key),d.ref!==void 0&&(v=d.ref);for(h in d)n.call(d,h)&&!o.hasOwnProperty(h)&&(b[h]=d[h]);if(l&&l.defaultProps)for(h in d=l.defaultProps,d)b[h]===void 0&&(b[h]=d[h]);return{$$typeof:t,type:l,key:j,ref:v,props:b,_owner:i.current}}return ut.Fragment=s,ut.jsx=c,ut.jsxs=c,ut}var js;function Dr(){return js||(js=1,Lt.exports=Lr()),Lt.exports}var r=Dr(),Rt={},Ns;function Qr(){if(Ns)return Rt;Ns=1;var e=Er();return Rt.createRoot=e.createRoot,Rt.hydrateRoot=e.hydrateRoot,Rt}var $r=Qr();const Ur=Tr($r);var kt=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Ae,we,Je,Ks,zr=(Ks=class extends kt{constructor(){super();w(this,Ae);w(this,we);w(this,Je);m(this,Je,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){a(this,we)||this.setEventListener(a(this,Je))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,we))==null||t.call(this),m(this,we,void 0))}setEventListener(t){var s;m(this,Je,t),(s=a(this,we))==null||s.call(this),m(this,we,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){a(this,Ae)!==t&&(m(this,Ae,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(s=>{s(t)})}isFocused(){var t;return typeof a(this,Ae)=="boolean"?a(this,Ae):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Ae=new WeakMap,we=new WeakMap,Je=new WeakMap,Ks),ls=new zr,Kr={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},je,ss,Gs,Gr=(Gs=class{constructor(){w(this,je,Kr);w(this,ss,!1)}setTimeoutProvider(e){m(this,je,e)}setTimeout(e,t){return a(this,je).setTimeout(e,t)}clearTimeout(e){a(this,je).clearTimeout(e)}setInterval(e,t){return a(this,je).setInterval(e,t)}clearInterval(e){a(this,je).clearInterval(e)}},je=new WeakMap,ss=new WeakMap,Gs),Te=new Gr;function Br(e){setTimeout(e,0)}var Hr=typeof window>"u"||"Deno"in globalThis;function J(){}function Jr(e,t){return typeof e=="function"?e(t):e}function $t(e){return typeof e=="number"&&e>=0&&e!==1/0}function sr(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Pe(e,t){return typeof e=="function"?e(t):e}function X(e,t){return typeof e=="function"?e(t):e}function ks(e,t){const{type:s="all",exact:n,fetchStatus:i,predicate:o,queryKey:c,stale:l}=e;if(c){if(n){if(t.queryHash!==cs(c,t.options))return!1}else if(!gt(t.queryKey,c))return!1}if(s!=="all"){const d=t.isActive();if(s==="active"&&!d||s==="inactive"&&d)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||i&&i!==t.state.fetchStatus||o&&!o(t))}function Cs(e,t){const{exact:s,status:n,predicate:i,mutationKey:o}=e;if(o){if(!t.options.mutationKey)return!1;if(s){if(xt(t.options.mutationKey)!==xt(o))return!1}else if(!gt(t.options.mutationKey,o))return!1}return!(n&&t.state.status!==n||i&&!i(t))}function cs(e,t){return((t==null?void 0:t.queryKeyHashFn)||xt)(e)}function xt(e){return JSON.stringify(e,(t,s)=>zt(s)?Object.keys(s).sort().reduce((n,i)=>(n[i]=s[i],n),{}):s)}function gt(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(s=>gt(e[s],t[s])):!1}var Wr=Object.prototype.hasOwnProperty;function rr(e,t,s=0){if(e===t)return e;if(s>500)return t;const n=Ss(e)&&Ss(t);if(!n&&!(zt(e)&&zt(t)))return t;const o=(n?e:Object.keys(e)).length,c=n?t:Object.keys(t),l=c.length,d=n?new Array(l):{};let u=0;for(let h=0;h{Te.setTimeout(t,e)})}function Kt(e,t,s){return typeof s.structuralSharing=="function"?s.structuralSharing(e,t):s.structuralSharing!==!1?rr(e,t):t}function Xr(e,t,s=0){const n=[...e,t];return s&&n.length>s?n.slice(1):n}function Zr(e,t,s=0){const n=[t,...e];return s&&n.length>s?n.slice(0,-1):n}var ds=Symbol();function nr(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===ds?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ir(e,t){return typeof e=="function"?e(...t):!!e}function Yr(e,t,s){let n=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??(i=t()),n||(n=!0,i.aborted?s():i.addEventListener("abort",s,{once:!0})),i)}),e}var bt=(()=>{let e=()=>Hr;return{isServer(){return e()},setIsServer(t){e=t}}})();function Gt(){let e,t;const s=new Promise((i,o)=>{e=i,t=o});s.status="pending",s.catch(()=>{});function n(i){Object.assign(s,i),delete s.resolve,delete s.reject}return s.resolve=i=>{n({status:"fulfilled",value:i}),e(i)},s.reject=i=>{n({status:"rejected",reason:i}),t(i)},s}var en=Br;function tn(){let e=[],t=0,s=l=>{l()},n=l=>{l()},i=en;const o=l=>{t?e.push(l):i(()=>{s(l)})},c=()=>{const l=e;e=[],l.length&&i(()=>{n(()=>{l.forEach(d=>{s(d)})})})};return{batch:l=>{let d;t++;try{d=l()}finally{t--,t||c()}return d},batchCalls:l=>(...d)=>{o(()=>{l(...d)})},schedule:o,setNotifyFunction:l=>{s=l},setBatchNotifyFunction:l=>{n=l},setScheduler:l=>{i=l}}}var L=tn(),We,Ne,Ve,Bs,sn=(Bs=class extends kt{constructor(){super();w(this,We,!0);w(this,Ne);w(this,Ve);m(this,Ve,t=>{if(typeof window<"u"&&window.addEventListener){const s=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",n)}}})}onSubscribe(){a(this,Ne)||this.setEventListener(a(this,Ve))}onUnsubscribe(){var t;this.hasListeners()||((t=a(this,Ne))==null||t.call(this),m(this,Ne,void 0))}setEventListener(t){var s;m(this,Ve,t),(s=a(this,Ne))==null||s.call(this),m(this,Ne,t(this.setOnline.bind(this)))}setOnline(t){a(this,We)!==t&&(m(this,We,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return a(this,We)}},We=new WeakMap,Ne=new WeakMap,Ve=new WeakMap,Bs),Ot=new sn;function rn(e){return Math.min(1e3*2**e,3e4)}function ar(e){return(e??"online")==="online"?Ot.isOnline():!0}var Bt=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function or(e){let t=!1,s=0,n;const i=Gt(),o=()=>i.status!=="pending",c=x=>{var g;if(!o()){const f=new Bt(x);j(f),(g=e.onCancel)==null||g.call(e,f)}},l=()=>{t=!0},d=()=>{t=!1},u=()=>ls.isFocused()&&(e.networkMode==="always"||Ot.isOnline())&&e.canRun(),h=()=>ar(e.networkMode)&&e.canRun(),b=x=>{o()||(n==null||n(),i.resolve(x))},j=x=>{o()||(n==null||n(),i.reject(x))},v=()=>new Promise(x=>{var g;n=f=>{(o()||u())&&x(f)},(g=e.onPause)==null||g.call(e)}).then(()=>{var x;n=void 0,o()||(x=e.onContinue)==null||x.call(e)}),p=()=>{if(o())return;let x;const g=s===0?e.initialPromise:void 0;try{x=g??e.fn()}catch(f){x=Promise.reject(f)}Promise.resolve(x).then(b).catch(f=>{var T;if(o())return;const k=e.retry??(bt.isServer()?0:3),R=e.retryDelay??rn,y=typeof R=="function"?R(s,f):R,F=k===!0||typeof k=="number"&&su()?void 0:v()).then(()=>{t?j(f):p()})})};return{promise:i,status:()=>i.status,cancel:c,continue:()=>(n==null||n(),i),cancelRetry:l,continueRetry:d,canStart:h,start:()=>(h()?p():v().then(p),i)}}var Ie,Hs,lr=(Hs=class{constructor(){w(this,Ie)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),$t(this.gcTime)&&m(this,Ie,Te.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(bt.isServer()?1/0:300*1e3))}clearGcTimeout(){a(this,Ie)!==void 0&&(Te.clearTimeout(a(this,Ie)),m(this,Ie,void 0))}},Ie=new WeakMap,Hs);function nn(e){return{onFetch:(t,s)=>{var h,b,j,v,p;const n=t.options,i=(j=(b=(h=t.fetchOptions)==null?void 0:h.meta)==null?void 0:b.fetchMore)==null?void 0:j.direction,o=((v=t.state.data)==null?void 0:v.pages)||[],c=((p=t.state.data)==null?void 0:p.pageParams)||[];let l={pages:[],pageParams:[]},d=0;const u=async()=>{let x=!1;const g=R=>{Yr(R,()=>t.signal,()=>x=!0)},f=nr(t.options,t.fetchOptions),k=async(R,y,F)=>{if(x)return Promise.reject(t.signal.reason);if(y==null&&R.pages.length)return Promise.resolve(R);const Q=(()=>{const $={client:t.client,queryKey:t.queryKey,pageParam:y,direction:F?"backward":"forward",meta:t.options.meta};return g($),$})(),_=await f(Q),{maxPages:M}=t.options,I=F?Zr:Xr;return{pages:I(R.pages,_,M),pageParams:I(R.pageParams,y,M)}};if(i&&o.length){const R=i==="backward",y=R?an:_s,F={pages:o,pageParams:c},T=y(n,F);l=await k(F,T,R)}else{const R=e??o.length;do{const y=d===0?c[0]??n.initialPageParam:_s(n,l);if(d>0&&y==null)break;l=await k(l,y),d++}while(d{var x,g;return(g=(x=t.options).persister)==null?void 0:g.call(x,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},s)}:t.fetchFn=u}}}function _s(e,{pages:t,pageParams:s}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,s[n],s):void 0}function an(e,{pages:t,pageParams:s}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,s[0],s):void 0}var Xe,qe,Ze,te,Le,q,yt,De,V,cr,he,Js,on=(Js=class extends lr{constructor(t){super();w(this,V);w(this,Xe);w(this,qe);w(this,Ze);w(this,te);w(this,Le);w(this,q);w(this,yt);w(this,De);m(this,De,!1),m(this,yt,t.defaultOptions),this.setOptions(t.options),this.observers=[],m(this,Le,t.client),m(this,te,a(this,Le).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,m(this,qe,Ms(this.options)),this.state=t.state??a(this,qe),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return a(this,Xe)}get promise(){var t;return(t=a(this,q))==null?void 0:t.promise}setOptions(t){if(this.options={...a(this,yt),...t},t!=null&&t._type&&m(this,Xe,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=Ms(this.options);s.data!==void 0&&(this.setState(Ps(s.data,s.dataUpdatedAt)),m(this,qe,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&a(this,te).remove(this)}setData(t,s){const n=Kt(this.state.data,t,this.options);return C(this,V,he).call(this,{data:n,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),n}setState(t){C(this,V,he).call(this,{type:"setState",state:t})}cancel(t){var n,i;const s=(n=a(this,q))==null?void 0:n.promise;return(i=a(this,q))==null||i.cancel(t),s?s.then(J).catch(J):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return a(this,qe)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>X(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ds||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Pe(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!sr(this.state.dataUpdatedAt,t)}onFocus(){var s;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,q))==null||s.continue()}onOnline(){var s;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(s=a(this,q))==null||s.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),a(this,te).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(s=>s!==t),this.observers.length||(a(this,q)&&(a(this,De)||C(this,V,cr).call(this)?a(this,q).cancel({revert:!0}):a(this,q).cancelRetry()),this.scheduleGc()),a(this,te).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||C(this,V,he).call(this,{type:"invalidate"})}async fetch(t,s){var u,h,b,j,v,p,x,g,f,k,R;if(this.state.fetchStatus!=="idle"&&((u=a(this,q))==null?void 0:u.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(a(this,q))return a(this,q).continueRetry(),a(this,q).promise}if(t&&this.setOptions(t),!this.options.queryFn){const y=this.observers.find(F=>F.options.queryFn);y&&this.setOptions(y.options)}const n=new AbortController,i=y=>{Object.defineProperty(y,"signal",{enumerable:!0,get:()=>(m(this,De,!0),n.signal)})},o=()=>{const y=nr(this.options,s),T=(()=>{const Q={client:a(this,Le),queryKey:this.queryKey,meta:this.meta};return i(Q),Q})();return m(this,De,!1),this.options.persister?this.options.persister(y,T,this):y(T)},l=(()=>{const y={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:a(this,Le),state:this.state,fetchFn:o};return i(y),y})(),d=a(this,Xe)==="infinite"?nn(this.options.pages):this.options.behavior;d==null||d.onFetch(l,this),m(this,Ze,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((h=l.fetchOptions)==null?void 0:h.meta))&&C(this,V,he).call(this,{type:"fetch",meta:(b=l.fetchOptions)==null?void 0:b.meta}),m(this,q,or({initialPromise:s==null?void 0:s.initialPromise,fn:l.fetchFn,onCancel:y=>{y instanceof Bt&&y.revert&&this.setState({...a(this,Ze),fetchStatus:"idle"}),n.abort()},onFail:(y,F)=>{C(this,V,he).call(this,{type:"failed",failureCount:y,error:F})},onPause:()=>{C(this,V,he).call(this,{type:"pause"})},onContinue:()=>{C(this,V,he).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0}));try{const y=await a(this,q).start();if(y===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(y),(v=(j=a(this,te).config).onSuccess)==null||v.call(j,y,this),(x=(p=a(this,te).config).onSettled)==null||x.call(p,y,this.state.error,this),y}catch(y){if(y instanceof Bt){if(y.silent)return a(this,q).promise;if(y.revert){if(this.state.data===void 0)throw y;return this.state.data}}throw C(this,V,he).call(this,{type:"error",error:y}),(f=(g=a(this,te).config).onError)==null||f.call(g,y,this),(R=(k=a(this,te).config).onSettled)==null||R.call(k,this.state.data,y,this),y}finally{this.scheduleGc()}}},Xe=new WeakMap,qe=new WeakMap,Ze=new WeakMap,te=new WeakMap,Le=new WeakMap,q=new WeakMap,yt=new WeakMap,De=new WeakMap,V=new WeakSet,cr=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},he=function(t){const s=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...dr(n.data,this.options),fetchMeta:t.meta??null};case"success":const i={...n,...Ps(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return m(this,Ze,t.manual?i:void 0),i;case"error":const o=t.error;return{...n,error:o,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:o,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=s(this.state),L.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),a(this,te).notify({query:this,type:"updated",action:t})})},Js);function dr(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:ar(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Ps(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Ms(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,s=t!==void 0,n=s?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:s?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var H,S,vt,B,Qe,Ye,fe,ke,wt,et,tt,$e,Ue,Ce,st,O,mt,Ht,Jt,Wt,Vt,Xt,Zt,Yt,ur,Ws,ln=(Ws=class extends kt{constructor(t,s){super();w(this,O);w(this,H);w(this,S);w(this,vt);w(this,B);w(this,Qe);w(this,Ye);w(this,fe);w(this,ke);w(this,wt);w(this,et);w(this,tt);w(this,$e);w(this,Ue);w(this,Ce);w(this,st,new Set);this.options=s,m(this,H,t),m(this,ke,null),m(this,fe,Gt()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(a(this,S).addObserver(this),Os(a(this,S),this.options)?C(this,O,mt).call(this):this.updateResult(),C(this,O,Vt).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return es(a(this,S),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return es(a(this,S),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,C(this,O,Xt).call(this),C(this,O,Zt).call(this),a(this,S).removeObserver(this)}setOptions(t){const s=this.options,n=a(this,S);if(this.options=a(this,H).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof X(this.options.enabled,a(this,S))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");C(this,O,Yt).call(this),a(this,S).setOptions(this.options),s._defaulted&&!Ut(this.options,s)&&a(this,H).getQueryCache().notify({type:"observerOptionsUpdated",query:a(this,S),observer:this});const i=this.hasListeners();i&&Fs(a(this,S),n,this.options,s)&&C(this,O,mt).call(this),this.updateResult(),i&&(a(this,S)!==n||X(this.options.enabled,a(this,S))!==X(s.enabled,a(this,S))||Pe(this.options.staleTime,a(this,S))!==Pe(s.staleTime,a(this,S)))&&C(this,O,Ht).call(this);const o=C(this,O,Jt).call(this);i&&(a(this,S)!==n||X(this.options.enabled,a(this,S))!==X(s.enabled,a(this,S))||o!==a(this,Ce))&&C(this,O,Wt).call(this,o)}getOptimisticResult(t){const s=a(this,H).getQueryCache().build(a(this,H),t),n=this.createResult(s,t);return dn(this,n)&&(m(this,B,n),m(this,Ye,this.options),m(this,Qe,a(this,S).state)),n}getCurrentResult(){return a(this,B)}trackResult(t,s){return new Proxy(t,{get:(n,i)=>(this.trackProp(i),s==null||s(i),i==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&a(this,fe).status==="pending"&&a(this,fe).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(n,i))})}trackProp(t){a(this,st).add(t)}getCurrentQuery(){return a(this,S)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=a(this,H).defaultQueryOptions(t),n=a(this,H).getQueryCache().build(a(this,H),s);return n.fetch().then(()=>this.createResult(n,s))}fetch(t){return C(this,O,mt).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),a(this,B)))}createResult(t,s){var M;const n=a(this,S),i=this.options,o=a(this,B),c=a(this,Qe),l=a(this,Ye),u=t!==n?t.state:a(this,vt),{state:h}=t;let b={...h},j=!1,v;if(s._optimisticResults){const I=this.hasListeners(),$=!I&&Os(t,s),P=I&&Fs(t,n,s,i);($||P)&&(b={...b,...dr(h.data,t.options)}),s._optimisticResults==="isRestoring"&&(b.fetchStatus="idle")}let{error:p,errorUpdatedAt:x,status:g}=b;v=b.data;let f=!1;if(s.placeholderData!==void 0&&v===void 0&&g==="pending"){let I;o!=null&&o.isPlaceholderData&&s.placeholderData===(l==null?void 0:l.placeholderData)?(I=o.data,f=!0):I=typeof s.placeholderData=="function"?s.placeholderData((M=a(this,tt))==null?void 0:M.state.data,a(this,tt)):s.placeholderData,I!==void 0&&(g="success",v=Kt(o==null?void 0:o.data,I,s),j=!0)}if(s.select&&v!==void 0&&!f)if(o&&v===(c==null?void 0:c.data)&&s.select===a(this,wt))v=a(this,et);else try{m(this,wt,s.select),v=s.select(v),v=Kt(o==null?void 0:o.data,v,s),m(this,et,v),m(this,ke,null)}catch(I){m(this,ke,I)}a(this,ke)&&(p=a(this,ke),v=a(this,et),x=Date.now(),g="error");const k=b.fetchStatus==="fetching",R=g==="pending",y=g==="error",F=R&&k,T=v!==void 0,_={status:g,fetchStatus:b.fetchStatus,isPending:R,isSuccess:g==="success",isError:y,isInitialLoading:F,isLoading:F,data:v,dataUpdatedAt:b.dataUpdatedAt,error:p,errorUpdatedAt:x,failureCount:b.fetchFailureCount,failureReason:b.fetchFailureReason,errorUpdateCount:b.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:b.dataUpdateCount>u.dataUpdateCount||b.errorUpdateCount>u.errorUpdateCount,isFetching:k,isRefetching:k&&!R,isLoadingError:y&&!T,isPaused:b.fetchStatus==="paused",isPlaceholderData:j,isRefetchError:y&&T,isStale:us(t,s),refetch:this.refetch,promise:a(this,fe),isEnabled:X(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const I=_.data!==void 0,$=_.status==="error"&&!I,P=oe=>{$?oe.reject(_.error):I&&oe.resolve(_.data)},xe=()=>{const oe=m(this,fe,_.promise=Gt());P(oe)},Z=a(this,fe);switch(Z.status){case"pending":t.queryHash===n.queryHash&&P(Z);break;case"fulfilled":($||_.data!==Z.value)&&xe();break;case"rejected":(!$||_.error!==Z.reason)&&xe();break}}return _}updateResult(){const t=a(this,B),s=this.createResult(a(this,S),this.options);if(m(this,Qe,a(this,S).state),m(this,Ye,this.options),a(this,Qe).data!==void 0&&m(this,tt,a(this,S)),Ut(s,t))return;m(this,B,s);const n=()=>{if(!t)return!0;const{notifyOnChangeProps:i}=this.options,o=typeof i=="function"?i():i;if(o==="all"||!o&&!a(this,st).size)return!0;const c=new Set(o??a(this,st));return this.options.throwOnError&&c.add("error"),Object.keys(a(this,B)).some(l=>{const d=l;return a(this,B)[d]!==t[d]&&c.has(d)})};C(this,O,ur).call(this,{listeners:n()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&C(this,O,Vt).call(this)}},H=new WeakMap,S=new WeakMap,vt=new WeakMap,B=new WeakMap,Qe=new WeakMap,Ye=new WeakMap,fe=new WeakMap,ke=new WeakMap,wt=new WeakMap,et=new WeakMap,tt=new WeakMap,$e=new WeakMap,Ue=new WeakMap,Ce=new WeakMap,st=new WeakMap,O=new WeakSet,mt=function(t){C(this,O,Yt).call(this);let s=a(this,S).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(J)),s},Ht=function(){C(this,O,Xt).call(this);const t=Pe(this.options.staleTime,a(this,S));if(bt.isServer()||a(this,B).isStale||!$t(t))return;const n=sr(a(this,B).dataUpdatedAt,t)+1;m(this,$e,Te.setTimeout(()=>{a(this,B).isStale||this.updateResult()},n))},Jt=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(a(this,S)):this.options.refetchInterval)??!1},Wt=function(t){C(this,O,Zt).call(this),m(this,Ce,t),!(bt.isServer()||X(this.options.enabled,a(this,S))===!1||!$t(a(this,Ce))||a(this,Ce)===0)&&m(this,Ue,Te.setInterval(()=>{(this.options.refetchIntervalInBackground||ls.isFocused())&&C(this,O,mt).call(this)},a(this,Ce)))},Vt=function(){C(this,O,Ht).call(this),C(this,O,Wt).call(this,C(this,O,Jt).call(this))},Xt=function(){a(this,$e)!==void 0&&(Te.clearTimeout(a(this,$e)),m(this,$e,void 0))},Zt=function(){a(this,Ue)!==void 0&&(Te.clearInterval(a(this,Ue)),m(this,Ue,void 0))},Yt=function(){const t=a(this,H).getQueryCache().build(a(this,H),this.options);if(t===a(this,S))return;const s=a(this,S);m(this,S,t),m(this,vt,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},ur=function(t){L.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(a(this,B))}),a(this,H).getQueryCache().notify({query:a(this,S),type:"observerResultsUpdated"})})},Ws);function cn(e,t){return X(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&X(t.retryOnMount,e)===!1)}function Os(e,t){return cn(e,t)||e.state.data!==void 0&&es(e,t,t.refetchOnMount)}function es(e,t,s){if(X(t.enabled,e)!==!1&&Pe(t.staleTime,e)!=="static"){const n=typeof s=="function"?s(e):s;return n==="always"||n!==!1&&us(e,t)}return!1}function Fs(e,t,s,n){return(e!==t||X(n.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&us(e,s)}function us(e,t){return X(t.enabled,e)!==!1&&e.isStaleByTime(Pe(t.staleTime,e))}function dn(e,t){return!Ut(e.getCurrentResult(),t)}var jt,le,z,ze,ce,ve,Vs,un=(Vs=class extends lr{constructor(t){super();w(this,ce);w(this,jt);w(this,le);w(this,z);w(this,ze);m(this,jt,t.client),this.mutationId=t.mutationId,m(this,z,t.mutationCache),m(this,le,[]),this.state=t.state||hn(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){a(this,le).includes(t)||(a(this,le).push(t),this.clearGcTimeout(),a(this,z).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){m(this,le,a(this,le).filter(s=>s!==t)),this.scheduleGc(),a(this,z).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){a(this,le).length||(this.state.status==="pending"?this.scheduleGc():a(this,z).remove(this))}continue(){var t;return((t=a(this,ze))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var c,l,d,u,h,b,j,v,p,x,g,f,k,R,y,F,T,Q;const s=()=>{C(this,ce,ve).call(this,{type:"continue"})},n={client:a(this,jt),meta:this.options.meta,mutationKey:this.options.mutationKey};m(this,ze,or({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(_,M)=>{C(this,ce,ve).call(this,{type:"failed",failureCount:_,error:M})},onPause:()=>{C(this,ce,ve).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>a(this,z).canRun(this)}));const i=this.state.status==="pending",o=!a(this,ze).canStart();try{if(i)s();else{C(this,ce,ve).call(this,{type:"pending",variables:t,isPaused:o}),a(this,z).config.onMutate&&await a(this,z).config.onMutate(t,this,n);const M=await((l=(c=this.options).onMutate)==null?void 0:l.call(c,t,n));M!==this.state.context&&C(this,ce,ve).call(this,{type:"pending",context:M,variables:t,isPaused:o})}const _=await a(this,ze).start();return await((u=(d=a(this,z).config).onSuccess)==null?void 0:u.call(d,_,t,this.state.context,this,n)),await((b=(h=this.options).onSuccess)==null?void 0:b.call(h,_,t,this.state.context,n)),await((v=(j=a(this,z).config).onSettled)==null?void 0:v.call(j,_,null,this.state.variables,this.state.context,this,n)),await((x=(p=this.options).onSettled)==null?void 0:x.call(p,_,null,t,this.state.context,n)),C(this,ce,ve).call(this,{type:"success",data:_}),_}catch(_){try{await((f=(g=a(this,z).config).onError)==null?void 0:f.call(g,_,t,this.state.context,this,n))}catch(M){Promise.reject(M)}try{await((R=(k=this.options).onError)==null?void 0:R.call(k,_,t,this.state.context,n))}catch(M){Promise.reject(M)}try{await((F=(y=a(this,z).config).onSettled)==null?void 0:F.call(y,void 0,_,this.state.variables,this.state.context,this,n))}catch(M){Promise.reject(M)}try{await((Q=(T=this.options).onSettled)==null?void 0:Q.call(T,void 0,_,t,this.state.context,n))}catch(M){Promise.reject(M)}throw C(this,ce,ve).call(this,{type:"error",error:_}),_}finally{a(this,z).runNext(this)}}},jt=new WeakMap,le=new WeakMap,z=new WeakMap,ze=new WeakMap,ce=new WeakSet,ve=function(t){const s=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=s(this.state),L.batch(()=>{a(this,le).forEach(n=>{n.onMutationUpdate(t)}),a(this,z).notify({mutation:this,type:"updated",action:t})})},Vs);function hn(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var me,ne,Nt,Xs,fn=(Xs=class extends kt{constructor(t={}){super();w(this,me);w(this,ne);w(this,Nt);this.config=t,m(this,me,new Set),m(this,ne,new Map),m(this,Nt,0)}build(t,s,n){const i=new un({client:t,mutationCache:this,mutationId:++St(this,Nt)._,options:t.defaultMutationOptions(s),state:n});return this.add(i),i}add(t){a(this,me).add(t);const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s);n?n.push(t):a(this,ne).set(s,[t])}this.notify({type:"added",mutation:t})}remove(t){if(a(this,me).delete(t)){const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s);if(n)if(n.length>1){const i=n.indexOf(t);i!==-1&&n.splice(i,1)}else n[0]===t&&a(this,ne).delete(s)}}this.notify({type:"removed",mutation:t})}canRun(t){const s=_t(t);if(typeof s=="string"){const n=a(this,ne).get(s),i=n==null?void 0:n.find(o=>o.state.status==="pending");return!i||i===t}else return!0}runNext(t){var n;const s=_t(t);if(typeof s=="string"){const i=(n=a(this,ne).get(s))==null?void 0:n.find(o=>o!==t&&o.state.isPaused);return(i==null?void 0:i.continue())??Promise.resolve()}else return Promise.resolve()}clear(){L.batch(()=>{a(this,me).forEach(t=>{this.notify({type:"removed",mutation:t})}),a(this,me).clear(),a(this,ne).clear()})}getAll(){return Array.from(a(this,me))}find(t){const s={exact:!0,...t};return this.getAll().find(n=>Cs(s,n))}findAll(t={}){return this.getAll().filter(s=>Cs(t,s))}notify(t){L.batch(()=>{this.listeners.forEach(s=>{s(t)})})}resumePausedMutations(){const t=this.getAll().filter(s=>s.state.isPaused);return L.batch(()=>Promise.all(t.map(s=>s.continue().catch(J))))}},me=new WeakMap,ne=new WeakMap,Nt=new WeakMap,Xs);function _t(e){var t;return(t=e.options.scope)==null?void 0:t.id}var de,Zs,mn=(Zs=class extends kt{constructor(t={}){super();w(this,de);this.config=t,m(this,de,new Map)}build(t,s,n){const i=s.queryKey,o=s.queryHash??cs(i,s);let c=this.get(o);return c||(c=new on({client:t,queryKey:i,queryHash:o,options:t.defaultQueryOptions(s),state:n,defaultOptions:t.getQueryDefaults(i)}),this.add(c)),c}add(t){a(this,de).has(t.queryHash)||(a(this,de).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const s=a(this,de).get(t.queryHash);s&&(t.destroy(),s===t&&a(this,de).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){L.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return a(this,de).get(t)}getAll(){return[...a(this,de).values()]}find(t){const s={exact:!0,...t};return this.getAll().find(n=>ks(s,n))}findAll(t={}){const s=this.getAll();return Object.keys(t).length>0?s.filter(n=>ks(t,n)):s}notify(t){L.batch(()=>{this.listeners.forEach(s=>{s(t)})})}onFocus(){L.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){L.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},de=new WeakMap,Zs),A,Se,Re,rt,nt,_e,it,at,Ys,pn=(Ys=class{constructor(e={}){w(this,A);w(this,Se);w(this,Re);w(this,rt);w(this,nt);w(this,_e);w(this,it);w(this,at);m(this,A,e.queryCache||new mn),m(this,Se,e.mutationCache||new fn),m(this,Re,e.defaultOptions||{}),m(this,rt,new Map),m(this,nt,new Map),m(this,_e,0)}mount(){St(this,_e)._++,a(this,_e)===1&&(m(this,it,ls.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,A).onFocus())})),m(this,at,Ot.subscribe(async e=>{e&&(await this.resumePausedMutations(),a(this,A).onOnline())})))}unmount(){var e,t;St(this,_e)._--,a(this,_e)===0&&((e=a(this,it))==null||e.call(this),m(this,it,void 0),(t=a(this,at))==null||t.call(this),m(this,at,void 0))}isFetching(e){return a(this,A).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return a(this,Se).findAll({...e,status:"pending"}).length}getQueryData(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,A).get(t.queryHash))==null?void 0:s.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),s=a(this,A).build(this,t),n=s.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime(Pe(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return a(this,A).findAll(e).map(({queryKey:t,state:s})=>{const n=s.data;return[t,n]})}setQueryData(e,t,s){const n=this.defaultQueryOptions({queryKey:e}),i=a(this,A).get(n.queryHash),o=i==null?void 0:i.state.data,c=Jr(t,o);if(c!==void 0)return a(this,A).build(this,n).setData(c,{...s,manual:!0})}setQueriesData(e,t,s){return L.batch(()=>a(this,A).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,s)]))}getQueryState(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=a(this,A).get(t.queryHash))==null?void 0:s.state}removeQueries(e){const t=a(this,A);L.batch(()=>{t.findAll(e).forEach(s=>{t.remove(s)})})}resetQueries(e,t){const s=a(this,A);return L.batch(()=>(s.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const s={revert:!0,...t},n=L.batch(()=>a(this,A).findAll(e).map(i=>i.cancel(s)));return Promise.all(n).then(J).catch(J)}invalidateQueries(e,t={}){return L.batch(()=>(a(this,A).findAll(e).forEach(s=>{s.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const s={...t,cancelRefetch:t.cancelRefetch??!0},n=L.batch(()=>a(this,A).findAll(e).filter(i=>!i.isDisabled()&&!i.isStatic()).map(i=>{let o=i.fetch(void 0,s);return s.throwOnError||(o=o.catch(J)),i.state.fetchStatus==="paused"?Promise.resolve():o}));return Promise.all(n).then(J)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const s=a(this,A).build(this,t);return s.isStaleByTime(Pe(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(J).catch(J)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(J).catch(J)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Ot.isOnline()?a(this,Se).resumePausedMutations():Promise.resolve()}getQueryCache(){return a(this,A)}getMutationCache(){return a(this,Se)}getDefaultOptions(){return a(this,Re)}setDefaultOptions(e){m(this,Re,e)}setQueryDefaults(e,t){a(this,rt).set(xt(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...a(this,rt).values()],s={};return t.forEach(n=>{gt(e,n.queryKey)&&Object.assign(s,n.defaultOptions)}),s}setMutationDefaults(e,t){a(this,nt).set(xt(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...a(this,nt).values()],s={};return t.forEach(n=>{gt(e,n.mutationKey)&&Object.assign(s,n.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;const t={...a(this,Re).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=cs(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===ds&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...a(this,Re).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){a(this,A).clear(),a(this,Se).clear()}},A=new WeakMap,Se=new WeakMap,Re=new WeakMap,rt=new WeakMap,nt=new WeakMap,_e=new WeakMap,it=new WeakMap,at=new WeakMap,Ys),hr=D.createContext(void 0),fr=e=>{const t=D.useContext(hr);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},xn=({client:e,children:t})=>(D.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),r.jsx(hr.Provider,{value:e,children:t})),mr=D.createContext(!1),gn=()=>D.useContext(mr);mr.Provider;function bn(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var yn=D.createContext(bn()),vn=()=>D.useContext(yn),wn=(e,t,s)=>{const n=s!=null&&s.state.error&&typeof e.throwOnError=="function"?ir(e.throwOnError,[s.state.error,s]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||n)&&(t.isReset()||(e.retryOnMount=!1))},jn=e=>{D.useEffect(()=>{e.clearReset()},[e])},Nn=({result:e,errorResetBoundary:t,throwOnError:s,query:n,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&n&&(i&&e.data===void 0||ir(s,[e.error,n])),kn=e=>{if(e.suspense){const s=i=>i==="static"?i:Math.max(i??1e3,1e3),n=e.staleTime;e.staleTime=typeof n=="function"?(...i)=>s(n(...i)):s(n),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Cn=(e,t)=>e.isLoading&&e.isFetching&&!t,Sn=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Es=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function Rn(e,t,s){var j,v,p,x;const n=gn(),i=vn(),o=fr(),c=o.defaultQueryOptions(e);(v=(j=o.getDefaultOptions().queries)==null?void 0:j._experimental_beforeQuery)==null||v.call(j,c);const l=o.getQueryCache().get(c.queryHash);c._optimisticResults=n?"isRestoring":"optimistic",kn(c),wn(c,i,l),jn(i);const d=!o.getQueryCache().get(c.queryHash),[u]=D.useState(()=>new t(o,c)),h=u.getOptimisticResult(c),b=!n&&e.subscribed!==!1;if(D.useSyncExternalStore(D.useCallback(g=>{const f=b?u.subscribe(L.batchCalls(g)):J;return u.updateResult(),f},[u,b]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),D.useEffect(()=>{u.setOptions(c)},[c,u]),Sn(c,h))throw Es(c,u,i);if(Nn({result:h,errorResetBoundary:i,throwOnError:c.throwOnError,query:l,suspense:c.suspense}))throw h.error;if((x=(p=o.getDefaultOptions().queries)==null?void 0:p._experimental_afterQuery)==null||x.call(p,c,h),c.experimental_prefetchInRender&&!bt.isServer()&&Cn(h,n)){const g=d?Es(c,u,i):l==null?void 0:l.promise;g==null||g.catch(J).finally(()=>{u.updateResult()})}return c.notifyOnChangeProps?h:u.trackResult(h)}function se(e,t){return Rn(e,ln)}/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. @@ -21,12 +21,12 @@ var vs=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=( * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Mn=Q.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:s=2,absoluteStrokeWidth:n,className:i="",children:o,iconNode:c,...l},d)=>Q.createElement("svg",{ref:d,...Pn,width:t,height:t,stroke:e,strokeWidth:n?Number(s)*24/Number(t):s,className:pr("lucide",i),...l},[...c.map(([u,h])=>Q.createElement(u,h)),...Array.isArray(o)?o:[o]]));/** + */const Mn=D.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:s=2,absoluteStrokeWidth:n,className:i="",children:o,iconNode:c,...l},d)=>D.createElement("svg",{ref:d,...Pn,width:t,height:t,stroke:e,strokeWidth:n?Number(s)*24/Number(t):s,className:pr("lucide",i),...l},[...c.map(([u,h])=>D.createElement(u,h)),...Array.isArray(o)?o:[o]]));/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const G=(e,t)=>{const s=Q.forwardRef(({className:n,...i},o)=>Q.createElement(Mn,{ref:o,iconNode:t,className:pr(`lucide-${_n(e)}`,n),...i}));return s.displayName=`${e}`,s};/** + */const G=(e,t)=>{const s=D.forwardRef(({className:n,...i},o)=>D.createElement(Mn,{ref:o,iconNode:t,className:pr(`lucide-${_n(e)}`,n),...i}));return s.displayName=`${e}`,s};/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. @@ -81,17 +81,17 @@ var vs=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=( * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Ln=G("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + */const qn=G("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Dn=G("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + */const Ln=G("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const qn=G("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + */const Dn=G("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. @@ -106,5 +106,5 @@ var vs=e=>{throw TypeError(e)};var Lt=(e,t,s)=>t.has(e)||vs("Cannot "+s);var a=( * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const $n=G("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),hs="-",Un=e=>{const t=Kn(e),{conflictingClassGroups:s,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const l=c.split(hs);return l[0]===""&&l.length!==1&&l.shift(),yr(l,t)||zn(c)},getConflictingClassGroupIds:(c,l)=>{const d=s[c]||[];return l&&n[c]?[...d,...n[c]]:d}}},yr=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const s=e[0],n=t.nextPart.get(s),i=n?yr(e.slice(1),n):void 0;if(i)return i;if(t.validators.length===0)return;const o=e.join(hs);return(c=t.validators.find(({validator:l})=>l(o)))==null?void 0:c.classGroupId},As=/^\[(.+)\]$/,zn=e=>{if(As.test(e)){const t=As.exec(e)[1],s=t==null?void 0:t.substring(0,t.indexOf(":"));if(s)return"arbitrary.."+s}},Kn=e=>{const{theme:t,prefix:s}=e,n={nextPart:new Map,validators:[]};return Bn(Object.entries(e.classGroups),s).forEach(([o,c])=>{ts(c,n,o,t)}),n},ts=(e,t,s,n)=>{e.forEach(i=>{if(typeof i=="string"){const o=i===""?t:Is(t,i);o.classGroupId=s;return}if(typeof i=="function"){if(Gn(i)){ts(i(n),t,s,n);return}t.validators.push({validator:i,classGroupId:s});return}Object.entries(i).forEach(([o,c])=>{ts(c,Is(t,o),s,n)})})},Is=(e,t)=>{let s=e;return t.split(hs).forEach(n=>{s.nextPart.has(n)||s.nextPart.set(n,{nextPart:new Map,validators:[]}),s=s.nextPart.get(n)}),s},Gn=e=>e.isThemeGetter,Bn=(e,t)=>t?e.map(([s,n])=>{const i=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,l])=>[t+c,l])):o);return[s,i]}):e,Hn=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,s=new Map,n=new Map;const i=(o,c)=>{s.set(o,c),t++,t>e&&(t=0,n=s,s=new Map)};return{get(o){let c=s.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return i(o,c),c},set(o,c){s.has(o)?s.set(o,c):i(o,c)}}},vr="!",Jn=e=>{const{separator:t,experimentalParseClassName:s}=e,n=t.length===1,i=t[0],o=t.length,c=l=>{const d=[];let u=0,h=0,b;for(let g=0;gh?b-h:void 0;return{modifiers:d,hasImportantModifier:v,baseClassName:p,maybePostfixModifierPosition:x}};return s?l=>s({className:l,parseClassName:c}):c},Wn=e=>{if(e.length<=1)return e;const t=[];let s=[];return e.forEach(n=>{n[0]==="["?(t.push(...s.sort(),n),s=[]):s.push(n)}),t.push(...s.sort()),t},Vn=e=>({cache:Hn(e.cacheSize),parseClassName:Jn(e),...Un(e)}),Xn=/\s+/,Zn=(e,t)=>{const{parseClassName:s,getClassGroupId:n,getConflictingClassGroupIds:i}=t,o=[],c=e.trim().split(Xn);let l="";for(let d=c.length-1;d>=0;d-=1){const u=c[d],{modifiers:h,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:v}=s(u);let p=!!v,x=n(p?j.substring(0,v):j);if(!x){if(!p){l=u+(l.length>0?" "+l:l);continue}if(x=n(j),!x){l=u+(l.length>0?" "+l:l);continue}p=!1}const g=Wn(h).join(":"),f=b?g+vr:g,k=f+x;if(o.includes(k))continue;o.push(k);const R=i(x,p);for(let y=0;y0?" "+l:l)}return l};function Yn(){let e=0,t,s,n="";for(;e{if(typeof e=="string")return e;let t,s="";for(let n=0;nb(h),e());return s=Vn(u),n=s.cache.get,i=s.cache.set,o=l,l(d)}function l(d){const u=n(d);if(u)return u;const h=Zn(d,s);return i(d,h),h}return function(){return o(Yn.apply(null,arguments))}}const E=e=>{const t=s=>s[e]||[];return t.isThemeGetter=!0,t},jr=/^\[(?:([a-z-]+):)?(.+)\]$/i,ti=/^\d+\/\d+$/,si=new Set(["px","full","screen"]),ri=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,ni=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,ii=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ai=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,oi=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ue=e=>He(e)||si.has(e)||ti.test(e),be=e=>lt(e,"length",pi),He=e=>!!e&&!Number.isNaN(Number(e)),qt=e=>lt(e,"number",He),ht=e=>!!e&&Number.isInteger(Number(e)),li=e=>e.endsWith("%")&&He(e.slice(0,-1)),N=e=>jr.test(e),ye=e=>ri.test(e),ci=new Set(["length","size","percentage"]),di=e=>lt(e,ci,Nr),ui=e=>lt(e,"position",Nr),hi=new Set(["image","url"]),fi=e=>lt(e,hi,gi),mi=e=>lt(e,"",xi),ft=()=>!0,lt=(e,t,s)=>{const n=jr.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):s(n[2]):!1},pi=e=>ni.test(e)&&!ii.test(e),Nr=()=>!1,xi=e=>ai.test(e),gi=e=>oi.test(e),bi=()=>{const e=E("colors"),t=E("spacing"),s=E("blur"),n=E("brightness"),i=E("borderColor"),o=E("borderRadius"),c=E("borderSpacing"),l=E("borderWidth"),d=E("contrast"),u=E("grayscale"),h=E("hueRotate"),b=E("invert"),j=E("gap"),v=E("gradientColorStops"),p=E("gradientColorStopPositions"),x=E("inset"),g=E("margin"),f=E("opacity"),k=E("padding"),R=E("saturate"),y=E("scale"),F=E("sepia"),T=E("skew"),$=E("space"),_=E("translate"),M=()=>["auto","contain","none"],I=()=>["auto","hidden","clip","visible","scroll"],U=()=>["auto",N,t],P=()=>[N,t],xe=()=>["",ue,be],Z=()=>["auto",He,N],oe=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Me=()=>["solid","dashed","dotted","double","none"],ct=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ze=()=>["start","end","center","between","around","evenly","stretch"],ge=()=>["","0",N],dt=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Y=()=>[He,N];return{cacheSize:500,separator:":",theme:{colors:[ft],spacing:[ue,be],blur:["none","",ye,N],brightness:Y(),borderColor:[e],borderRadius:["none","","full",ye,N],borderSpacing:P(),borderWidth:xe(),contrast:Y(),grayscale:ge(),hueRotate:Y(),invert:ge(),gap:P(),gradientColorStops:[e],gradientColorStopPositions:[li,be],inset:U(),margin:U(),opacity:Y(),padding:P(),saturate:Y(),scale:Y(),sepia:ge(),skew:Y(),space:P(),translate:P()},classGroups:{aspect:[{aspect:["auto","square","video",N]}],container:["container"],columns:[{columns:[ye]}],"break-after":[{"break-after":dt()}],"break-before":[{"break-before":dt()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...oe(),N]}],overflow:[{overflow:I()}],"overflow-x":[{"overflow-x":I()}],"overflow-y":[{"overflow-y":I()}],overscroll:[{overscroll:M()}],"overscroll-x":[{"overscroll-x":M()}],"overscroll-y":[{"overscroll-y":M()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[x]}],"inset-x":[{"inset-x":[x]}],"inset-y":[{"inset-y":[x]}],start:[{start:[x]}],end:[{end:[x]}],top:[{top:[x]}],right:[{right:[x]}],bottom:[{bottom:[x]}],left:[{left:[x]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ht,N]}],basis:[{basis:U()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",N]}],grow:[{grow:ge()}],shrink:[{shrink:ge()}],order:[{order:["first","last","none",ht,N]}],"grid-cols":[{"grid-cols":[ft]}],"col-start-end":[{col:["auto",{span:["full",ht,N]},N]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[ft]}],"row-start-end":[{row:["auto",{span:[ht,N]},N]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",N]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",N]}],gap:[{gap:[j]}],"gap-x":[{"gap-x":[j]}],"gap-y":[{"gap-y":[j]}],"justify-content":[{justify:["normal",...ze()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...ze(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...ze(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[g]}],mx:[{mx:[g]}],my:[{my:[g]}],ms:[{ms:[g]}],me:[{me:[g]}],mt:[{mt:[g]}],mr:[{mr:[g]}],mb:[{mb:[g]}],ml:[{ml:[g]}],"space-x":[{"space-x":[$]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[$]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",N,t]}],"min-w":[{"min-w":[N,t,"min","max","fit"]}],"max-w":[{"max-w":[N,t,"none","full","min","max","fit","prose",{screen:[ye]},ye]}],h:[{h:[N,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[N,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ye,be]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",qt]}],"font-family":[{font:[ft]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",N]}],"line-clamp":[{"line-clamp":["none",He,qt]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ue,N]}],"list-image":[{"list-image":["none",N]}],"list-style-type":[{list:["none","disc","decimal",N]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[f]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Me(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ue,be]}],"underline-offset":[{"underline-offset":["auto",ue,N]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:P()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",N]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",N]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[f]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...oe(),ui]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",di]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},fi]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[p]}],"gradient-via-pos":[{via:[p]}],"gradient-to-pos":[{to:[p]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[f]}],"border-style":[{border:[...Me(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[f]}],"divide-style":[{divide:Me()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...Me()]}],"outline-offset":[{"outline-offset":[ue,N]}],"outline-w":[{outline:[ue,be]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:xe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[f]}],"ring-offset-w":[{"ring-offset":[ue,be]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ye,mi]}],"shadow-color":[{shadow:[ft]}],opacity:[{opacity:[f]}],"mix-blend":[{"mix-blend":[...ct(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":ct()}],filter:[{filter:["","none"]}],blur:[{blur:[s]}],brightness:[{brightness:[n]}],contrast:[{contrast:[d]}],"drop-shadow":[{"drop-shadow":["","none",ye,N]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[h]}],invert:[{invert:[b]}],saturate:[{saturate:[R]}],sepia:[{sepia:[F]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[s]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[d]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[h]}],"backdrop-invert":[{"backdrop-invert":[b]}],"backdrop-opacity":[{"backdrop-opacity":[f]}],"backdrop-saturate":[{"backdrop-saturate":[R]}],"backdrop-sepia":[{"backdrop-sepia":[F]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",N]}],duration:[{duration:Y()}],ease:[{ease:["linear","in","out","in-out",N]}],delay:[{delay:Y()}],animate:[{animate:["none","spin","ping","pulse","bounce",N]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[y]}],"scale-x":[{"scale-x":[y]}],"scale-y":[{"scale-y":[y]}],rotate:[{rotate:[ht,N]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[T]}],"skew-y":[{"skew-y":[T]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",N]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",N]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":P()}],"scroll-mx":[{"scroll-mx":P()}],"scroll-my":[{"scroll-my":P()}],"scroll-ms":[{"scroll-ms":P()}],"scroll-me":[{"scroll-me":P()}],"scroll-mt":[{"scroll-mt":P()}],"scroll-mr":[{"scroll-mr":P()}],"scroll-mb":[{"scroll-mb":P()}],"scroll-ml":[{"scroll-ml":P()}],"scroll-p":[{"scroll-p":P()}],"scroll-px":[{"scroll-px":P()}],"scroll-py":[{"scroll-py":P()}],"scroll-ps":[{"scroll-ps":P()}],"scroll-pe":[{"scroll-pe":P()}],"scroll-pt":[{"scroll-pt":P()}],"scroll-pr":[{"scroll-pr":P()}],"scroll-pb":[{"scroll-pb":P()}],"scroll-pl":[{"scroll-pl":P()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",N]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ue,be,qt]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},yi=ei(bi),vi=new pn({defaultOptions:{queries:{retry:1}}}),Ls=12,wi=12,ji=10080*60*1e3,Ni=1e3;function ie(...e){return yi(Lr(e))}async function re(e){const t=await fetch(e,{headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`${t.status} ${t.statusText}`);return t.json()}function ae(e){if(e==null)return"n/a";const t=Math.max(0,Math.floor(e));if(t<60)return`${t}s`;const s=Math.floor(t/60);return s<60?`${s}m ${t%60}s`:`${Math.floor(s/60)}h ${s%60}m`}const ki=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}),Ci=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});function Ct(e){if(!e)return null;const t=new Date(e);return Number.isNaN(t.getTime())?null:t}function Si(e){const t=Ct(e);return t?ki.format(t):e??""}function pt(e){const t=Ct(e);return t?Ci.format(t):e??""}function kr(e,t){const s=Ct(e);if(!s)return e??"";const n=t-s.getTime(),i=Math.abs(n);if(i>ji)return pt(e);const o=n>=0?"ago":"from now",c=Math.round(i/1e3);if(c<45)return n>=0?"just now":"soon";if(c<90)return`1m ${o}`;const l=Math.round(c/60);if(l<60)return`${l}m ${o}`;if(l<90)return`1h ${o}`;const d=Math.round(l/60);return d<24?`${d}h ${o}`:d<36?`1d ${o}`:`${Math.round(d/24)}d ${o}`}function pe({value:e,compact:t=!1,relative:s=!1,now:n=Date.now()}){const i=Ct(e);return i?r.jsx("time",{dateTime:i.toISOString(),title:`UTC: ${i.toISOString()}`,children:s?kr(e,n):t?pt(e):Si(e)}):r.jsx(r.Fragment,{children:e??""})}function Cr(e,t){const s=Ct(e);return s?Math.max(0,Math.floor((t-s.getTime())/1e3)):null}function fs(e,t){return e.status==="running"?Cr(e.started_at,t)??e.runtime_seconds:e.runtime_seconds}function ms(e,t){return e.status==="pending"?Cr(e.created_at,t)??e.queue_wait_seconds:e.queue_wait_seconds}function Ri(e){const[t,s]=W.useState(()=>Date.now());return W.useEffect(()=>{if(!e)return;s(Date.now());const n=window.setInterval(()=>s(Date.now()),Ni);return()=>window.clearInterval(n)},[e]),t}function _i(e){return(e??"").split(/\r?\n/).map(s=>s.trim()).find(Boolean)??""}function Et(e,t,s=1){const n=_i(t),i=s>1?` (${s})`:"";return n?`${e}${i}: ${n}`:`${e}${i}`}function Tt(e){return e==="openclaw_stdout"||e==="openclaw_stderr"}function Sr(e){return e.map(t=>t==null?void 0:t.trim()).filter(Boolean).join(` -`)}function Pi(e){const t=[];for(const s of e){const n=t[t.length-1];if(n&&Tt(s.event_type)&&n.eventType===s.event_type){n.count+=1,n.meta=s.ts,n.detail=Sr([n.detail,s.detail]),n.summary=Et(s.summary,n.detail,n.count);continue}t.push({id:String(s.id),badge:s.event_type,meta:s.ts,summary:Tt(s.event_type)?Et(s.summary,s.detail):s.summary,detail:s.detail,eventType:s.event_type,count:1})}return t}function Mi(e){const t=[];return e.forEach((s,n)=>{const i=t[t.length-1];if(i&&Tt(s.kind)&&i.kind===s.kind){i.count+=1,i.meta=s.timestamp,i.text=Sr([i.text,s.text]),i.summary=Et(`${s.role} · ${s.kind}`,i.text,i.count);return}t.push({id:`${s.timestamp??"entry"}-${n}`,badge:s.title,meta:s.timestamp,summary:Tt(s.kind)?Et(`${s.role} · ${s.kind}`,s.text):`${s.role} · ${s.kind}`,text:s.text,kind:s.kind,count:1})}),t}function Ds(e,t,s,n){return e==="openclaw_stdout"?!1:t||s>=n-2}function Oi(e){return{pending:{badge:"border-amber-300 bg-amber-50 text-amber-800",dot:"bg-amber-500"},running:{badge:"border-blue-300 bg-blue-50 text-blue-700",dot:"bg-blue-600"},blocked:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},denied:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},done:{badge:"border-emerald-300 bg-emerald-50 text-emerald-700",dot:"bg-emerald-600"},waiting_approval:{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}[e]??{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}function Fi(e,t){const s=new URLSearchParams;for(const[n,i]of Object.entries(e))i.trim()&&s.set(n,i.trim());return s.set("limit",String(t)),`/api/jobs?${s.toString()}`}function ot(e){try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:"#"}catch{return"#"}}function Rr(e){return`/jobs/${e}`}function qs(e){try{return JSON.parse(e.data)}catch{return null}}function Ei(e,t){return e.some(s=>s.id===t.id)?e:[...e,t]}function Ti(e,t){const s=Qs(t);return e.some(n=>Qs(n)===s)?e:[...e,t]}function Qs(e){return`${e.timestamp??""}:${e.role}:${e.kind}:${e.title}:${e.text}`}function Ai(e=window.location.pathname){const t=e.match(/^\/jobs\/(\d+)\/?$/);return t?Number(t[1]):null}function Ii(){var xe,Z,oe,Me,ct,ze,ge,dt,Y,gs,bs,ys;const e=fr(),[t,s]=W.useState({status:"",repo:"",thread:"",action:"",intent:"",actor:""}),[n,i]=W.useState(Ls),[o,c]=W.useState(()=>window.location.pathname),l=Ai(o),d=l!==null,u=l,h=se({queryKey:["metrics"],queryFn:()=>re("/api/metrics/summary"),enabled:!d}),b=se({queryKey:["me"],queryFn:()=>re("/api/me"),refetchInterval:!1}),j=se({queryKey:["about"],queryFn:()=>re("/api/about")}),v=se({queryKey:["job-actors"],queryFn:()=>re("/api/jobs/actors"),enabled:!d}),p=se({queryKey:["jobs",t,n],queryFn:()=>re(Fi(t,n)),enabled:!d}),x=se({queryKey:["processes"],queryFn:()=>re("/api/processes"),enabled:!d}),g=se({queryKey:["alerts"],queryFn:()=>re("/api/alerts"),enabled:!d}),f=se({queryKey:["job",u],queryFn:()=>re(`/api/jobs/${u}`),enabled:u!==null}),k=se({queryKey:["job-session",u],queryFn:()=>re(`/api/jobs/${u}/session`),enabled:u!==null}),R=se({queryKey:["job-session-events",u],queryFn:()=>re(`/api/jobs/${u}/session/events`),enabled:u!==null}),y=se({queryKey:["job-session-transcript",u],queryFn:()=>re(`/api/jobs/${u}/session/transcript`),enabled:u!==null});W.useEffect(()=>{if(u===null)return;const D=new EventSource(`/api/jobs/${u}/session/stream`);return D.addEventListener("session_event",It=>{const Ke=qs(It);Ke&&(e.setQueryData(["job-session-events",u],Oe=>({events:Ei((Oe==null?void 0:Oe.events)??[],Ke)})),e.invalidateQueries({queryKey:["job",u]}),e.invalidateQueries({queryKey:["jobs"]}))}),D.addEventListener("transcript_entry",It=>{const Ke=qs(It);!Ke||Ke.job_id!==u||e.setQueryData(["job-session-transcript",u],Oe=>({entries:Ti((Oe==null?void 0:Oe.entries)??[],Ke.entry)}))}),D.onerror=()=>{D.close()},()=>D.close()},[u,e]),W.useEffect(()=>{const D=()=>{c(window.location.pathname)};return window.addEventListener("popstate",D),()=>window.removeEventListener("popstate",D)},[]);const F=W.useCallback(D=>{window.history.pushState({},"",Rr(D)),c(window.location.pathname)},[]),T=((xe=h.data)==null?void 0:xe.metrics.status_counts)??{},$=((Z=p.data)==null?void 0:Z.jobs)??[],_=W.useCallback(D=>{s(D),i(Ls)},[]),M=u?((oe=f.data)==null?void 0:oe.job)??null:null,I=$.some(D=>D.status==="running"||D.status==="pending")||(M==null?void 0:M.status)==="running"||(M==null?void 0:M.status)==="pending",U=Ri(I),P=r.jsx(qi,{selectedJobId:u,selectedJob:M,loading:f.isLoading,error:f.error,session:(Me=k.data)==null?void 0:Me.session,sessionEvents:(ct=R.data)==null?void 0:ct.events,transcript:(ze=y.data)==null?void 0:ze.entries,now:U});return r.jsxs("div",{className:"min-h-screen bg-background text-foreground",children:[r.jsx("header",{className:"border-b border-slate-800 bg-slate-950 text-white",children:r.jsxs("div",{className:"mx-auto flex w-full max-w-[1440px] items-center justify-between gap-3 px-4 py-4 md:px-6",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsx("h1",{className:"truncate text-xl font-semibold",children:"GitHub Agent Bridge"}),r.jsx(Li,{about:j.data})]}),r.jsx(Qi,{user:(ge=b.data)==null?void 0:ge.user,loading:b.isLoading})]})}),r.jsx("main",{className:"mx-auto grid w-full max-w-[1440px] gap-4 px-3 py-4 sm:px-4 md:px-6 md:py-5",children:l!==null?r.jsx(Di,{jobId:l,detail:P,onRefresh:()=>{f.refetch(),k.refetch(),R.refetch(),y.refetch()}}):r.jsxs(r.Fragment,{children:[h.error?r.jsx(Be,{tone:"error",text:h.error.message}):null,r.jsxs("section",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Summary metrics",children:[r.jsx(Pt,{title:"Pending",value:T.pending??0,icon:r.jsx(Tn,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Running",value:T.running??0,icon:r.jsx(On,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Blocked",value:T.blocked??0,icon:r.jsx(br,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Done",value:T.done??0,icon:r.jsx(En,{className:"h-5 w-5"})})]}),r.jsxs("section",{className:"grid gap-3",children:[r.jsx($i,{count:$.length,limit:n,loading:p.isLoading,onRefresh:()=>p.refetch()}),r.jsxs(Fe,{title:"Recent jobs",flushHeader:!0,children:[r.jsx(Ui,{filters:t,actorOptions:((dt=v.data)==null?void 0:dt.actors)??[],onChange:_}),p.error?r.jsx(Be,{tone:"error",text:p.error.message}):null,r.jsx(Ki,{jobs:$,loading:p.isLoading,onViewJob:F,now:U}),$.length>=n?r.jsx("div",{className:"mt-3 flex justify-center",children:r.jsx("button",{className:"inline-flex h-9 items-center justify-center rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:()=>i(D=>D+wi),children:"Load more jobs"})}):null]})]}),r.jsxs("section",{className:"grid gap-4",children:[r.jsxs(Fe,{title:"Process activity",action:r.jsx(At,{onClick:()=>x.refetch()}),children:[x.error?r.jsx(Be,{tone:"error",text:x.error.message}):null,r.jsx(Xi,{data:x.data,loading:x.isLoading})]}),r.jsxs(Fe,{title:"Monitor alerts",action:r.jsx(At,{onClick:()=>g.refetch()}),children:[g.error?r.jsx(Be,{tone:"error",text:g.error.message}):null,r.jsx(Zi,{alerts:(Y=g.data)==null?void 0:Y.alerts,loading:g.isLoading,now:U})]})]}),r.jsxs("section",{className:"grid gap-4 xl:grid-cols-3",children:[r.jsx(Fe,{title:"Runtime percentiles",children:r.jsx($s,{label:"runtime",values:(gs=h.data)==null?void 0:gs.metrics.runtime_seconds})}),r.jsx(Fe,{title:"Jobs per day",children:r.jsx(Wi,{values:(bs=h.data)==null?void 0:bs.metrics.by_created_day,loading:h.isLoading,totalJobs:Vi(T)})}),r.jsx(Fe,{title:"Queue wait percentiles",children:r.jsx($s,{label:"queue wait",values:(ys=h.data)==null?void 0:ys.metrics.queue_wait_seconds})})]})]})})]})}function Li({about:e}){const t=e!=null&&e.version?`v${e.version}`:"version loading";return r.jsxs("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-slate-300",children:[r.jsx("span",{children:"Read-only operational dashboard"}),r.jsx("span",{className:"font-mono text-xs text-slate-400",children:t}),e!=null&&e.repository_url?r.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-slate-200 hover:underline",href:ot(e.repository_url),rel:"noreferrer",target:"_blank",children:[r.jsx(gr,{className:"h-3.5 w-3.5","aria-hidden":!0}),"GitHub"]}):null]})}function Di({jobId:e,detail:t,onRefresh:s}){return r.jsxs("div",{className:"grid min-w-0 gap-3 sm:gap-4",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("a",{className:"inline-flex h-9 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",href:"/",children:[r.jsx(Fn,{className:"h-4 w-4","aria-hidden":!0}),"Dashboard"]}),r.jsx(At,{onClick:s})]}),r.jsx(Fe,{title:`Job #${e}`,className:"p-3 sm:p-4",children:t})]})}function qi({selectedJobId:e,selectedJob:t,loading:s,error:n,session:i,sessionEvents:o,transcript:c,now:l}){return t?r.jsx(Bi,{job:t,session:i,sessionEvents:o,transcript:c,now:l}):e!==null&&s?r.jsx(K,{text:"Loading selected job..."}):e!==null&&n?r.jsx(Be,{tone:"error",text:`Job #${e}: ${n.message}`}):r.jsx(K,{text:"Select a job to inspect its timeline, worklog and GitHub links."})}function Qi({user:e,loading:t}){const s=e!=null&&e.login?`@${e.login}`:t?"Loading profile...":"GitHub OAuth",n=e!=null&&e.avatar_url?r.jsx("img",{className:"h-10 w-10 rounded-full border border-slate-700 bg-slate-800",src:e.avatar_url,alt:e.login?`${e.login} avatar`:"",referrerPolicy:"no-referrer"}):r.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-slate-700 bg-slate-900",children:r.jsx(Ft,{className:"h-5 w-5","aria-hidden":!0})}),i=e!=null&&e.html_url?r.jsx("a",{className:"truncate font-semibold text-white hover:underline",href:ot(e.html_url),rel:"noreferrer",target:"_blank",children:s}):r.jsx("div",{className:"truncate font-semibold text-white",children:s});return r.jsxs("div",{className:"flex max-w-full shrink-0 items-center gap-3 text-sm text-slate-300","aria-label":e!=null&&e.login?`Signed in as ${e.login}`:"Dashboard account",children:[r.jsx(qn,{className:"hidden h-4 w-4 shrink-0 sm:block","aria-hidden":!0}),r.jsxs("div",{className:"hidden min-w-0 text-right sm:block",children:[i,r.jsx("div",{className:"text-xs text-slate-400",children:"Signed in · read-only"})]}),n]})}function $i({count:e,limit:t,loading:s,onRefresh:n}){return r.jsxs("div",{className:"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-lg border border-border bg-white px-3 py-3 shadow-sm md:px-4",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsx("h2",{className:"text-base font-semibold",children:"Jobs"}),r.jsx("p",{className:"text-xs text-muted",children:s?"Refreshing latest jobs...":`Showing ${e} of the latest ${t} requested jobs`})]}),r.jsx(At,{onClick:n,compactOnMobile:!0})]})}function Fe({title:e,action:t,children:s,className:n,flushHeader:i=!1}){return r.jsxs("section",{className:ie("min-w-0 rounded-lg border border-border bg-panel p-4 shadow-sm",n),children:[r.jsxs("div",{className:ie("flex items-center justify-between gap-3",!i&&"mb-4"),children:[r.jsx("h2",{className:"text-sm font-semibold",children:e}),t]}),s]})}function Pt({title:e,value:t,icon:s}){return r.jsxs("div",{className:"rounded-lg border border-border bg-panel p-3 shadow-sm md:p-4",children:[r.jsxs("div",{className:"flex items-center justify-between text-muted",children:[r.jsx("span",{className:"text-sm font-medium",children:e}),s]}),r.jsx("strong",{className:"mt-3 block text-2xl leading-none md:mt-4 md:text-3xl",children:t})]})}function Ui({filters:e,actorOptions:t,onChange:s}){const[n,i]=W.useState(e);return W.useEffect(()=>i(e),[e]),r.jsxs("details",{className:"my-3 rounded-md border border-border bg-slate-50/70",children:[r.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-2 text-sm font-semibold marker:hidden",children:[r.jsxs("span",{className:"inline-flex items-center gap-2",children:[r.jsx(An,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Filters"]}),r.jsx(xr,{className:"h-4 w-4 text-muted","aria-hidden":!0})]}),r.jsxs("form",{className:"grid gap-3 border-t border-border bg-white p-3 md:grid-cols-3 xl:grid-cols-8",onSubmit:o=>{o.preventDefault(),s(n)},children:[r.jsx(Ge,{label:"Status",children:r.jsxs("select",{className:"control",value:n.status,onChange:o=>i({...n,status:o.target.value}),children:[r.jsx("option",{value:"",children:"All"}),r.jsx("option",{value:"pending",children:"pending"}),r.jsx("option",{value:"running",children:"running"}),r.jsx("option",{value:"blocked",children:"blocked"}),r.jsx("option",{value:"done",children:"done"}),r.jsx("option",{value:"denied",children:"denied"}),r.jsx("option",{value:"waiting_approval",children:"waiting_approval"})]})}),r.jsx(Ge,{label:"Repository",children:r.jsx("input",{className:"control",value:n.repo,placeholder:"owner/repo",onChange:o=>i({...n,repo:o.target.value})})}),r.jsx(Ge,{label:"Thread",children:r.jsx("input",{className:"control",value:n.thread,inputMode:"numeric",placeholder:"issue or PR",onChange:o=>i({...n,thread:o.target.value})})}),r.jsx(Ge,{label:"Action",children:r.jsx("input",{className:"control",value:n.action,placeholder:"reply_comment",onChange:o=>i({...n,action:o.target.value})})}),r.jsx(Ge,{label:"Actor",className:"xl:col-span-2",children:r.jsx(zi,{value:n.actor,options:t,onChange:o=>i({...n,actor:o})})}),r.jsx(Ge,{label:"Intent",children:r.jsxs("select",{className:"control",value:n.intent,onChange:o=>i({...n,intent:o.target.value}),children:[r.jsx("option",{value:"",children:"All"}),r.jsx("option",{value:"review_only",children:"review_only"}),r.jsx("option",{value:"work_allowed",children:"work_allowed"})]})}),r.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 self-end rounded-md bg-primary px-3 text-sm font-semibold text-white",type:"submit",children:[r.jsx(Dn,{className:"h-4 w-4","aria-hidden":!0}),"Apply"]})]})]})}function zi({value:e,options:t,onChange:s}){const[n,i]=W.useState(!1),o=e.trim().replace(/^@/,"").toLowerCase(),c=t.filter(d=>!o||d.login.toLowerCase().includes(o)).slice(0,8),l=t.find(d=>d.login.toLowerCase()===o);return r.jsxs("div",{className:"relative min-w-0",children:[r.jsxs("div",{className:"control flex items-center gap-2 px-2",children:[l?r.jsx("img",{className:"h-5 w-5 shrink-0 rounded-full bg-slate-100",src:ot(l.avatar_url??""),alt:`${l.login} avatar`,referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-4 w-4 shrink-0 text-muted","aria-hidden":!0}),r.jsx("input",{className:"min-w-0 flex-1 bg-transparent font-mono text-sm outline-none",value:e,placeholder:"@login",onChange:d=>{s(d.target.value),i(!0)},onFocus:()=>i(!0),onBlur:()=>window.setTimeout(()=>i(!1),100)}),e?r.jsx("button",{className:"rounded-sm p-1 text-muted hover:bg-slate-100",type:"button","aria-label":"Clear actor filter",onClick:()=>s(""),children:r.jsx($n,{className:"h-3.5 w-3.5","aria-hidden":!0})}):null]}),n&&c.length>0?r.jsx("div",{className:"absolute left-0 right-0 z-20 mt-1 max-h-72 overflow-auto rounded-md border border-border bg-white p-1 shadow-lg",children:c.map(d=>r.jsxs("button",{className:"flex w-full items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-slate-50",type:"button",onMouseDown:u=>u.preventDefault(),onClick:()=>{s(d.login),i(!1)},children:[d.avatar_url?r.jsx("img",{className:"h-6 w-6 shrink-0 rounded-full bg-slate-100",src:ot(d.avatar_url),alt:`${d.login} avatar`,referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-5 w-5 shrink-0 text-muted","aria-hidden":!0}),r.jsxs("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-foreground",children:["@",d.login]}),r.jsx("span",{className:"shrink-0 rounded-full bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold text-muted",children:d.job_count})]},d.login))}):null]})}function Ge({label:e,children:t,className:s}){return r.jsxs("label",{className:ie("grid min-w-0 gap-1 text-xs font-semibold text-muted",s),children:[e,t]})}function Ki({jobs:e,loading:t,onViewJob:s,now:n}){return t&&e.length===0?r.jsx(K,{text:"Loading jobs..."}):e.length===0?r.jsx(K,{text:"No jobs match the current filters."}):r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"grid gap-2 md:hidden",children:e.map(i=>r.jsx(Gi,{job:i,onViewJob:s,now:n},i.id))}),r.jsx("div",{className:"hidden max-h-[640px] overflow-auto rounded-md border border-border md:block",children:r.jsxs("table",{className:"min-w-full border-collapse text-sm",children:[r.jsx("thead",{children:r.jsxs("tr",{className:"sticky top-0 border-b border-border bg-panel text-left text-xs text-muted",children:[r.jsx("th",{className:"px-2 py-2 font-semibold",children:"ID"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Status"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Repo / thread"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Action"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Actor"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Attempts"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Queue wait"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Runtime"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Updated"})]})}),r.jsx("tbody",{children:e.map(i=>r.jsxs("tr",{className:"cursor-pointer border-b border-border hover:bg-slate-50",onClick:()=>s(i.id),children:[r.jsxs("td",{className:"px-2 py-3 font-mono",children:["#",i.id]}),r.jsx("td",{className:"px-2 py-3",children:r.jsx(xs,{status:i.status})}),r.jsxs("td",{className:"px-2 py-3",children:[r.jsx("div",{className:"font-mono",children:i.repo??i.work_key}),r.jsxs("div",{className:"text-xs text-muted",children:["thread ",i.thread??"n/a"]})]}),r.jsxs("td",{className:"px-2 py-3",children:[r.jsx("div",{children:i.action}),r.jsx("div",{className:"text-xs text-muted",children:i.intent})]}),r.jsx("td",{className:"px-2 py-3",children:r.jsx(ps,{actor:i.trigger_actor,avatarUrl:i.trigger_actor_avatar_url})}),r.jsx("td",{className:"px-2 py-3",children:i.attempts}),r.jsx("td",{className:"px-2 py-3",children:ae(ms(i,n))}),r.jsx("td",{className:"px-2 py-3",children:ae(fs(i,n))}),r.jsx("td",{className:"px-2 py-3 font-mono text-xs",children:r.jsx(pe,{value:i.updated_at,compact:!0,relative:!0,now:n})})]},i.id))})]})})]})}function Gi({job:e,onViewJob:t,now:s}){return r.jsx("article",{className:"rounded-md border border-border bg-white shadow-[0_1px_0_rgba(15,23,42,0.03)]",children:r.jsxs("button",{className:"grid w-full gap-2 p-3 text-left hover:bg-slate-50",type:"button",onClick:()=>t(e.id),children:[r.jsxs("div",{className:"flex items-start justify-between gap-2",children:[r.jsxs("div",{className:"min-w-0 space-y-1",children:[r.jsxs("div",{className:"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-2",children:[r.jsxs("span",{className:"shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),r.jsx("span",{className:"truncate font-mono text-sm",children:e.repo??e.work_key})]}),r.jsx("div",{className:"line-clamp-2 text-sm leading-snug text-foreground",children:e.subject}),r.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[r.jsxs("span",{children:["thread ",e.thread??"n/a"," · ",e.action]}),r.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})]})]}),r.jsx(xs,{status:e.status})]}),r.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[r.jsx(ee,{label:"Wait",value:ae(ms(e,s))}),r.jsx(ee,{label:"Runtime",value:ae(fs(e,s))}),r.jsx(ee,{label:"Updated",value:r.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:s})})]})]})})}function ps({actor:e,avatarUrl:t,framed:s=!1}){const n=t?r.jsx("img",{className:"h-4 w-4 shrink-0 rounded-full bg-slate-100",src:ot(t),alt:e?`${e} avatar`:"",referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),i=r.jsxs(r.Fragment,{children:[n,r.jsx("span",{className:"min-w-0 truncate",children:e?`@${e}`:"unknown actor"})]});return s?r.jsx("span",{className:"inline-flex h-7 max-w-full items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-muted",children:i}):r.jsx("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 font-mono text-xs text-muted",children:i})}function Bi({job:e,session:t,sessionEvents:s,transcript:n,now:i,compact:o=!1}){var v;const c=Rr(e.id),l=s??[],d=n??[],u=Pi(l),h=Mi(d),b=fs(e,i),j=ms(e,i);return r.jsxs("div",{className:"grid min-w-0 gap-4",children:[r.jsxs("div",{className:"grid gap-2",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx(xs,{status:e.status}),r.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:c,children:[r.jsx(In,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.id]}),r.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url,framed:!0})]}),r.jsx("div",{className:"min-w-0 break-words font-mono text-sm [overflow-wrap:anywhere]",children:e.work_key}),r.jsx("p",{className:"min-w-0 break-words text-sm text-muted [overflow-wrap:anywhere]",children:e.subject})]}),r.jsxs("div",{className:ie("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-3"),children:[r.jsx(ee,{label:"Queue wait",value:ae(j)}),r.jsx(ee,{label:e.status==="running"?"Running for":"Runtime",value:ae(b)}),r.jsx(ee,{label:"Coalesced",value:String(e.coalesced_count)})]}),r.jsxs("div",{className:ie("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[r.jsx(ee,{label:"Created",value:r.jsx(pe,{value:e.created_at,compact:!0,relative:!0,now:i})}),r.jsx(ee,{label:"Started",value:e.started_at?r.jsx(pe,{value:e.started_at,compact:!0,relative:!0,now:i}):"n/a"}),r.jsx(ee,{label:"Updated",value:r.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:i})}),r.jsx(ee,{label:"Finished",value:e.finished_at?r.jsx(pe,{value:e.finished_at,compact:!0,relative:!0,now:i}):"n/a"})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Timeline"}),r.jsx("div",{className:"grid min-w-0 gap-3",children:(e.worklog??[]).length>0?(v=e.worklog)==null?void 0:v.map(p=>r.jsxs("div",{className:"min-w-0 border-l-2 border-primary pl-3",children:[r.jsx("div",{className:"text-sm font-semibold",children:p.phase}),r.jsx("div",{className:"font-mono text-xs text-muted",children:r.jsx(pe,{value:p.ts,relative:!0,now:i})}),r.jsx("div",{className:"break-words text-sm [overflow-wrap:anywhere]",children:p.summary}),p.detail?r.jsx("div",{className:"mt-1 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:p.detail}):null]},p.id)):r.jsx(K,{text:"No worklog entries."})})]}),r.jsxs("div",{children:[r.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Qn,{className:"h-4 w-4","aria-hidden":!0}),"OpenClaw session"]}),t?r.jsxs("div",{className:"grid gap-3",children:[r.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[r.jsx(ee,{label:"Session ID",value:t.id}),r.jsx(ee,{label:"Source",value:t.source})]}),r.jsx("p",{className:"break-words text-xs text-muted [overflow-wrap:anywhere]",children:t.detail})]}):r.jsx(K,{text:"Session correlation is loading."})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Agent activity"}),r.jsx("div",{className:"grid max-h-[460px] min-w-0 gap-2 overflow-auto pr-1",children:u.length>0?u.map((p,x)=>r.jsx(Ji,{event:p,defaultOpen:Ds(p.eventType,e.status==="running",x,u.length),now:i},p.id)):r.jsx(K,{text:e.status==="running"?"Waiting for live agent output...":"No agent activity has been recorded for this session."})})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Session transcript"}),r.jsx("div",{className:"grid max-h-[620px] min-w-0 gap-2 overflow-auto pr-1",children:h.length>0?h.map((p,x)=>r.jsx(Hi,{entry:p,defaultOpen:Ds(p.kind,e.status==="running",x,h.length),now:i},p.id)):r.jsx(K,{text:e.status==="running"?"Waiting for live transcript entries...":"No OpenClaw transcript entries are available for this session."})})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"GitHub links"}),r.jsx("ul",{className:"grid gap-2 text-sm",children:e.github_urls.length>0?e.github_urls.map(p=>r.jsx("li",{children:r.jsxs("a",{className:"break-all text-primary hover:underline [overflow-wrap:anywhere]",href:ot(p),rel:"noreferrer",target:"_blank",children:[r.jsx(gr,{className:"mr-1 inline h-3.5 w-3.5 align-[-2px]","aria-hidden":!0}),p]})},p)):r.jsx("li",{className:"text-muted",children:"No links recorded."})})]})]})}function Hi({entry:e,defaultOpen:t,now:s}){return r.jsx(_r,{badge:e.badge,meta:r.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:r.jsx("pre",{className:"max-h-72 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.text})})}function Ji({event:e,defaultOpen:t,now:s}){return r.jsx(_r,{badge:e.badge,meta:r.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:e.detail?r.jsx("pre",{className:"max-h-56 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.detail}):null})}function _r({badge:e,meta:t,count:s,summary:n,defaultOpen:i,children:o}){const[c,l]=W.useState(!!i);return r.jsxs("details",{className:"group min-w-0 rounded border border-border bg-slate-50/60",open:c,onToggle:d=>l(d.currentTarget.open),children:[r.jsxs("summary",{className:"grid cursor-pointer list-none gap-1 px-2 py-1.5 marker:hidden hover:bg-white",children:[r.jsxs("div",{className:"grid min-w-0 gap-1 sm:flex sm:items-center sm:justify-between sm:gap-2",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[r.jsx(xr,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),r.jsx("span",{className:"truncate font-mono text-[11px] font-semibold text-muted",children:e}),s&&s>1?r.jsx("span",{className:"rounded-sm border border-border px-1 font-mono text-[10px] text-muted",children:s}):null]}),r.jsx("span",{className:"min-w-0 truncate pl-5 font-mono text-[11px] text-muted sm:shrink-0 sm:pl-0",children:t})]}),r.jsx("div",{className:"min-w-0 break-words pl-5 text-xs text-foreground [overflow-wrap:anywhere] sm:truncate",children:n})]}),r.jsx("div",{className:"min-w-0 border-t border-border bg-white px-2 py-2",children:o})]})}function $s({label:e,values:t}){const s=[{name:"median",seconds:(t==null?void 0:t.median)??0},{name:"p90",seconds:(t==null?void 0:t.p90)??0},{name:"p99",seconds:(t==null?void 0:t.p99)??0}];return r.jsx("div",{className:"h-56",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(er,{data:s,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"name"}),r.jsx(as,{tickFormatter:ae}),r.jsx(os,{formatter:n=>[ae(Number(n)),e]}),r.jsx(tr,{dataKey:"seconds",fill:"#0969da",radius:[4,4,0,0]})]})})})}function Wi({values:e,loading:t,totalJobs:s}){const n=Object.entries(e??{}).map(([i,o])=>({day:i,count:o}));return t&&n.length===0?r.jsx(K,{text:"Loading job history..."}):n.length===0?r.jsx(K,{text:s>0?"Job history has no valid creation dates.":"No job history available."}):r.jsx("div",{className:"h-56",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(er,{data:n,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"day",minTickGap:16}),r.jsx(as,{allowDecimals:!1}),r.jsx(os,{formatter:i=>[Number(i),"jobs"]}),r.jsx(tr,{dataKey:"count",fill:"#16a34a",radius:[4,4,0,0]})]})})})}function Vi(e){return Object.values(e).reduce((t,s)=>t+s,0)}function Xi({data:e,loading:t}){var b,j,v,p,x,g;if(t&&!e)return r.jsx(K,{text:"Loading process activity..."});if(!e)return r.jsx(K,{text:"No process snapshot available."});const s=e.executor.children??[],n=s.flatMap(f=>Mr(f)),i=n.reduce((f,k)=>f+k.cpu_ticks,0),o=n.reduce((f,k)=>f+Yi(k),0),c=e.executor.service==="active",l=n.slice(0,8).map(f=>({label:`pid ${f.pid}`,ticks:f.cpu_ticks})),d=(e.samples??[]).map(f=>({label:pt(f.ts),ticks:f.cpu_ticks,io:f.io_bytes,active:f.active_since_last_sample?"active":"quiet"})),u=d.length>0?d:l,h=(b=e.samples)==null?void 0:b[e.samples.length-1];return r.jsxs("div",{className:"grid gap-4",children:[r.jsx("div",{className:"rounded-md border border-slate-200 bg-slate-50 p-3",children:r.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx("span",{className:ie("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",c?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-white text-slate-600"),children:c?"active":"idle"}),r.jsxs("span",{className:"font-mono text-xs text-muted",children:["service ",e.executor.service]})]}),r.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:e.running_jobs.length>0?`${e.running_jobs.length} running job${e.running_jobs.length===1?"":"s"}`:"No running jobs"}),e.running_jobs.length>0?r.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:e.running_jobs.slice(0,4).map(f=>r.jsxs("span",{className:"inline-flex min-h-6 items-center gap-1.5 rounded-full border border-blue-200 bg-white px-2 font-mono text-[11px] font-semibold text-blue-700",children:[r.jsx("span",{className:"h-2 w-2 rounded-full bg-blue-600 animate-live-pulse","aria-hidden":!0}),"#",f.id," ",ae(f.age_seconds)]},f.id))}):null,h?r.jsxs("p",{className:"mt-1 text-xs text-muted",children:["Last persisted sample ",pt(h.ts)," · ",h.active_since_last_sample?"activity observed":`quiet ${ae(h.idle_seconds)}`]}):null,r.jsx("p",{className:"mt-1 text-xs text-muted",children:e.detail})]}),r.jsxs("div",{className:"grid min-w-[190px] grid-cols-3 gap-2 text-center text-xs",children:[r.jsx(Qt,{label:"PID",value:e.executor.pid?String(e.executor.pid):"n/a"}),r.jsx(Qt,{label:"Children",value:String(n.length)}),r.jsx(Qt,{label:"CPU ticks",value:String(i)})]})]})}),r.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[r.jsx(Mt,{label:"Live process",value:((j=e.signals)==null?void 0:j.live_process.state)??(n.length>0?"live":"no_child_process"),detail:`${((v=e.signals)==null?void 0:v.live_process.child_count)??n.length} children`}),r.jsx(Mt,{label:"Process activity",value:((p=e.signals)==null?void 0:p.process_activity.state)??(h!=null&&h.active_since_last_sample?"active":"quiet"),detail:h?`sample ${pt(h.ts)}`:"no sample"}),r.jsx(Mt,{label:"Semantic progress",value:(x=e.signals)!=null&&x.semantic_progress.length?"recent":"none",detail:Us(e.running_jobs,"semantic_progress")}),r.jsx(Mt,{label:"Visible progress",value:(g=e.signals)!=null&&g.visible_progress.length?"streaming":"none",detail:Us(e.running_jobs,"visible_progress")})]}),e.alerts.length>0?r.jsx(Be,{tone:"error",text:e.alerts[0]}):null,r.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[r.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[r.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Ts,{className:"h-4 w-4","aria-hidden":!0}),d.length>0?"CPU history":"CPU ticks"]}),r.jsxs("span",{className:"font-mono text-xs text-muted",children:[Or(o)," I/O"]})]}),u.length>0?r.jsx("div",{className:"h-40",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(Ar,{data:u,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"label",tick:!1}),r.jsx(as,{allowDecimals:!1,tick:{fontSize:11}}),r.jsx(os,{formatter:f=>[Number(f),"cpu ticks"]}),r.jsx(Ir,{type:"monotone",dataKey:"ticks",stroke:"#0f766e",strokeWidth:2,dot:{r:3},activeDot:{r:5},isAnimationActive:!1})]})})}):r.jsx(K,{text:"No executor CPU samples available."})]}),r.jsxs("div",{className:"min-w-0",children:[r.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Ts,{className:"h-4 w-4","aria-hidden":!0}),"Executor children"]}),s.length>0?r.jsx("div",{className:"grid gap-2",children:s.map(f=>r.jsx(Pr,{process:f},f.pid))}):r.jsx(K,{text:"No child process detected for the executor."})]})]})]})}function Zi({alerts:e,loading:t,now:s}){if(t&&!e)return r.jsx(K,{text:"Loading monitor alerts..."});const n=e??[];return n.length===0?r.jsx(K,{text:"No active monitor alerts."}):r.jsx("div",{className:"grid gap-2",children:n.slice(0,5).map(i=>r.jsxs("div",{className:"rounded-md border border-red-200 bg-red-50 p-2.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-semibold text-red-700",children:[r.jsx(br,{className:"h-3.5 w-3.5","aria-hidden":!0}),r.jsx("span",{children:i.severity}),r.jsx("span",{className:"font-normal text-red-600",children:kr(i.last_seen,s)}),i.observations>1?r.jsxs("span",{className:"rounded-full border border-red-200 bg-white px-1.5",children:[i.observations,"x"]}):null]}),r.jsx("p",{className:"mt-1 break-words text-sm font-medium text-red-950 [overflow-wrap:anywhere]",children:i.message})]},i.fingerprint))})}function Pr({process:e}){var n,i;const t=((n=e.io_bytes)==null?void 0:n.read_bytes)??0,s=((i=e.io_bytes)==null?void 0:i.write_bytes)??0;return r.jsxs("div",{className:"rounded-md border border-border bg-white p-2.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[r.jsxs("span",{className:"font-mono",children:["pid ",e.pid]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["state ",e.state]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["cpu ",e.cpu_ticks]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["I/O ",Or(t+s)]})]}),r.jsx("div",{className:"mt-2 break-words font-mono text-xs text-muted",children:e.cmd||"unknown command"}),e.children&&e.children.length>0?r.jsx("div",{className:"mt-3 border-l-2 border-border pl-3",children:e.children.map(o=>r.jsx(Pr,{process:o},o.pid))}):null]})}function Qt({label:e,value:t}){return r.jsxs("div",{className:"rounded-md border border-border bg-white px-2 py-2",children:[r.jsx("div",{className:"font-mono text-sm font-semibold text-foreground",children:t}),r.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Mt({label:e,value:t,detail:s}){return r.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-2.5",children:[r.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),r.jsx("div",{className:"mt-1 truncate text-sm font-semibold text-foreground",children:t}),r.jsx("div",{className:"mt-1 truncate font-mono text-[11px] text-muted",children:s})]})}function Us(e,t){const s=e.find(i=>i[t]),n=s==null?void 0:s[t];return!s||!n?"no running heartbeat":`#${s.id} ${n.phase} ${ae(n.age_seconds??null)}`}function Mr(e){return[e,...(e.children??[]).flatMap(t=>Mr(t))]}function Yi(e){var t,s;return(((t=e.io_bytes)==null?void 0:t.read_bytes)??0)+(((s=e.io_bytes)==null?void 0:s.write_bytes)??0)}function Or(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ee({label:e,value:t}){return r.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[r.jsx("div",{className:"text-xs font-semibold text-muted",children:e}),r.jsx("div",{className:"mt-1 min-w-0 break-words text-sm [overflow-wrap:anywhere]",children:t})]})}function xs({status:e}){const t=Oi(e),s=e==="running"||e==="pending";return r.jsxs("span",{className:ie("inline-flex min-h-6 items-center gap-1.5 rounded-full border px-2 text-xs font-semibold",t.badge),children:[r.jsx("span",{className:ie("h-2.5 w-2.5 rounded-full",t.dot,s&&"animate-live-pulse"),"aria-hidden":!0}),e]})}function K({text:e}){return r.jsx("div",{className:"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted",children:e})}function Be({tone:e,text:t}){return r.jsx("div",{className:ie("rounded-md border p-3 text-sm",e==="error"&&"border-red-300 bg-red-50 text-red-700"),children:t})}function At({onClick:e,compactOnMobile:t=!1}){return r.jsxs("button",{className:ie("inline-flex h-8 items-center justify-center gap-2 rounded-md border border-border text-sm font-semibold text-foreground hover:bg-slate-50",t?"w-8 px-0 sm:w-auto sm:px-3":"px-3"),onClick:e,type:"button","aria-label":"Refresh",children:[r.jsx(Ln,{className:"h-4 w-4","aria-hidden":!0}),r.jsx("span",{className:ie(t&&"hidden sm:inline"),children:"Refresh"})]})}const zs=document.getElementById("root");zs&&Ur.createRoot(zs).render(r.jsx(W.StrictMode,{children:r.jsx(xn,{client:vi,children:r.jsx(Ii,{})})})); + */const $n=G("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),hs="-",Un=e=>{const t=Kn(e),{conflictingClassGroups:s,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:c=>{const l=c.split(hs);return l[0]===""&&l.length!==1&&l.shift(),yr(l,t)||zn(c)},getConflictingClassGroupIds:(c,l)=>{const d=s[c]||[];return l&&n[c]?[...d,...n[c]]:d}}},yr=(e,t)=>{var c;if(e.length===0)return t.classGroupId;const s=e[0],n=t.nextPart.get(s),i=n?yr(e.slice(1),n):void 0;if(i)return i;if(t.validators.length===0)return;const o=e.join(hs);return(c=t.validators.find(({validator:l})=>l(o)))==null?void 0:c.classGroupId},As=/^\[(.+)\]$/,zn=e=>{if(As.test(e)){const t=As.exec(e)[1],s=t==null?void 0:t.substring(0,t.indexOf(":"));if(s)return"arbitrary.."+s}},Kn=e=>{const{theme:t,prefix:s}=e,n={nextPart:new Map,validators:[]};return Bn(Object.entries(e.classGroups),s).forEach(([o,c])=>{ts(c,n,o,t)}),n},ts=(e,t,s,n)=>{e.forEach(i=>{if(typeof i=="string"){const o=i===""?t:Is(t,i);o.classGroupId=s;return}if(typeof i=="function"){if(Gn(i)){ts(i(n),t,s,n);return}t.validators.push({validator:i,classGroupId:s});return}Object.entries(i).forEach(([o,c])=>{ts(c,Is(t,o),s,n)})})},Is=(e,t)=>{let s=e;return t.split(hs).forEach(n=>{s.nextPart.has(n)||s.nextPart.set(n,{nextPart:new Map,validators:[]}),s=s.nextPart.get(n)}),s},Gn=e=>e.isThemeGetter,Bn=(e,t)=>t?e.map(([s,n])=>{const i=n.map(o=>typeof o=="string"?t+o:typeof o=="object"?Object.fromEntries(Object.entries(o).map(([c,l])=>[t+c,l])):o);return[s,i]}):e,Hn=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,s=new Map,n=new Map;const i=(o,c)=>{s.set(o,c),t++,t>e&&(t=0,n=s,s=new Map)};return{get(o){let c=s.get(o);if(c!==void 0)return c;if((c=n.get(o))!==void 0)return i(o,c),c},set(o,c){s.has(o)?s.set(o,c):i(o,c)}}},vr="!",Jn=e=>{const{separator:t,experimentalParseClassName:s}=e,n=t.length===1,i=t[0],o=t.length,c=l=>{const d=[];let u=0,h=0,b;for(let g=0;gh?b-h:void 0;return{modifiers:d,hasImportantModifier:v,baseClassName:p,maybePostfixModifierPosition:x}};return s?l=>s({className:l,parseClassName:c}):c},Wn=e=>{if(e.length<=1)return e;const t=[];let s=[];return e.forEach(n=>{n[0]==="["?(t.push(...s.sort(),n),s=[]):s.push(n)}),t.push(...s.sort()),t},Vn=e=>({cache:Hn(e.cacheSize),parseClassName:Jn(e),...Un(e)}),Xn=/\s+/,Zn=(e,t)=>{const{parseClassName:s,getClassGroupId:n,getConflictingClassGroupIds:i}=t,o=[],c=e.trim().split(Xn);let l="";for(let d=c.length-1;d>=0;d-=1){const u=c[d],{modifiers:h,hasImportantModifier:b,baseClassName:j,maybePostfixModifierPosition:v}=s(u);let p=!!v,x=n(p?j.substring(0,v):j);if(!x){if(!p){l=u+(l.length>0?" "+l:l);continue}if(x=n(j),!x){l=u+(l.length>0?" "+l:l);continue}p=!1}const g=Wn(h).join(":"),f=b?g+vr:g,k=f+x;if(o.includes(k))continue;o.push(k);const R=i(x,p);for(let y=0;y0?" "+l:l)}return l};function Yn(){let e=0,t,s,n="";for(;e{if(typeof e=="string")return e;let t,s="";for(let n=0;nb(h),e());return s=Vn(u),n=s.cache.get,i=s.cache.set,o=l,l(d)}function l(d){const u=n(d);if(u)return u;const h=Zn(d,s);return i(d,h),h}return function(){return o(Yn.apply(null,arguments))}}const E=e=>{const t=s=>s[e]||[];return t.isThemeGetter=!0,t},jr=/^\[(?:([a-z-]+):)?(.+)\]$/i,ti=/^\d+\/\d+$/,si=new Set(["px","full","screen"]),ri=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,ni=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,ii=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,ai=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,oi=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ue=e=>He(e)||si.has(e)||ti.test(e),be=e=>lt(e,"length",pi),He=e=>!!e&&!Number.isNaN(Number(e)),Dt=e=>lt(e,"number",He),ht=e=>!!e&&Number.isInteger(Number(e)),li=e=>e.endsWith("%")&&He(e.slice(0,-1)),N=e=>jr.test(e),ye=e=>ri.test(e),ci=new Set(["length","size","percentage"]),di=e=>lt(e,ci,Nr),ui=e=>lt(e,"position",Nr),hi=new Set(["image","url"]),fi=e=>lt(e,hi,gi),mi=e=>lt(e,"",xi),ft=()=>!0,lt=(e,t,s)=>{const n=jr.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):s(n[2]):!1},pi=e=>ni.test(e)&&!ii.test(e),Nr=()=>!1,xi=e=>ai.test(e),gi=e=>oi.test(e),bi=()=>{const e=E("colors"),t=E("spacing"),s=E("blur"),n=E("brightness"),i=E("borderColor"),o=E("borderRadius"),c=E("borderSpacing"),l=E("borderWidth"),d=E("contrast"),u=E("grayscale"),h=E("hueRotate"),b=E("invert"),j=E("gap"),v=E("gradientColorStops"),p=E("gradientColorStopPositions"),x=E("inset"),g=E("margin"),f=E("opacity"),k=E("padding"),R=E("saturate"),y=E("scale"),F=E("sepia"),T=E("skew"),Q=E("space"),_=E("translate"),M=()=>["auto","contain","none"],I=()=>["auto","hidden","clip","visible","scroll"],$=()=>["auto",N,t],P=()=>[N,t],xe=()=>["",ue,be],Z=()=>["auto",He,N],oe=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Me=()=>["solid","dashed","dotted","double","none"],ct=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],Ke=()=>["start","end","center","between","around","evenly","stretch"],ge=()=>["","0",N],dt=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Y=()=>[He,N];return{cacheSize:500,separator:":",theme:{colors:[ft],spacing:[ue,be],blur:["none","",ye,N],brightness:Y(),borderColor:[e],borderRadius:["none","","full",ye,N],borderSpacing:P(),borderWidth:xe(),contrast:Y(),grayscale:ge(),hueRotate:Y(),invert:ge(),gap:P(),gradientColorStops:[e],gradientColorStopPositions:[li,be],inset:$(),margin:$(),opacity:Y(),padding:P(),saturate:Y(),scale:Y(),sepia:ge(),skew:Y(),space:P(),translate:P()},classGroups:{aspect:[{aspect:["auto","square","video",N]}],container:["container"],columns:[{columns:[ye]}],"break-after":[{"break-after":dt()}],"break-before":[{"break-before":dt()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...oe(),N]}],overflow:[{overflow:I()}],"overflow-x":[{"overflow-x":I()}],"overflow-y":[{"overflow-y":I()}],overscroll:[{overscroll:M()}],"overscroll-x":[{"overscroll-x":M()}],"overscroll-y":[{"overscroll-y":M()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[x]}],"inset-x":[{"inset-x":[x]}],"inset-y":[{"inset-y":[x]}],start:[{start:[x]}],end:[{end:[x]}],top:[{top:[x]}],right:[{right:[x]}],bottom:[{bottom:[x]}],left:[{left:[x]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",ht,N]}],basis:[{basis:$()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",N]}],grow:[{grow:ge()}],shrink:[{shrink:ge()}],order:[{order:["first","last","none",ht,N]}],"grid-cols":[{"grid-cols":[ft]}],"col-start-end":[{col:["auto",{span:["full",ht,N]},N]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[ft]}],"row-start-end":[{row:["auto",{span:[ht,N]},N]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",N]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",N]}],gap:[{gap:[j]}],"gap-x":[{"gap-x":[j]}],"gap-y":[{"gap-y":[j]}],"justify-content":[{justify:["normal",...Ke()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...Ke(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...Ke(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[k]}],px:[{px:[k]}],py:[{py:[k]}],ps:[{ps:[k]}],pe:[{pe:[k]}],pt:[{pt:[k]}],pr:[{pr:[k]}],pb:[{pb:[k]}],pl:[{pl:[k]}],m:[{m:[g]}],mx:[{mx:[g]}],my:[{my:[g]}],ms:[{ms:[g]}],me:[{me:[g]}],mt:[{mt:[g]}],mr:[{mr:[g]}],mb:[{mb:[g]}],ml:[{ml:[g]}],"space-x":[{"space-x":[Q]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[Q]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",N,t]}],"min-w":[{"min-w":[N,t,"min","max","fit"]}],"max-w":[{"max-w":[N,t,"none","full","min","max","fit","prose",{screen:[ye]},ye]}],h:[{h:[N,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[N,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[N,t,"auto","min","max","fit"]}],"font-size":[{text:["base",ye,be]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Dt]}],"font-family":[{font:[ft]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",N]}],"line-clamp":[{"line-clamp":["none",He,Dt]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",ue,N]}],"list-image":[{"list-image":["none",N]}],"list-style-type":[{list:["none","disc","decimal",N]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[f]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Me(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",ue,be]}],"underline-offset":[{"underline-offset":["auto",ue,N]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:P()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",N]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",N]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[f]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...oe(),ui]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",di]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},fi]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[p]}],"gradient-via-pos":[{via:[p]}],"gradient-to-pos":[{to:[p]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[o]}],"rounded-s":[{"rounded-s":[o]}],"rounded-e":[{"rounded-e":[o]}],"rounded-t":[{"rounded-t":[o]}],"rounded-r":[{"rounded-r":[o]}],"rounded-b":[{"rounded-b":[o]}],"rounded-l":[{"rounded-l":[o]}],"rounded-ss":[{"rounded-ss":[o]}],"rounded-se":[{"rounded-se":[o]}],"rounded-ee":[{"rounded-ee":[o]}],"rounded-es":[{"rounded-es":[o]}],"rounded-tl":[{"rounded-tl":[o]}],"rounded-tr":[{"rounded-tr":[o]}],"rounded-br":[{"rounded-br":[o]}],"rounded-bl":[{"rounded-bl":[o]}],"border-w":[{border:[l]}],"border-w-x":[{"border-x":[l]}],"border-w-y":[{"border-y":[l]}],"border-w-s":[{"border-s":[l]}],"border-w-e":[{"border-e":[l]}],"border-w-t":[{"border-t":[l]}],"border-w-r":[{"border-r":[l]}],"border-w-b":[{"border-b":[l]}],"border-w-l":[{"border-l":[l]}],"border-opacity":[{"border-opacity":[f]}],"border-style":[{border:[...Me(),"hidden"]}],"divide-x":[{"divide-x":[l]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[l]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[f]}],"divide-style":[{divide:Me()}],"border-color":[{border:[i]}],"border-color-x":[{"border-x":[i]}],"border-color-y":[{"border-y":[i]}],"border-color-s":[{"border-s":[i]}],"border-color-e":[{"border-e":[i]}],"border-color-t":[{"border-t":[i]}],"border-color-r":[{"border-r":[i]}],"border-color-b":[{"border-b":[i]}],"border-color-l":[{"border-l":[i]}],"divide-color":[{divide:[i]}],"outline-style":[{outline:["",...Me()]}],"outline-offset":[{"outline-offset":[ue,N]}],"outline-w":[{outline:[ue,be]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:xe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[f]}],"ring-offset-w":[{"ring-offset":[ue,be]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",ye,mi]}],"shadow-color":[{shadow:[ft]}],opacity:[{opacity:[f]}],"mix-blend":[{"mix-blend":[...ct(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":ct()}],filter:[{filter:["","none"]}],blur:[{blur:[s]}],brightness:[{brightness:[n]}],contrast:[{contrast:[d]}],"drop-shadow":[{"drop-shadow":["","none",ye,N]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[h]}],invert:[{invert:[b]}],saturate:[{saturate:[R]}],sepia:[{sepia:[F]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[s]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[d]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[h]}],"backdrop-invert":[{"backdrop-invert":[b]}],"backdrop-opacity":[{"backdrop-opacity":[f]}],"backdrop-saturate":[{"backdrop-saturate":[R]}],"backdrop-sepia":[{"backdrop-sepia":[F]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[c]}],"border-spacing-x":[{"border-spacing-x":[c]}],"border-spacing-y":[{"border-spacing-y":[c]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",N]}],duration:[{duration:Y()}],ease:[{ease:["linear","in","out","in-out",N]}],delay:[{delay:Y()}],animate:[{animate:["none","spin","ping","pulse","bounce",N]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[y]}],"scale-x":[{"scale-x":[y]}],"scale-y":[{"scale-y":[y]}],rotate:[{rotate:[ht,N]}],"translate-x":[{"translate-x":[_]}],"translate-y":[{"translate-y":[_]}],"skew-x":[{"skew-x":[T]}],"skew-y":[{"skew-y":[T]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",N]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",N]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":P()}],"scroll-mx":[{"scroll-mx":P()}],"scroll-my":[{"scroll-my":P()}],"scroll-ms":[{"scroll-ms":P()}],"scroll-me":[{"scroll-me":P()}],"scroll-mt":[{"scroll-mt":P()}],"scroll-mr":[{"scroll-mr":P()}],"scroll-mb":[{"scroll-mb":P()}],"scroll-ml":[{"scroll-ml":P()}],"scroll-p":[{"scroll-p":P()}],"scroll-px":[{"scroll-px":P()}],"scroll-py":[{"scroll-py":P()}],"scroll-ps":[{"scroll-ps":P()}],"scroll-pe":[{"scroll-pe":P()}],"scroll-pt":[{"scroll-pt":P()}],"scroll-pr":[{"scroll-pr":P()}],"scroll-pb":[{"scroll-pb":P()}],"scroll-pl":[{"scroll-pl":P()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",N]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[ue,be,Dt]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},yi=ei(bi),vi=new pn({defaultOptions:{queries:{retry:1}}}),qs=12,wi=12,ji=10080*60*1e3,Ni=1e3;function ie(...e){return yi(qr(e))}async function re(e){const t=await fetch(e,{headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`${t.status} ${t.statusText}`);return t.json()}function ae(e){if(e==null)return"n/a";const t=Math.max(0,Math.floor(e));if(t<60)return`${t}s`;const s=Math.floor(t/60);return s<60?`${s}m ${t%60}s`:`${Math.floor(s/60)}h ${s%60}m`}const ki=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}),Ci=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});function Ct(e){if(!e)return null;const t=new Date(e);return Number.isNaN(t.getTime())?null:t}function Si(e){const t=Ct(e);return t?ki.format(t):e??""}function pt(e){const t=Ct(e);return t?Ci.format(t):e??""}function kr(e,t){const s=Ct(e);if(!s)return e??"";const n=t-s.getTime(),i=Math.abs(n);if(i>ji)return pt(e);const o=n>=0?"ago":"from now",c=Math.round(i/1e3);if(c<45)return n>=0?"just now":"soon";if(c<90)return`1m ${o}`;const l=Math.round(c/60);if(l<60)return`${l}m ${o}`;if(l<90)return`1h ${o}`;const d=Math.round(l/60);return d<24?`${d}h ${o}`:d<36?`1d ${o}`:`${Math.round(d/24)}d ${o}`}function pe({value:e,compact:t=!1,relative:s=!1,now:n=Date.now()}){const i=Ct(e);return i?r.jsx("time",{dateTime:i.toISOString(),title:`UTC: ${i.toISOString()}`,children:s?kr(e,n):t?pt(e):Si(e)}):r.jsx(r.Fragment,{children:e??""})}function Cr(e,t){const s=Ct(e);return s?Math.max(0,Math.floor((t-s.getTime())/1e3)):null}function fs(e,t){return e.status==="running"?Cr(e.started_at,t)??e.runtime_seconds:e.runtime_seconds}function ms(e,t){return e.status==="pending"?Cr(e.created_at,t)??e.queue_wait_seconds:e.queue_wait_seconds}function Ri(e){const[t,s]=W.useState(()=>Date.now());return W.useEffect(()=>{if(!e)return;s(Date.now());const n=window.setInterval(()=>s(Date.now()),Ni);return()=>window.clearInterval(n)},[e]),t}function _i(e){return(e??"").split(/\r?\n/).map(s=>s.trim()).find(Boolean)??""}function Et(e,t,s=1){const n=_i(t),i=s>1?` (${s})`:"";return n?`${e}${i}: ${n}`:`${e}${i}`}function Tt(e){return e==="openclaw_stdout"||e==="openclaw_stderr"}function Sr(e){return e.map(t=>t==null?void 0:t.trim()).filter(Boolean).join(` +`)}function Pi(e){const t=[];for(const s of e){const n=t[t.length-1];if(n&&Tt(s.event_type)&&n.eventType===s.event_type){n.count+=1,n.meta=s.ts,n.detail=Sr([n.detail,s.detail]),n.summary=Et(s.summary,n.detail,n.count);continue}t.push({id:String(s.id),badge:s.event_type,meta:s.ts,summary:Tt(s.event_type)?Et(s.summary,s.detail):s.summary,detail:s.detail,eventType:s.event_type,count:1})}return t}function Mi(e){const t=[];return e.forEach((s,n)=>{const i=t[t.length-1];if(i&&Tt(s.kind)&&i.kind===s.kind){i.count+=1,i.meta=s.timestamp,i.text=Sr([i.text,s.text]),i.summary=Et(`${s.role} · ${s.kind}`,i.text,i.count);return}t.push({id:`${s.timestamp??"entry"}-${n}`,badge:s.title,meta:s.timestamp,summary:Tt(s.kind)?Et(`${s.role} · ${s.kind}`,s.text):`${s.role} · ${s.kind}`,text:s.text,kind:s.kind,count:1})}),t}function Ls(e,t,s,n){return e==="openclaw_stdout"?!1:t||s>=n-2}function Oi(e){return{pending:{badge:"border-amber-300 bg-amber-50 text-amber-800",dot:"bg-amber-500"},running:{badge:"border-blue-300 bg-blue-50 text-blue-700",dot:"bg-blue-600"},blocked:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},denied:{badge:"border-red-300 bg-red-50 text-red-700",dot:"bg-red-600"},done:{badge:"border-emerald-300 bg-emerald-50 text-emerald-700",dot:"bg-emerald-600"},waiting_approval:{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}[e]??{badge:"border-slate-300 bg-slate-50 text-slate-700",dot:"bg-slate-500"}}function Fi(e,t){const s=new URLSearchParams;for(const[n,i]of Object.entries(e))i.trim()&&s.set(n,i.trim());return s.set("limit",String(t)),`/api/jobs?${s.toString()}`}function ot(e){try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:"#"}catch{return"#"}}function Rr(e){return`/jobs/${e}`}function Ds(e){try{return JSON.parse(e.data)}catch{return null}}function Ei(e,t){return e.some(s=>s.id===t.id)?e:[...e,t]}function Ti(e,t){const s=Qs(t);return e.some(n=>Qs(n)===s)?e:[...e,t]}function Qs(e){return`${e.timestamp??""}:${e.role}:${e.kind}:${e.title}:${e.text}`}function Ai(e){return["claimed","dispatch_started","dispatch_finished","done","blocked","denied","waiting_approval"].includes(e)}function Ii(e=window.location.pathname){const t=e.match(/^\/jobs\/(\d+)\/?$/);return t?Number(t[1]):null}function qi(){var xe,Z,oe,Me,ct,Ke,ge,dt,Y,gs,bs,ys;const e=fr(),[t,s]=W.useState({status:"",repo:"",thread:"",action:"",intent:"",actor:""}),[n,i]=W.useState(qs),[o,c]=W.useState(()=>window.location.pathname),l=Ii(o),d=l!==null,u=l,h=se({queryKey:["metrics"],queryFn:()=>re("/api/metrics/summary"),enabled:!d}),b=se({queryKey:["me"],queryFn:()=>re("/api/me"),refetchInterval:!1}),j=se({queryKey:["about"],queryFn:()=>re("/api/about")}),v=se({queryKey:["job-actors"],queryFn:()=>re("/api/jobs/actors"),enabled:!d}),p=se({queryKey:["jobs",t,n],queryFn:()=>re(Fi(t,n)),enabled:!d}),x=se({queryKey:["processes"],queryFn:()=>re("/api/processes"),enabled:!d}),g=se({queryKey:["alerts"],queryFn:()=>re("/api/alerts"),enabled:!d}),f=se({queryKey:["job",u],queryFn:()=>re(`/api/jobs/${u}`),enabled:u!==null}),k=se({queryKey:["job-session",u],queryFn:()=>re(`/api/jobs/${u}/session`),enabled:u!==null}),R=se({queryKey:["job-session-events",u],queryFn:()=>re(`/api/jobs/${u}/session/events`),enabled:u!==null}),y=se({queryKey:["job-session-transcript",u],queryFn:()=>re(`/api/jobs/${u}/session/transcript`),enabled:u!==null});W.useEffect(()=>{if(u===null)return;const U=new EventSource(`/api/jobs/${u}/session/stream`);return U.addEventListener("session_event",It=>{const Oe=Ds(It);Oe&&(e.setQueryData(["job-session-events",u],Fe=>({events:Ei((Fe==null?void 0:Fe.events)??[],Oe)})),Ai(Oe.event_type)&&(e.invalidateQueries({queryKey:["job",u]}),e.invalidateQueries({queryKey:["jobs"]})))}),U.addEventListener("transcript_entry",It=>{const Oe=Ds(It);!Oe||Oe.job_id!==u||e.setQueryData(["job-session-transcript",u],Fe=>({entries:Ti((Fe==null?void 0:Fe.entries)??[],Oe.entry)}))}),U.onerror=()=>{e.invalidateQueries({queryKey:["job",u]}),e.invalidateQueries({queryKey:["job-session-events",u]}),e.invalidateQueries({queryKey:["job-session-transcript",u]})},()=>U.close()},[u,e]),W.useEffect(()=>{const U=()=>{c(window.location.pathname)};return window.addEventListener("popstate",U),()=>window.removeEventListener("popstate",U)},[]);const F=W.useCallback(U=>{window.history.pushState({},"",Rr(U)),c(window.location.pathname)},[]),T=((xe=h.data)==null?void 0:xe.metrics.status_counts)??{},Q=((Z=p.data)==null?void 0:Z.jobs)??[],_=W.useCallback(U=>{s(U),i(qs)},[]),M=u?((oe=f.data)==null?void 0:oe.job)??null:null,I=Q.some(U=>U.status==="running"||U.status==="pending")||(M==null?void 0:M.status)==="running"||(M==null?void 0:M.status)==="pending",$=Ri(I),P=r.jsx(Qi,{selectedJobId:u,selectedJob:M,loading:f.isLoading,error:f.error,session:(Me=k.data)==null?void 0:Me.session,sessionEvents:(ct=R.data)==null?void 0:ct.events,transcript:(Ke=y.data)==null?void 0:Ke.entries,now:$});return r.jsxs("div",{className:"min-h-screen bg-background text-foreground",children:[r.jsx("header",{className:"border-b border-slate-800 bg-slate-950 text-white",children:r.jsxs("div",{className:"mx-auto flex w-full max-w-[1440px] items-center justify-between gap-3 px-4 py-4 md:px-6",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsx("h1",{className:"truncate text-xl font-semibold",children:"GitHub Agent Bridge"}),r.jsx(Li,{about:j.data})]}),r.jsx($i,{user:(ge=b.data)==null?void 0:ge.user,loading:b.isLoading})]})}),r.jsx("main",{className:"mx-auto grid w-full max-w-[1440px] gap-4 px-3 py-4 sm:px-4 md:px-6 md:py-5",children:l!==null?r.jsx(Di,{jobId:l,detail:P,onRefresh:()=>{f.refetch(),k.refetch(),R.refetch(),y.refetch()}}):r.jsxs(r.Fragment,{children:[h.error?r.jsx(Be,{tone:"error",text:h.error.message}):null,r.jsxs("section",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Summary metrics",children:[r.jsx(Pt,{title:"Pending",value:T.pending??0,icon:r.jsx(Tn,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Running",value:T.running??0,icon:r.jsx(On,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Blocked",value:T.blocked??0,icon:r.jsx(br,{className:"h-5 w-5"})}),r.jsx(Pt,{title:"Done",value:T.done??0,icon:r.jsx(En,{className:"h-5 w-5"})})]}),r.jsxs("section",{className:"grid gap-3",children:[r.jsx(Ui,{count:Q.length,limit:n,loading:p.isLoading,onRefresh:()=>p.refetch()}),r.jsxs(Ee,{title:"Recent jobs",flushHeader:!0,children:[r.jsx(zi,{filters:t,actorOptions:((dt=v.data)==null?void 0:dt.actors)??[],onChange:_}),p.error?r.jsx(Be,{tone:"error",text:p.error.message}):null,r.jsx(Gi,{jobs:Q,loading:p.isLoading,onViewJob:F,now:$}),Q.length>=n?r.jsx("div",{className:"mt-3 flex justify-center",children:r.jsx("button",{className:"inline-flex h-9 items-center justify-center rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:()=>i(U=>U+wi),children:"Load more jobs"})}):null]})]}),r.jsxs("section",{className:"grid gap-4",children:[r.jsxs(Ee,{title:"Process activity",action:r.jsx(At,{onClick:()=>x.refetch()}),children:[x.error?r.jsx(Be,{tone:"error",text:x.error.message}):null,r.jsx(Zi,{data:x.data,loading:x.isLoading})]}),r.jsxs(Ee,{title:"Monitor alerts",action:r.jsx(At,{onClick:()=>g.refetch()}),children:[g.error?r.jsx(Be,{tone:"error",text:g.error.message}):null,r.jsx(Yi,{alerts:(Y=g.data)==null?void 0:Y.alerts,loading:g.isLoading,now:$})]})]}),r.jsxs("section",{className:"grid gap-4 xl:grid-cols-3",children:[r.jsx(Ee,{title:"Runtime percentiles",children:r.jsx($s,{label:"runtime",values:(gs=h.data)==null?void 0:gs.metrics.runtime_seconds})}),r.jsx(Ee,{title:"Jobs per day",children:r.jsx(Vi,{values:(bs=h.data)==null?void 0:bs.metrics.by_created_day,loading:h.isLoading,totalJobs:Xi(T)})}),r.jsx(Ee,{title:"Queue wait percentiles",children:r.jsx($s,{label:"queue wait",values:(ys=h.data)==null?void 0:ys.metrics.queue_wait_seconds})})]})]})})]})}function Li({about:e}){const t=e!=null&&e.version?`v${e.version}`:"version loading";return r.jsxs("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-slate-300",children:[r.jsx("span",{children:"Read-only operational dashboard"}),r.jsx("span",{className:"font-mono text-xs text-slate-400",children:t}),e!=null&&e.repository_url?r.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-slate-200 hover:underline",href:ot(e.repository_url),rel:"noreferrer",target:"_blank",children:[r.jsx(gr,{className:"h-3.5 w-3.5","aria-hidden":!0}),"GitHub"]}):null]})}function Di({jobId:e,detail:t,onRefresh:s}){return r.jsxs("div",{className:"grid min-w-0 gap-3 sm:gap-4",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("a",{className:"inline-flex h-9 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50",href:"/",children:[r.jsx(Fn,{className:"h-4 w-4","aria-hidden":!0}),"Dashboard"]}),r.jsx(At,{onClick:s})]}),r.jsx(Ee,{title:`Job #${e}`,className:"p-3 sm:p-4",children:t})]})}function Qi({selectedJobId:e,selectedJob:t,loading:s,error:n,session:i,sessionEvents:o,transcript:c,now:l}){return t?r.jsx(Hi,{job:t,session:i,sessionEvents:o,transcript:c,now:l}):e!==null&&s?r.jsx(K,{text:"Loading selected job..."}):e!==null&&n?r.jsx(Be,{tone:"error",text:`Job #${e}: ${n.message}`}):r.jsx(K,{text:"Select a job to inspect its timeline, worklog and GitHub links."})}function $i({user:e,loading:t}){const s=e!=null&&e.login?`@${e.login}`:t?"Loading profile...":"GitHub OAuth",n=e!=null&&e.avatar_url?r.jsx("img",{className:"h-10 w-10 rounded-full border border-slate-700 bg-slate-800",src:e.avatar_url,alt:e.login?`${e.login} avatar`:"",referrerPolicy:"no-referrer"}):r.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-slate-700 bg-slate-900",children:r.jsx(Ft,{className:"h-5 w-5","aria-hidden":!0})}),i=e!=null&&e.html_url?r.jsx("a",{className:"truncate font-semibold text-white hover:underline",href:ot(e.html_url),rel:"noreferrer",target:"_blank",children:s}):r.jsx("div",{className:"truncate font-semibold text-white",children:s});return r.jsxs("div",{className:"flex max-w-full shrink-0 items-center gap-3 text-sm text-slate-300","aria-label":e!=null&&e.login?`Signed in as ${e.login}`:"Dashboard account",children:[r.jsx(Dn,{className:"hidden h-4 w-4 shrink-0 sm:block","aria-hidden":!0}),r.jsxs("div",{className:"hidden min-w-0 text-right sm:block",children:[i,r.jsx("div",{className:"text-xs text-slate-400",children:"Signed in · read-only"})]}),n]})}function Ui({count:e,limit:t,loading:s,onRefresh:n}){return r.jsxs("div",{className:"grid grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-lg border border-border bg-white px-3 py-3 shadow-sm md:px-4",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsx("h2",{className:"text-base font-semibold",children:"Jobs"}),r.jsx("p",{className:"text-xs text-muted",children:s?"Refreshing latest jobs...":`Showing ${e} of the latest ${t} requested jobs`})]}),r.jsx(At,{onClick:n,compactOnMobile:!0})]})}function Ee({title:e,action:t,children:s,className:n,flushHeader:i=!1}){return r.jsxs("section",{className:ie("min-w-0 rounded-lg border border-border bg-panel p-4 shadow-sm",n),children:[r.jsxs("div",{className:ie("flex items-center justify-between gap-3",!i&&"mb-4"),children:[r.jsx("h2",{className:"text-sm font-semibold",children:e}),t]}),s]})}function Pt({title:e,value:t,icon:s}){return r.jsxs("div",{className:"rounded-lg border border-border bg-panel p-3 shadow-sm md:p-4",children:[r.jsxs("div",{className:"flex items-center justify-between text-muted",children:[r.jsx("span",{className:"text-sm font-medium",children:e}),s]}),r.jsx("strong",{className:"mt-3 block text-2xl leading-none md:mt-4 md:text-3xl",children:t})]})}function zi({filters:e,actorOptions:t,onChange:s}){const[n,i]=W.useState(e);return W.useEffect(()=>i(e),[e]),r.jsxs("details",{className:"my-3 rounded-md border border-border bg-slate-50/70",children:[r.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-2 text-sm font-semibold marker:hidden",children:[r.jsxs("span",{className:"inline-flex items-center gap-2",children:[r.jsx(An,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Filters"]}),r.jsx(xr,{className:"h-4 w-4 text-muted","aria-hidden":!0})]}),r.jsxs("form",{className:"grid gap-3 border-t border-border bg-white p-3 md:grid-cols-3 xl:grid-cols-8",onSubmit:o=>{o.preventDefault(),s(n)},children:[r.jsx(Ge,{label:"Status",children:r.jsxs("select",{className:"control",value:n.status,onChange:o=>i({...n,status:o.target.value}),children:[r.jsx("option",{value:"",children:"All"}),r.jsx("option",{value:"pending",children:"pending"}),r.jsx("option",{value:"running",children:"running"}),r.jsx("option",{value:"blocked",children:"blocked"}),r.jsx("option",{value:"done",children:"done"}),r.jsx("option",{value:"denied",children:"denied"}),r.jsx("option",{value:"waiting_approval",children:"waiting_approval"})]})}),r.jsx(Ge,{label:"Repository",children:r.jsx("input",{className:"control",value:n.repo,placeholder:"owner/repo",onChange:o=>i({...n,repo:o.target.value})})}),r.jsx(Ge,{label:"Thread",children:r.jsx("input",{className:"control",value:n.thread,inputMode:"numeric",placeholder:"issue or PR",onChange:o=>i({...n,thread:o.target.value})})}),r.jsx(Ge,{label:"Action",children:r.jsx("input",{className:"control",value:n.action,placeholder:"reply_comment",onChange:o=>i({...n,action:o.target.value})})}),r.jsx(Ge,{label:"Actor",className:"xl:col-span-2",children:r.jsx(Ki,{value:n.actor,options:t,onChange:o=>i({...n,actor:o})})}),r.jsx(Ge,{label:"Intent",children:r.jsxs("select",{className:"control",value:n.intent,onChange:o=>i({...n,intent:o.target.value}),children:[r.jsx("option",{value:"",children:"All"}),r.jsx("option",{value:"review_only",children:"review_only"}),r.jsx("option",{value:"work_allowed",children:"work_allowed"})]})}),r.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 self-end rounded-md bg-primary px-3 text-sm font-semibold text-white",type:"submit",children:[r.jsx(Ln,{className:"h-4 w-4","aria-hidden":!0}),"Apply"]})]})]})}function Ki({value:e,options:t,onChange:s}){const[n,i]=W.useState(!1),o=e.trim().replace(/^@/,"").toLowerCase(),c=t.filter(d=>!o||d.login.toLowerCase().includes(o)).slice(0,8),l=t.find(d=>d.login.toLowerCase()===o);return r.jsxs("div",{className:"relative min-w-0",children:[r.jsxs("div",{className:"control flex items-center gap-2 px-2",children:[l?r.jsx("img",{className:"h-5 w-5 shrink-0 rounded-full bg-slate-100",src:ot(l.avatar_url??""),alt:`${l.login} avatar`,referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-4 w-4 shrink-0 text-muted","aria-hidden":!0}),r.jsx("input",{className:"min-w-0 flex-1 bg-transparent font-mono text-sm outline-none",value:e,placeholder:"@login",onChange:d=>{s(d.target.value),i(!0)},onFocus:()=>i(!0),onBlur:()=>window.setTimeout(()=>i(!1),100)}),e?r.jsx("button",{className:"rounded-sm p-1 text-muted hover:bg-slate-100",type:"button","aria-label":"Clear actor filter",onClick:()=>s(""),children:r.jsx($n,{className:"h-3.5 w-3.5","aria-hidden":!0})}):null]}),n&&c.length>0?r.jsx("div",{className:"absolute left-0 right-0 z-20 mt-1 max-h-72 overflow-auto rounded-md border border-border bg-white p-1 shadow-lg",children:c.map(d=>r.jsxs("button",{className:"flex w-full items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-slate-50",type:"button",onMouseDown:u=>u.preventDefault(),onClick:()=>{s(d.login),i(!1)},children:[d.avatar_url?r.jsx("img",{className:"h-6 w-6 shrink-0 rounded-full bg-slate-100",src:ot(d.avatar_url),alt:`${d.login} avatar`,referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-5 w-5 shrink-0 text-muted","aria-hidden":!0}),r.jsxs("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-foreground",children:["@",d.login]}),r.jsx("span",{className:"shrink-0 rounded-full bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold text-muted",children:d.job_count})]},d.login))}):null]})}function Ge({label:e,children:t,className:s}){return r.jsxs("label",{className:ie("grid min-w-0 gap-1 text-xs font-semibold text-muted",s),children:[e,t]})}function Gi({jobs:e,loading:t,onViewJob:s,now:n}){return t&&e.length===0?r.jsx(K,{text:"Loading jobs..."}):e.length===0?r.jsx(K,{text:"No jobs match the current filters."}):r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"grid gap-2 md:hidden",children:e.map(i=>r.jsx(Bi,{job:i,onViewJob:s,now:n},i.id))}),r.jsx("div",{className:"hidden max-h-[640px] overflow-auto rounded-md border border-border md:block",children:r.jsxs("table",{className:"min-w-full border-collapse text-sm",children:[r.jsx("thead",{children:r.jsxs("tr",{className:"sticky top-0 border-b border-border bg-panel text-left text-xs text-muted",children:[r.jsx("th",{className:"px-2 py-2 font-semibold",children:"ID"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Status"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Repo / thread"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Action"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Actor"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Attempts"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Queue wait"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Runtime"}),r.jsx("th",{className:"px-2 py-2 font-semibold",children:"Updated"})]})}),r.jsx("tbody",{children:e.map(i=>r.jsxs("tr",{className:"cursor-pointer border-b border-border hover:bg-slate-50",onClick:()=>s(i.id),children:[r.jsxs("td",{className:"px-2 py-3 font-mono",children:["#",i.id]}),r.jsx("td",{className:"px-2 py-3",children:r.jsx(xs,{status:i.status})}),r.jsxs("td",{className:"px-2 py-3",children:[r.jsx("div",{className:"font-mono",children:i.repo??i.work_key}),r.jsxs("div",{className:"text-xs text-muted",children:["thread ",i.thread??"n/a"]})]}),r.jsxs("td",{className:"px-2 py-3",children:[r.jsx("div",{children:i.action}),r.jsx("div",{className:"text-xs text-muted",children:i.intent})]}),r.jsx("td",{className:"px-2 py-3",children:r.jsx(ps,{actor:i.trigger_actor,avatarUrl:i.trigger_actor_avatar_url})}),r.jsx("td",{className:"px-2 py-3",children:i.attempts}),r.jsx("td",{className:"px-2 py-3",children:ae(ms(i,n))}),r.jsx("td",{className:"px-2 py-3",children:ae(fs(i,n))}),r.jsx("td",{className:"px-2 py-3 font-mono text-xs",children:r.jsx(pe,{value:i.updated_at,compact:!0,relative:!0,now:n})})]},i.id))})]})})]})}function Bi({job:e,onViewJob:t,now:s}){return r.jsx("article",{className:"rounded-md border border-border bg-white shadow-[0_1px_0_rgba(15,23,42,0.03)]",children:r.jsxs("button",{className:"grid w-full gap-2 p-3 text-left hover:bg-slate-50",type:"button",onClick:()=>t(e.id),children:[r.jsxs("div",{className:"flex items-start justify-between gap-2",children:[r.jsxs("div",{className:"min-w-0 space-y-1",children:[r.jsxs("div",{className:"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-2",children:[r.jsxs("span",{className:"shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),r.jsx("span",{className:"truncate font-mono text-sm",children:e.repo??e.work_key})]}),r.jsx("div",{className:"line-clamp-2 text-sm leading-snug text-foreground",children:e.subject}),r.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[r.jsxs("span",{children:["thread ",e.thread??"n/a"," · ",e.action]}),r.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})]})]}),r.jsx(xs,{status:e.status})]}),r.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[r.jsx(ee,{label:"Wait",value:ae(ms(e,s))}),r.jsx(ee,{label:"Runtime",value:ae(fs(e,s))}),r.jsx(ee,{label:"Updated",value:r.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:s})})]})]})})}function ps({actor:e,avatarUrl:t,framed:s=!1}){const n=t?r.jsx("img",{className:"h-4 w-4 shrink-0 rounded-full bg-slate-100",src:ot(t),alt:e?`${e} avatar`:"",referrerPolicy:"no-referrer"}):r.jsx(Ft,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),i=r.jsxs(r.Fragment,{children:[n,r.jsx("span",{className:"min-w-0 truncate",children:e?`@${e}`:"unknown actor"})]});return s?r.jsx("span",{className:"inline-flex h-7 max-w-full items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-muted",children:i}):r.jsx("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 font-mono text-xs text-muted",children:i})}function Hi({job:e,session:t,sessionEvents:s,transcript:n,now:i,compact:o=!1}){var v;const c=Rr(e.id),l=s??[],d=n??[],u=Pi(l),h=Mi(d),b=fs(e,i),j=ms(e,i);return r.jsxs("div",{className:"grid min-w-0 gap-4",children:[r.jsxs("div",{className:"grid gap-2",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx(xs,{status:e.status}),r.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:c,children:[r.jsx(In,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.id]}),r.jsx(ps,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url,framed:!0})]}),r.jsx("div",{className:"min-w-0 break-words font-mono text-sm [overflow-wrap:anywhere]",children:e.work_key}),r.jsx("p",{className:"min-w-0 break-words text-sm text-muted [overflow-wrap:anywhere]",children:e.subject})]}),r.jsxs("div",{className:ie("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-3"),children:[r.jsx(ee,{label:"Queue wait",value:ae(j)}),r.jsx(ee,{label:e.status==="running"?"Running for":"Runtime",value:ae(b)}),r.jsx(ee,{label:"Coalesced",value:String(e.coalesced_count)})]}),r.jsxs("div",{className:ie("grid gap-2 text-sm sm:gap-3",o?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[r.jsx(ee,{label:"Created",value:r.jsx(pe,{value:e.created_at,compact:!0,relative:!0,now:i})}),r.jsx(ee,{label:"Started",value:e.started_at?r.jsx(pe,{value:e.started_at,compact:!0,relative:!0,now:i}):"n/a"}),r.jsx(ee,{label:"Updated",value:r.jsx(pe,{value:e.updated_at,compact:!0,relative:!0,now:i})}),r.jsx(ee,{label:"Finished",value:e.finished_at?r.jsx(pe,{value:e.finished_at,compact:!0,relative:!0,now:i}):"n/a"})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Timeline"}),r.jsx("div",{className:"grid min-w-0 gap-3",children:(e.worklog??[]).length>0?(v=e.worklog)==null?void 0:v.map(p=>r.jsxs("div",{className:"min-w-0 border-l-2 border-primary pl-3",children:[r.jsx("div",{className:"text-sm font-semibold",children:p.phase}),r.jsx("div",{className:"font-mono text-xs text-muted",children:r.jsx(pe,{value:p.ts,relative:!0,now:i})}),r.jsx("div",{className:"break-words text-sm [overflow-wrap:anywhere]",children:p.summary}),p.detail?r.jsx("div",{className:"mt-1 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:p.detail}):null]},p.id)):r.jsx(K,{text:"No worklog entries."})})]}),r.jsxs("div",{children:[r.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Qn,{className:"h-4 w-4","aria-hidden":!0}),"OpenClaw session"]}),t?r.jsxs("div",{className:"grid gap-3",children:[r.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[r.jsx(ee,{label:"Session ID",value:t.id}),r.jsx(ee,{label:"Source",value:t.source})]}),r.jsx("p",{className:"break-words text-xs text-muted [overflow-wrap:anywhere]",children:t.detail})]}):r.jsx(K,{text:"Session correlation is loading."})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Agent activity"}),r.jsx("div",{className:"grid max-h-[460px] min-w-0 gap-2 overflow-auto pr-1",children:u.length>0?u.map((p,x)=>r.jsx(Wi,{event:p,defaultOpen:Ls(p.eventType,e.status==="running",x,u.length),now:i},p.id)):r.jsx(K,{text:e.status==="running"?"Waiting for live agent output...":"No agent activity has been recorded for this session."})})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Session transcript"}),r.jsx("div",{className:"grid max-h-[620px] min-w-0 gap-2 overflow-auto pr-1",children:h.length>0?h.map((p,x)=>r.jsx(Ji,{entry:p,defaultOpen:Ls(p.kind,e.status==="running",x,h.length),now:i},p.id)):r.jsx(K,{text:e.status==="running"?"Waiting for live transcript entries...":"No OpenClaw transcript entries are available for this session."})})]}),r.jsxs("div",{children:[r.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"GitHub links"}),r.jsx("ul",{className:"grid gap-2 text-sm",children:e.github_urls.length>0?e.github_urls.map(p=>r.jsx("li",{children:r.jsxs("a",{className:"break-all text-primary hover:underline [overflow-wrap:anywhere]",href:ot(p),rel:"noreferrer",target:"_blank",children:[r.jsx(gr,{className:"mr-1 inline h-3.5 w-3.5 align-[-2px]","aria-hidden":!0}),p]})},p)):r.jsx("li",{className:"text-muted",children:"No links recorded."})})]})]})}function Ji({entry:e,defaultOpen:t,now:s}){return r.jsx(_r,{badge:e.badge,meta:r.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:r.jsx("pre",{className:"max-h-72 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.text})})}function Wi({event:e,defaultOpen:t,now:s}){return r.jsx(_r,{badge:e.badge,meta:r.jsx(pe,{value:e.meta,relative:!0,now:s}),count:e.count,summary:e.summary,defaultOpen:t,children:e.detail?r.jsx("pre",{className:"max-h-56 max-w-full overflow-auto whitespace-pre-wrap break-words rounded bg-slate-950 px-2 py-1.5 font-mono text-xs leading-relaxed text-slate-100 [overflow-wrap:anywhere]",children:e.detail}):null})}function _r({badge:e,meta:t,count:s,summary:n,defaultOpen:i,children:o}){const[c,l]=W.useState(!!i);return r.jsxs("details",{className:"group min-w-0 rounded border border-border bg-slate-50/60",open:c,onToggle:d=>l(d.currentTarget.open),children:[r.jsxs("summary",{className:"grid cursor-pointer list-none gap-1 px-2 py-1.5 marker:hidden hover:bg-white",children:[r.jsxs("div",{className:"grid min-w-0 gap-1 sm:flex sm:items-center sm:justify-between sm:gap-2",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[r.jsx(xr,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),r.jsx("span",{className:"truncate font-mono text-[11px] font-semibold text-muted",children:e}),s&&s>1?r.jsx("span",{className:"rounded-sm border border-border px-1 font-mono text-[10px] text-muted",children:s}):null]}),r.jsx("span",{className:"min-w-0 truncate pl-5 font-mono text-[11px] text-muted sm:shrink-0 sm:pl-0",children:t})]}),r.jsx("div",{className:"min-w-0 break-words pl-5 text-xs text-foreground [overflow-wrap:anywhere] sm:truncate",children:n})]}),r.jsx("div",{className:"min-w-0 border-t border-border bg-white px-2 py-2",children:o})]})}function $s({label:e,values:t}){const s=[{name:"median",seconds:(t==null?void 0:t.median)??0},{name:"p90",seconds:(t==null?void 0:t.p90)??0},{name:"p99",seconds:(t==null?void 0:t.p99)??0}];return r.jsx("div",{className:"h-56",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(er,{data:s,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"name"}),r.jsx(as,{tickFormatter:ae}),r.jsx(os,{formatter:n=>[ae(Number(n)),e]}),r.jsx(tr,{dataKey:"seconds",fill:"#0969da",radius:[4,4,0,0]})]})})})}function Vi({values:e,loading:t,totalJobs:s}){const n=Object.entries(e??{}).map(([i,o])=>({day:i,count:o}));return t&&n.length===0?r.jsx(K,{text:"Loading job history..."}):n.length===0?r.jsx(K,{text:s>0?"Job history has no valid creation dates.":"No job history available."}):r.jsx("div",{className:"h-56",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(er,{data:n,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"day",minTickGap:16}),r.jsx(as,{allowDecimals:!1}),r.jsx(os,{formatter:i=>[Number(i),"jobs"]}),r.jsx(tr,{dataKey:"count",fill:"#16a34a",radius:[4,4,0,0]})]})})})}function Xi(e){return Object.values(e).reduce((t,s)=>t+s,0)}function Zi({data:e,loading:t}){var b,j,v,p,x,g;if(t&&!e)return r.jsx(K,{text:"Loading process activity..."});if(!e)return r.jsx(K,{text:"No process snapshot available."});const s=e.executor.children??[],n=s.flatMap(f=>Mr(f)),i=n.reduce((f,k)=>f+k.cpu_ticks,0),o=n.reduce((f,k)=>f+ea(k),0),c=e.executor.service==="active",l=n.slice(0,8).map(f=>({label:`pid ${f.pid}`,ticks:f.cpu_ticks})),d=(e.samples??[]).map(f=>({label:pt(f.ts),ticks:f.cpu_ticks,io:f.io_bytes,active:f.active_since_last_sample?"active":"quiet"})),u=d.length>0?d:l,h=(b=e.samples)==null?void 0:b[e.samples.length-1];return r.jsxs("div",{className:"grid gap-4",children:[r.jsx("div",{className:"rounded-md border border-slate-200 bg-slate-50 p-3",children:r.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[r.jsxs("div",{className:"min-w-0",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx("span",{className:ie("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",c?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-white text-slate-600"),children:c?"active":"idle"}),r.jsxs("span",{className:"font-mono text-xs text-muted",children:["service ",e.executor.service]})]}),r.jsx("div",{className:"mt-2 text-sm font-semibold text-foreground",children:e.running_jobs.length>0?`${e.running_jobs.length} running job${e.running_jobs.length===1?"":"s"}`:"No running jobs"}),e.running_jobs.length>0?r.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:e.running_jobs.slice(0,4).map(f=>r.jsxs("span",{className:"inline-flex min-h-6 items-center gap-1.5 rounded-full border border-blue-200 bg-white px-2 font-mono text-[11px] font-semibold text-blue-700",children:[r.jsx("span",{className:"h-2 w-2 rounded-full bg-blue-600 animate-live-pulse","aria-hidden":!0}),"#",f.id," ",ae(f.age_seconds)]},f.id))}):null,h?r.jsxs("p",{className:"mt-1 text-xs text-muted",children:["Last persisted sample ",pt(h.ts)," · ",h.active_since_last_sample?"activity observed":`quiet ${ae(h.idle_seconds)}`]}):null,r.jsx("p",{className:"mt-1 text-xs text-muted",children:e.detail})]}),r.jsxs("div",{className:"grid min-w-[190px] grid-cols-3 gap-2 text-center text-xs",children:[r.jsx(Qt,{label:"PID",value:e.executor.pid?String(e.executor.pid):"n/a"}),r.jsx(Qt,{label:"Children",value:String(n.length)}),r.jsx(Qt,{label:"CPU ticks",value:String(i)})]})]})}),r.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[r.jsx(Mt,{label:"Live process",value:((j=e.signals)==null?void 0:j.live_process.state)??(n.length>0?"live":"no_child_process"),detail:`${((v=e.signals)==null?void 0:v.live_process.child_count)??n.length} children`}),r.jsx(Mt,{label:"Process activity",value:((p=e.signals)==null?void 0:p.process_activity.state)??(h!=null&&h.active_since_last_sample?"active":"quiet"),detail:h?`sample ${pt(h.ts)}`:"no sample"}),r.jsx(Mt,{label:"Semantic progress",value:(x=e.signals)!=null&&x.semantic_progress.length?"recent":"none",detail:Us(e.running_jobs,"semantic_progress")}),r.jsx(Mt,{label:"Visible progress",value:(g=e.signals)!=null&&g.visible_progress.length?"streaming":"none",detail:Us(e.running_jobs,"visible_progress")})]}),e.alerts.length>0?r.jsx(Be,{tone:"error",text:e.alerts[0]}):null,r.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[r.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[r.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Ts,{className:"h-4 w-4","aria-hidden":!0}),d.length>0?"CPU history":"CPU ticks"]}),r.jsxs("span",{className:"font-mono text-xs text-muted",children:[Or(o)," I/O"]})]}),u.length>0?r.jsx("div",{className:"h-40",children:r.jsx(rs,{width:"100%",height:"100%",children:r.jsxs(Ar,{data:u,children:[r.jsx(ns,{strokeDasharray:"3 3"}),r.jsx(is,{dataKey:"label",tick:!1}),r.jsx(as,{allowDecimals:!1,tick:{fontSize:11}}),r.jsx(os,{formatter:f=>[Number(f),"cpu ticks"]}),r.jsx(Ir,{type:"monotone",dataKey:"ticks",stroke:"#0f766e",strokeWidth:2,dot:{r:3},activeDot:{r:5},isAnimationActive:!1})]})})}):r.jsx(K,{text:"No executor CPU samples available."})]}),r.jsxs("div",{className:"min-w-0",children:[r.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[r.jsx(Ts,{className:"h-4 w-4","aria-hidden":!0}),"Executor children"]}),s.length>0?r.jsx("div",{className:"grid gap-2",children:s.map(f=>r.jsx(Pr,{process:f},f.pid))}):r.jsx(K,{text:"No child process detected for the executor."})]})]})]})}function Yi({alerts:e,loading:t,now:s}){if(t&&!e)return r.jsx(K,{text:"Loading monitor alerts..."});const n=e??[];return n.length===0?r.jsx(K,{text:"No active monitor alerts."}):r.jsx("div",{className:"grid gap-2",children:n.slice(0,5).map(i=>r.jsxs("div",{className:"rounded-md border border-red-200 bg-red-50 p-2.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-semibold text-red-700",children:[r.jsx(br,{className:"h-3.5 w-3.5","aria-hidden":!0}),r.jsx("span",{children:i.severity}),r.jsx("span",{className:"font-normal text-red-600",children:kr(i.last_seen,s)}),i.observations>1?r.jsxs("span",{className:"rounded-full border border-red-200 bg-white px-1.5",children:[i.observations,"x"]}):null]}),r.jsx("p",{className:"mt-1 break-words text-sm font-medium text-red-950 [overflow-wrap:anywhere]",children:i.message})]},i.fingerprint))})}function Pr({process:e}){var n,i;const t=((n=e.io_bytes)==null?void 0:n.read_bytes)??0,s=((i=e.io_bytes)==null?void 0:i.write_bytes)??0;return r.jsxs("div",{className:"rounded-md border border-border bg-white p-2.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[r.jsxs("span",{className:"font-mono",children:["pid ",e.pid]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["state ",e.state]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["cpu ",e.cpu_ticks]}),r.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["I/O ",Or(t+s)]})]}),r.jsx("div",{className:"mt-2 break-words font-mono text-xs text-muted",children:e.cmd||"unknown command"}),e.children&&e.children.length>0?r.jsx("div",{className:"mt-3 border-l-2 border-border pl-3",children:e.children.map(o=>r.jsx(Pr,{process:o},o.pid))}):null]})}function Qt({label:e,value:t}){return r.jsxs("div",{className:"rounded-md border border-border bg-white px-2 py-2",children:[r.jsx("div",{className:"font-mono text-sm font-semibold text-foreground",children:t}),r.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Mt({label:e,value:t,detail:s}){return r.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-2.5",children:[r.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),r.jsx("div",{className:"mt-1 truncate text-sm font-semibold text-foreground",children:t}),r.jsx("div",{className:"mt-1 truncate font-mono text-[11px] text-muted",children:s})]})}function Us(e,t){const s=e.find(i=>i[t]),n=s==null?void 0:s[t];return!s||!n?"no running heartbeat":`#${s.id} ${n.phase} ${ae(n.age_seconds??null)}`}function Mr(e){return[e,...(e.children??[]).flatMap(t=>Mr(t))]}function ea(e){var t,s;return(((t=e.io_bytes)==null?void 0:t.read_bytes)??0)+(((s=e.io_bytes)==null?void 0:s.write_bytes)??0)}function Or(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ee({label:e,value:t}){return r.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[r.jsx("div",{className:"text-xs font-semibold text-muted",children:e}),r.jsx("div",{className:"mt-1 min-w-0 break-words text-sm [overflow-wrap:anywhere]",children:t})]})}function xs({status:e}){const t=Oi(e),s=e==="running"||e==="pending";return r.jsxs("span",{className:ie("inline-flex min-h-6 items-center gap-1.5 rounded-full border px-2 text-xs font-semibold",t.badge),children:[r.jsx("span",{className:ie("h-2.5 w-2.5 rounded-full",t.dot,s&&"animate-live-pulse"),"aria-hidden":!0}),e]})}function K({text:e}){return r.jsx("div",{className:"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted",children:e})}function Be({tone:e,text:t}){return r.jsx("div",{className:ie("rounded-md border p-3 text-sm",e==="error"&&"border-red-300 bg-red-50 text-red-700"),children:t})}function At({onClick:e,compactOnMobile:t=!1}){return r.jsxs("button",{className:ie("inline-flex h-8 items-center justify-center gap-2 rounded-md border border-border text-sm font-semibold text-foreground hover:bg-slate-50",t?"w-8 px-0 sm:w-auto sm:px-3":"px-3"),onClick:e,type:"button","aria-label":"Refresh",children:[r.jsx(qn,{className:"h-4 w-4","aria-hidden":!0}),r.jsx("span",{className:ie(t&&"hidden sm:inline"),children:"Refresh"})]})}const zs=document.getElementById("root");zs&&Ur.createRoot(zs).render(r.jsx(W.StrictMode,{children:r.jsx(xn,{client:vi,children:r.jsx(qi,{})})})); diff --git a/src/github_agent_bridge/dashboard_static/index.html b/src/github_agent_bridge/dashboard_static/index.html index 24ba977..0514de1 100644 --- a/src/github_agent_bridge/dashboard_static/index.html +++ b/src/github_agent_bridge/dashboard_static/index.html @@ -4,7 +4,7 @@ GitHub Agent Bridge Dashboard - +