diff --git a/dashboard/src/main.test.tsx b/dashboard/src/main.test.tsx index 2c61eeb..d905606 100644 --- a/dashboard/src/main.test.tsx +++ b/dashboard/src/main.test.tsx @@ -43,6 +43,8 @@ import { webhookQuerySelection, webhookTimeseriesPath, selectedWebhookHookIdFromPath, + selectedWebhookDeliveryIdFromPath, + WebhookDeliveryDetailPage, } from "./main"; describe("dashboard routing and API query helpers", () => { @@ -114,6 +116,12 @@ describe("dashboard routing and API query helpers", () => { expect(selectedWebhookHookIdFromPath("/webhooks")).toBeNull(); }); + it("recognizes shareable webhook delivery detail routes", () => { + expect(isWebhooksPath("/webhooks/deliveries/abc%2F123")).toBe(true); + expect(selectedWebhookDeliveryIdFromPath("/webhooks/deliveries/abc%2F123")).toBe("abc/123"); + expect(selectedWebhookDeliveryIdFromPath("/webhooks/hooks/42")).toBeNull(); + }); + it("shows a knowledge badge when proposed rules need moderation", () => { const onNavigate = vi.fn(); const { rerender } = render(); @@ -183,13 +191,30 @@ describe("dashboard routing and API query helpers", () => { expect(screen.getByText("#42")).toBeInTheDocument(); }); - it("shows sanitized hook configuration and recent delivery identity", () => { - render(); + it("shows sanitized hook configuration and can request a fresh ping", async () => { + const onPing = vi.fn().mockResolvedValue("GitHub accepted the ping request."); + const user = userEvent.setup(); + render(); expect(screen.getByRole("link", { name: /Open in GitHub/i })).toHaveAttribute("href", "https://github.com/organizations/gisce/settings/hooks/42"); expect(screen.getByText("https://gab.gisce.net/api/webhooks/github")).toBeInTheDocument(); expect(screen.getAllByText("issue_comment · created").length).toBeGreaterThan(0); expect(screen.getAllByText("delivery-1").length).toBeGreaterThan(0); + expect(screen.getByText("by @operator")).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Send ping" })); + expect(onPing).toHaveBeenCalledWith("42"); + expect(await screen.findByText("GitHub accepted the ping request.")).toBeInTheDocument(); + }); + + it("shows the full webhook payload and linked job status", async () => { + const onViewJob = vi.fn(); + const user = userEvent.setup(); + render(); + + expect(screen.getByText(/"body": "@giscebot fix it"/)).toBeInTheDocument(); + expect(screen.getByText("Job #91 · running · reply_comment · work_allowed")).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Open job" })); + expect(onViewJob).toHaveBeenCalledWith(91); }); it("loads the next hook cursor page when the inventory sentinel enters view", async () => { diff --git a/dashboard/src/main.tsx b/dashboard/src/main.tsx index ed6318f..7586185 100644 --- a/dashboard/src/main.tsx +++ b/dashboard/src/main.tsx @@ -155,6 +155,32 @@ type WebhookHookDetailResponse = { hook: WebhookHook; stats: { deliveries: number; duplicates: number; unsupported: number }; recent_deliveries: WebhookDelivery[]; + recent_actions?: WebhookHookAction[]; +}; + +type WebhookHookAction = { + id: number; + action: "ping"; + actor: string; + status: "requested" | "succeeded" | "failed"; + detail?: string | null; + created_at: string; + completed_at?: string | null; +}; + +type WebhookDeliveryDetailResponse = { + delivery: WebhookDelivery; + payload_hash: string; + payload: unknown | null; + job: { + id: number; + work_key: string; + status: string; + action: string; + decision: string; + work_intent: string; + updated_at: string; + } | null; }; type WebhookDeliveryFilters = { @@ -939,8 +965,13 @@ function selectedWebhookHookIdFromPath(pathname = window.location.pathname) { return match ? decodeURIComponent(match[1]) : null; } +function selectedWebhookDeliveryIdFromPath(pathname = window.location.pathname) { + const match = pathname.match(/^\/webhooks\/deliveries\/([^/]+)\/?$/); + return match ? decodeURIComponent(match[1]) : null; +} + function isWebhooksPath(pathname = window.location.pathname) { - return /^\/webhooks(?:\/hooks\/[^/]+)?\/?$/.test(pathname); + return /^\/webhooks(?:\/(?:hooks|deliveries)\/[^/]+)?\/?$/.test(pathname); } function repoFromScope(scope: string) { @@ -985,6 +1016,7 @@ function App() { const isSystemRoute = isSystemPath(pathname); const isWebhooksRoute = isWebhooksPath(pathname); const selectedWebhookHookId = selectedWebhookHookIdFromPath(pathname); + const selectedWebhookDeliveryId = selectedWebhookDeliveryIdFromPath(pathname); const isDashboardRoute = !isJobDetailRoute && !isKnowledgeRoute && !isMcpRoute && !isSystemRoute && !isWebhooksRoute; const selectedJobId = jobRouteId; const metrics = useQuery({ queryKey: ["metrics", dashboardTimeZone], queryFn: () => api<{ metrics: MetricsSummary }>(metricsSummaryPath()), enabled: isDashboardRoute || isSystemRoute }); @@ -1024,20 +1056,31 @@ function App() { queryFn: ({ pageParam }) => api(webhookHooksPath(50, pageParam)), initialPageParam: null as string | null, getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined, - enabled: webhookEnabled && webhookQuery.hooks && selectedWebhookHookId === null, + enabled: webhookEnabled && webhookQuery.hooks && selectedWebhookHookId === null && selectedWebhookDeliveryId === null, }); const webhookDeliveries = useInfiniteQuery({ queryKey: ["webhook-deliveries", webhookDeliveryFilters], queryFn: ({ pageParam }) => api(webhookDeliveriesPath(50, pageParam, webhookDeliveryFilters)), initialPageParam: null as string | null, getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined, - enabled: webhookEnabled && webhookQuery.deliveries && selectedWebhookHookId === null, + enabled: webhookEnabled && webhookQuery.deliveries && selectedWebhookHookId === null && selectedWebhookDeliveryId === null, }); const webhookHookDetail = useQuery({ queryKey: ["webhook-hook", selectedWebhookHookId], queryFn: () => api(`/api/webhooks/github/hooks/${encodeURIComponent(selectedWebhookHookId ?? "")}`), enabled: webhookEnabled && selectedWebhookHookId !== null, }); + const pingWebhookHook = React.useCallback(async (hookId: string) => { + const result = await api<{ detail: string }>(`/api/webhooks/github/hooks/${encodeURIComponent(hookId)}/ping`, { method: "POST" }); + void webhookHookDetail.refetch(); + window.setTimeout(() => void webhookHookDetail.refetch(), 1500); + return result.detail; + }, [webhookHookDetail]); + const webhookDeliveryDetail = useQuery({ + queryKey: ["webhook-delivery", selectedWebhookDeliveryId], + queryFn: () => api(`/api/webhooks/github/deliveries/${encodeURIComponent(selectedWebhookDeliveryId ?? "")}`), + enabled: webhookEnabled && selectedWebhookDeliveryId !== null, + }); const knowledge = useQuery({ queryKey: ["knowledge", knowledgeRepo, knowledgeStatus], queryFn: () => api(buildKnowledgeQuery(knowledgeRepo, knowledgeStatus)), @@ -1358,7 +1401,20 @@ function App() { onRefresh={() => mcpTokens.refetch()} /> ) : isWebhooksRoute ? ( - selectedWebhookHookId ? ( + selectedWebhookDeliveryId ? ( + { + setWebhookSection("deliveries"); + navigateDashboard("/webhooks"); + }} + onRefresh={() => webhookDeliveryDetail.refetch()} + onViewHook={(hookId) => navigateDashboard(`/webhooks/hooks/${encodeURIComponent(hookId)}`)} + onViewJob={viewJob} + /> + ) : selectedWebhookHookId ? ( webhookHookDetail.refetch()} onViewHook={(hookId) => navigateDashboard(`/webhooks/hooks/${encodeURIComponent(hookId)}`)} + onViewDelivery={(deliveryId) => navigateDashboard(`/webhooks/deliveries/${encodeURIComponent(deliveryId)}`)} + onPing={pingWebhookHook} /> ) : ( webhookSection === "hooks" ? webhookHooks.fetchNextPage() : webhookDeliveries.fetchNextPage()} onDeliveryFiltersChange={setWebhookDeliveryFilters} onViewHook={(hookId) => navigateDashboard(`/webhooks/hooks/${encodeURIComponent(hookId)}`)} + onViewDelivery={(deliveryId) => navigateDashboard(`/webhooks/deliveries/${encodeURIComponent(deliveryId)}`)} onRefresh={refreshWebhooks} /> ) @@ -1736,6 +1795,7 @@ type WebhookPageProps = { onLoadMore: () => void; onDeliveryFiltersChange: (filters: WebhookDeliveryFilters) => void; onViewHook: (hookId: string) => void; + onViewDelivery?: (deliveryId: string) => void; onRefresh: () => void; }; @@ -1760,6 +1820,7 @@ function WebhookPage({ onLoadMore, onDeliveryFiltersChange, onViewHook, + onViewDelivery = () => undefined, onRefresh, }: WebhookPageProps) { const observed = Object.values(summary?.receipts ?? {}).reduce((total, count) => total + count, 0); @@ -1770,7 +1831,7 @@ function WebhookPage({ ]; return (
- } title="GitHub webhooks" subtitle={summary?.mode === "canary" ? "Canary ingestion health. Only enabled repositories may create jobs." : "Shadow ingestion health. Deliveries are observed but do not create jobs."} action={} /> + } title="GitHub webhooks" subtitle={summary?.mode === "primary" ? "Primary webhook ingestion. IMAP remains active as an idempotent safety net." : summary?.mode === "canary" ? "Canary ingestion health. Only enabled repositories may create jobs." : "Shadow ingestion health. Deliveries are observed but do not create jobs."} action={} /> {error ? : null}
{sections.map((item) => )} @@ -1805,7 +1866,7 @@ function WebhookPage({ : null} {section === "deliveries" ? - {sectionLoading ? : deliveries?.length ? : } + {sectionLoading ? : deliveries?.length ? : } : null}
); @@ -1821,8 +1882,8 @@ function WebhookDeliveryFiltersForm({ filters, onChange }: { filters: WebhookDel return
{fields.map((field) => )}
; } -function WebhookDeliveriesTable({ deliveries, onViewHook }: { deliveries: WebhookDelivery[]; onViewHook: (hookId: string) => void }) { - return {deliveries.map((delivery) => )}
ReceivedHookEventRepositoryResultDelivery
{delivery.created_at}{delivery.hook_id ? : Unknown (legacy)}{delivery.event_name}{delivery.action ? ` · ${delivery.action}` : ""}{delivery.repository ?? "—"}{delivery.status}{delivery.duplicate_count ? {delivery.duplicate_count} retries : null}{delivery.delivery_id}
; +function WebhookDeliveriesTable({ deliveries, onViewHook, onViewDelivery = () => undefined }: { deliveries: WebhookDelivery[]; onViewHook: (hookId: string) => void; onViewDelivery?: (deliveryId: string) => void }) { + return {deliveries.map((delivery) => )}
ReceivedHookEventRepositoryResultDelivery
{delivery.created_at}{delivery.hook_id ? : Unknown (legacy)}{delivery.event_name}{delivery.action ? ` · ${delivery.action}` : ""}{delivery.repository ?? "—"}{delivery.status}{delivery.duplicate_count ? {delivery.duplicate_count} retries : null}
; } function LazyScrollFrame({ noun, hasMore, loading, onLoadMore, children, className }: { noun: string; hasMore: boolean; loading: boolean; onLoadMore?: () => void; children: React.ReactNode; className?: string }) { @@ -1857,12 +1918,37 @@ function LazyLoadSentinel({ noun, hasMore, loading, onLoadMore }: { noun: string return
{loading ? `Loading more ${noun}...` : `Scroll for more ${noun}`}
; } -function WebhookHookDetailPage({ data, loading, error, onBack, onRefresh, onViewHook }: { data?: WebhookHookDetailResponse; loading: boolean; error: Error | null; onBack: () => void; onRefresh: () => void; onViewHook: (hookId: string) => void }) { +function WebhookHookDetailPage({ data, loading, error, onBack, onRefresh, onViewHook, onViewDelivery = () => undefined, onPing }: { data?: WebhookHookDetailResponse; loading: boolean; error: Error | null; onBack: () => void; onRefresh: () => void; onViewHook: (hookId: string) => void; onViewDelivery?: (deliveryId: string) => void; onPing?: (hookId: string) => Promise }) { + const [pingPending, setPingPending] = React.useState(false); + const [pingResult, setPingResult] = React.useState(""); + const [pingError, setPingError] = React.useState(""); if (loading) return ; if (error) return
; if (!data) return ; const hook = data.hook; - return

{hook.target}

{hook.target_type} webhook #{hook.id}

{hook.admin_url ? Open in GitHub : null}
} />} />} />} />
Subscribed events
{hook.events.length ? hook.events.map((event) => {event}) : No event snapshot; redeliver a ping.}
{data.recent_deliveries.length ? : }
; + const requestPing = async () => { + if (!onPing || pingPending) return; + setPingPending(true); + setPingResult(""); + setPingError(""); + try { + setPingResult(await onPing(hook.id)); + } catch (err) { + setPingError(err instanceof Error ? err.message : String(err)); + } finally { + setPingPending(false); + } + }; + const recentActions = data.recent_actions ?? []; + return

{hook.target}

{hook.target_type} webhook #{hook.id}

{hook.ping_url && onPing ? : null}{hook.admin_url ? Open in GitHub : null}
{pingError ? : null}{pingResult ?
{pingResult}
: null}
} />} />} />} />
Subscribed events
{hook.events.length ? hook.events.map((event) => {event}) : No event snapshot; send a ping to refresh it.}
{recentActions.length ?
{recentActions.map((action) =>
{action.action}by @{action.actor}
{action.status} · {action.created_at}
)}
: }
{data.recent_deliveries.length ? : }
; +} + +function WebhookDeliveryDetailPage({ data, loading, error, onBack, onRefresh, onViewHook, onViewJob }: { data?: WebhookDeliveryDetailResponse; loading: boolean; error: Error | null; onBack: () => void; onRefresh: () => void; onViewHook: (hookId: string) => void; onViewJob: (jobId: number) => void }) { + if (loading) return ; + if (error) return
; + if (!data) return ; + const delivery = data.delivery; + return

{delivery.event_name}{delivery.action ? ` · ${delivery.action}` : ""}

Delivery {delivery.delivery_id}

{delivery.hook_id ? : null}
{data.job ?
{data.job.work_key}
Job #{data.job.id} · {data.job.status} · {data.job.action} · {data.job.work_intent}
: }
{data.payload === null ? :
{JSON.stringify(data.payload, null, 2)}
}
; } function SystemPage({ @@ -4429,6 +4515,7 @@ export { SystemdUnits, UserMenu, WebPushControl, + WebhookDeliveryDetailPage, KnowledgePage, KnowledgeProposals, KnowledgeRules, @@ -4442,6 +4529,7 @@ export { isSystemPath, isWebhooksPath, selectedWebhookHookIdFromPath, + selectedWebhookDeliveryIdFromPath, isRetryableStatus, groupSessionEvents, groupTranscriptEntries, diff --git a/docs/ingestion.md b/docs/ingestion.md index f523901..65ba1d5 100644 --- a/docs/ingestion.md +++ b/docs/ingestion.md @@ -42,6 +42,10 @@ accepts a possible duplicate rather than risk dropping a legitimate action. operational cycle has no unexplained IMAP-only actionable events. Phase 1 is exposed as `POST /api/webhooks/github` by the dashboard service. +For production, nginx should route that exact path to the dedicated +socket-activated `github-agent-bridge-webhook.service` on port 8766. The +dashboard keeps the route for backward compatibility, but using it couples +GitHub delivery availability to dashboard/UI restarts. For a single trusted owner, configure `GITHUB_AGENT_BRIDGE_WEBHOOK_SECRET`; during rotation, `GITHUB_AGENT_BRIDGE_WEBHOOK_PREVIOUS_SECRET` accepts the old secret as well. This legacy form accepts any repository signed with that shared @@ -82,10 +86,11 @@ Multiple organizations and multiple hooks may use the same endpoint when each owner has its own entry in `GITHUB_AGENT_BRIDGE_WEBHOOK_SECRETS_BY_OWNER`. GitHub's `X-GitHub-Hook-ID` header keeps their inventory and activity separate. -The endpoint stores only routing metadata, a SHA-256 payload hash, and the -canonical event key in `webhook_shadow_receipts`; it deliberately stores no raw -payload and never creates a queue job. The monitoring API is split so opening -the overview does not load hook inventory or delivery history: +The endpoint stores routing metadata, a SHA-256 payload hash, the canonical +event key, and the verified JSON payload in `webhook_shadow_receipts`. The +payload follows the same bounded retention as its receipt and is exposed only +through the administrator-only delivery detail endpoint. The monitoring API is +split so opening the overview does not load hook inventory or delivery history: - `GET /api/webhooks/github/summary` returns mode, receipt counts, retries, and cross-source coverage (`both`, `imap_only`, `webhook_only`) with an explicit @@ -103,15 +108,28 @@ the overview does not load hook inventory or delivery history: configuration (never the secret or raw payload), while later deliveries update its latest event, repository, delivery ID, and result. - `GET /api/webhooks/github/hooks/{hook_id}` returns the sanitized hook detail, - aggregate retained-delivery counts, and its most recent deliveries. + aggregate retained-delivery counts, its most recent deliveries, and recent + audited administrative actions. +- `POST /api/webhooks/github/hooks/{hook_id}/ping` lets a dashboard administrator + ask GitHub to send a fresh `ping`. The server validates the stored URL against + the exact `api.github.com` organization or repository hook path before calling + `gh api`; browser OAuth credentials are never reused. The operational `gh` + identity needs `Organization hooks: write` or `Repository webhooks: write`. + Requested, successful, and failed actions are recorded with the administrator + login, while CLI failure details remain hidden from the HTTP response. - `GET /api/webhooks/github/deliveries?limit=<1-100>&cursor=` returns a cursor-paginated delivery page. Optional `hook_id`, `event_name`, `repository`, and `result` filters are applied server-side; every row includes the known hook identity so operators can navigate directly to its detail. +- `GET /api/webhooks/github/deliveries/{delivery_id}` returns the retained full + JSON payload, its SHA-256 hash, delivery metadata, and the linked job summary + when ingestion created or coalesced into a job. Legacy receipts created before + payload retention return `payload: null`. The dashboard loads these resources lazily per tab, caches them separately, and -appends cursor pages as the inventory or delivery list scrolls. Hook detail URLs -are shareable under `/webhooks/hooks/{hook_id}` and link to GitHub's webhook +appends cursor pages as the inventory or delivery list scrolls. Hook and +delivery detail URLs are shareable under `/webhooks/hooks/{hook_id}` and +`/webhooks/deliveries/{delivery_id}`; hook detail links to GitHub's webhook settings when the target is known. Here “operators” means users authorized as dashboard administrators through `GITHUB_AGENT_BRIDGE_DASHBOARD_ADMIN_USERS` or @@ -119,7 +137,7 @@ Here “operators” means users authorized as dashboard administrators through HTTP 403 to other authenticated users and HTTP 401 to unauthenticated users. Receipt details are retained for 30 days by default and pruned during ingestion; set `GITHUB_AGENT_BRIDGE_WEBHOOK_RETENTION_DAYS` to change that window. Raw -payloads are never retained. +payloads are pruned with their receipts. The maintained event inventory and support levels are in [`webhook-events.md`](webhook-events.md). @@ -147,5 +165,26 @@ outside `enabledRepos` remain observational only. For `workflow_run.completed`, only runs with `conclusion: failure` enqueue work; successful and other conclusions remain observational. +## Primary webhook with stable IMAP fallback + +After the dashboard gate has no unexplained IMAP-only actionable events, set +both `GITHUB_AGENT_BRIDGE_WEBHOOK_MODE=primary` and +`GITHUB_AGENT_BRIDGE_WEBHOOK_PRIMARY_ACK=true`. The second switch is a deliberate +operator acknowledgement; `primary` fails closed without it. The configured +policy remains authoritative for trust, action and routing decisions. + +Primary changes which source is expected to win, not the idempotency model. +Keep the IMAP reader enabled during the stable fallback phase. If webhook +delivery is late or unavailable, email still creates the canonical event and +job; if both arrive, the unique event key links the second receipt to the first +job. Rollback is configuration-only: return the endpoint to `shadow`, leave the +IMAP reader running, and inspect the exception queue before trying primary +again. Do not enable `--mark-seen` merely because primary mode is active. + +This implementation does not add an arbitrary sleep to IMAP. Delaying the +reader would also delay genuine webhook gaps and complicate its durable UID +cursor. The first-source metrics make the actual winner visible, while the +shared transaction guarantees correctness independently of arrival order. + Webhook enqueueing must not be enabled until recovery of persisted-but- unprocessed receipts and divergence metrics have been validated in production. diff --git a/docs/installation.md b/docs/installation.md index 9121a65..4acf98b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -230,6 +230,10 @@ cp systemd/github-agent-bridge-autoupdate.service ~/.config/systemd/user/ cp systemd/github-agent-bridge-autoupdate.timer ~/.config/systemd/user/ # Optional dashboard API for operator tooling: cp systemd/github-agent-bridge-dashboard.service ~/.config/systemd/user/ +# Recommended for public GitHub webhooks. The socket remains owned by systemd +# while the small ingress process restarts. +cp systemd/github-agent-bridge-webhook.service ~/.config/systemd/user/ +cp systemd/github-agent-bridge-webhook.socket ~/.config/systemd/user/ systemctl --user daemon-reload systemctl --user enable --now github-agent-bridge.service @@ -239,6 +243,7 @@ systemctl --user enable --now github-agent-bridge-feedback.timer systemctl --user enable --now github-agent-bridge-autoupdate.timer # Optional: # systemctl --user enable --now github-agent-bridge-dashboard.service +# systemctl --user enable --now github-agent-bridge-webhook.socket ``` The reader timer calls the packaged `github-agent-bridge-reader-run` console @@ -292,6 +297,13 @@ Set `GITHUB_AGENT_BRIDGE_GITHUB_APP_ID` or configured on the GitHub App automatically. `GITHUB_AGENT_BRIDGE_WEB_PUSH_ICON_URL` can still override the notification icon with an explicit URL. +When webhooks are enabled, start `github-agent-bridge-webhook.socket` and route +the exact `/api/webhooks/github` path to `127.0.0.1:8766`. systemd owns the +listening socket and keeps a backlog while `github-agent-bridge-webhook.service` +is replaced, so dashboard restarts and short ingress restarts do not produce a +connection-refused window. Do not enable the service directly; enabling the +socket starts it on demand. + When the dashboard is published through nginx, use the proxy settings from [`operations.md`](operations.md#dashboard-api-service) or start from [`nginx-dashboard.conf`](nginx-dashboard.conf). The example keeps live SSE @@ -301,7 +313,10 @@ briefly unavailable. ```bash systemctl --user status github-agent-bridge-dashboard.service +systemctl --user status github-agent-bridge-webhook.socket +systemctl --user status github-agent-bridge-webhook.service curl http://127.0.0.1:8765/api/health +curl http://127.0.0.1:8766/api/health ``` ## Monitor health diff --git a/docs/nginx-dashboard.conf b/docs/nginx-dashboard.conf index e3fd6a4..eb0e88c 100644 --- a/docs/nginx-dashboard.conf +++ b/docs/nginx-dashboard.conf @@ -11,6 +11,20 @@ server { # ssl_certificate /etc/letsencrypt/live/bridge.example.com/fullchain.pem; # ssl_certificate_key /etc/letsencrypt/live/bridge.example.com/privkey.pem; + # Keep webhook ingestion independent from dashboard/UI restarts. systemd + # owns this socket and queues short bursts while the ingress process swaps. + location = /api/webhooks/github { + proxy_pass http://127.0.0.1:8766; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_connect_timeout 5s; + proxy_read_timeout 30s; + proxy_send_timeout 30s; + } + location / { proxy_pass http://127.0.0.1:8765; proxy_http_version 1.1; diff --git a/docs/operations.md b/docs/operations.md index 31451f2..dcb6daa 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -341,6 +341,12 @@ a job URL to open the dashboard with that job's session, worklog, activity feed and GitHub links selected. The UI is a Vite + React + TypeScript app styled with Tailwind and operational components, using TanStack Query for API state and Recharts for percentile charts. +Webhook administrators can request a configuration refresh from a hook detail +page. This runs `gh api --method POST ` under the dashboard +service identity, so `gh auth status` must report an account with organization +or repository webhook write permission. Each request and result is retained in +`webhook_hook_actions`; raw CLI errors are audited but are not returned to the +browser. The process activity API and dashboard distinguish live executor process state, persisted process activity, semantic job progress, and visible transcript/output progress so operators can tell whether a running job is merely alive or actually @@ -356,6 +362,16 @@ them in the viewer's local timezone from `Intl.DateTimeFormat`; hovering a rendered timestamp shows the UTC value. Production serves the static bundle from `src/github_agent_bridge/dashboard_static`. + +Public webhook ingestion should use the separate +`github-agent-bridge-webhook.socket` and `github-agent-bridge-webhook.service`. +The ingress app exposes only `GET /api/health` and +`POST /api/webhooks/github`; dashboard, OAuth, monitoring and administration +routes are deliberately absent. systemd owns `127.0.0.1:8766` and passes file +descriptor 3 to Uvicorn, retaining queued TCP connections across short process +restarts. Consequently a dashboard/UI deployment does not interrupt webhook +delivery, and an ingress deployment has no connection-refused gap while the +service is replaced. When VAPID keys are configured and the dashboard is exposed over HTTPS, signed-in users can enable the header bell control. The executor sends final `done` and `blocked` job notifications through those browser push subscriptions for the @@ -509,6 +525,8 @@ restart errors so browser users see a short auto-refreshing maintenance page instead of nginx's generic "Bad Gateway" response while the dashboard service is restarting. A complete example is available in [`nginx-dashboard.conf`](nginx-dashboard.conf). +The example routes the exact webhook path to the socket-activated ingress on +port 8766 before the generic dashboard location. ```nginx location / { diff --git a/docs/webhook-events.md b/docs/webhook-events.md index c8243fe..13cc248 100644 --- a/docs/webhook-events.md +++ b/docs/webhook-events.md @@ -8,16 +8,16 @@ planning a new integration. Last reviewed: 2026-10-02. Support levels: -- **Canonical shadow**: persisted with an immutable canonical event key and - eligible for IMAP/webhook coverage comparison. It never creates a job in - Phase 1. +- **Canonical**: persisted with an immutable canonical event key and eligible + for IMAP/webhook coverage comparison. It is observational in shadow mode and + may enqueue in canary/primary mode when policy permits it. - **Observed only**: a signed delivery can be persisted as `unsupported`, but no canonical key is derived. - **Not selected**: operators should not subscribe to it in Phase 1. | Support | GitHub event names | | --- | --- | -| Canonical shadow | `commit_comment`, `issue_comment`, `pull_request_review`, `pull_request_review_comment`, `workflow_run` | +| Canonical | `commit_comment`, `issue_comment`, `pull_request_review`, `pull_request_review_comment`, `workflow_run` | | Observed only / not selected | `branch_protection_configuration`, `branch_protection_rule`, `check_run`, `check_suite`, `code_scanning_alert`, `create`, `custom_property`, `custom_property_values`, `delete`, `dependabot_alert`, `deploy_key`, `deployment`, `deployment_protection_rule`, `deployment_review`, `deployment_status`, `discussion`, `discussion_comment`, `fork`, `github_app_authorization`, `gollum`, `installation`, `installation_repositories`, `installation_target`, `issue_dependencies`, `issue_relates_to`, `issues`, `label`, `marketplace_purchase`, `member`, `membership`, `merge_group`, `meta`, `milestone`, `org_block`, `organization`, `package`, `page_build`, `personal_access_token_request`, `ping`, `project`, `project_card`, `project_column`, `projects_v2`, `projects_v2_item`, `projects_v2_status_update`, `public`, `pull_request`, `pull_request_review_thread`, `push`, `registry_package`, `release`, `repository`, `repository_advisory`, `repository_dispatch`, `repository_import`, `repository_ruleset`, `repository_vulnerability_alert`, `secret_scanning_alert`, `secret_scanning_alert_location`, `secret_scanning_scan`, `security_advisory`, `security_and_analysis`, `sponsorship`, `star`, `status`, `sub_issues`, `team`, `team_add`, `watch`, `workflow_dispatch`, `workflow_job` | The inventory names event families, not every `action` value. Actions are diff --git a/pyproject.toml b/pyproject.toml index 7737937..80c1e6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ test = ["pytest>=8", "fastapi>=0.110", "httpx>=0.27", "uvicorn>=0.29"] gab = "github_agent_bridge.cli:main" github-agent-bridge = "github_agent_bridge.cli:main" github-agent-bridge-dashboard = "github_agent_bridge.backend:main" +github-agent-bridge-webhook = "github_agent_bridge.backend:webhook_main" github-agent-bridge-reader-run = "github_agent_bridge.reader_run:main" github-agent-bridge-monitor-alert = "github_agent_bridge.monitor_alert:main" github-agent-bridge-autoupdate-run = "github_agent_bridge.autoupdate_run:main" diff --git a/src/github_agent_bridge/autoupdate.py b/src/github_agent_bridge/autoupdate.py index 62ef762..8a3b47e 100644 --- a/src/github_agent_bridge/autoupdate.py +++ b/src/github_agent_bridge/autoupdate.py @@ -36,10 +36,20 @@ "src/github_agent_bridge/dashboard_data.py", "src/github_agent_bridge/dashboard_static/", ) +WEBHOOK_PATH_PREFIXES = ( + "src/github_agent_bridge/backend.py", + "src/github_agent_bridge/models.py", + "src/github_agent_bridge/parser.py", + "src/github_agent_bridge/policy.py", + "src/github_agent_bridge/queue.py", + "src/github_agent_bridge/sql/", + "src/github_agent_bridge/webhook.py", +) SYSTEMD_PATH_PREFIXES = ("systemd/",) DEFAULT_SYSTEMD_UNITS = { "executor": "github-agent-bridge.service", "dashboard": "github-agent-bridge-dashboard.service", + "webhook": "github-agent-bridge-webhook.service", "reader": "github-agent-bridge-reader.timer", "monitor": "github-agent-bridge-monitor.timer", "feedback": "github-agent-bridge-feedback.timer", @@ -129,9 +139,15 @@ def classify_changed_files(files: Sequence[str]) -> dict[str, Any]: risky_files = [path for path in files if path.startswith(RISKY_PATH_PREFIXES)] migration_files = [path for path in files if path.startswith("src/github_agent_bridge/sql/") or "/migrations/" in path] dashboard_files = [path for path in files if path.startswith(DASHBOARD_PATH_PREFIXES)] + webhook_files = [path for path in files if path.startswith(WEBHOOK_PATH_PREFIXES)] systemd_files = [path for path in files if path.startswith(SYSTEMD_PATH_PREFIXES)] - dashboard_only = bool(files) and len(dashboard_files) == len(files) - risk = "dashboard_only" if dashboard_only else "executor_or_shared" + dashboard_only = bool(files) and len(dashboard_files) == len(files) and not webhook_files + webhook_only = bool(files) and len(webhook_files) == len(files) and not dashboard_files and not risky_files + api_only = bool(files) and all( + path.startswith(DASHBOARD_PATH_PREFIXES) or path.startswith(WEBHOOK_PATH_PREFIXES) + for path in files + ) and not risky_files + risk = "dashboard_only" if dashboard_only else "webhook_only" if webhook_only else "api_only" if api_only else "executor_or_shared" if migration_files: risk = "migration_required" elif risky_files: @@ -143,6 +159,9 @@ def classify_changed_files(files: Sequence[str]) -> dict[str, Any]: return { "risk": risk, "dashboard_only": dashboard_only, + "webhook_only": webhook_only, + "api_only": api_only, + "webhook_files": webhook_files, "risky_files": risky_files, "migration_files": migration_files, "systemd_files": systemd_files, @@ -168,15 +187,25 @@ def action(command: str, unit_key: str, reason: str) -> dict[str, str]: if decision == "stage_dashboard_reload": immediate.append(action("try-restart", "dashboard", "dashboard-only update can reload independently")) + elif decision == "stage_webhook_reload": + immediate.append(action("try-restart", "webhook", "webhook ingress update can reload independently")) + elif decision == "stage_api_reload": + immediate.append(action("try-restart", "dashboard", "dashboard API update can reload independently")) + immediate.append(action("try-restart", "webhook", "webhook ingress update can reload independently")) elif decision == "stage_defer_executor_reload": immediate.append(action("try-restart", "dashboard", "dashboard can refresh while executor jobs finish")) + if classification.get("webhook_files"): + immediate.append(action("try-restart", "webhook", "webhook ingress can refresh independently")) deferred.append(action("restart", "executor", "executor/shared update waits for active queue to drain")) elif decision == "stage_full_reload": immediate.append(action("try-restart", "dashboard", "refresh dashboard after package update")) + if classification.get("webhook_files"): + immediate.append(action("try-restart", "webhook", "refresh webhook ingress after package update")) immediate.append(action("restart", "executor", "queue is quiet, executor reload is allowed")) elif decision == "defer_migration": deferred.append(action("restart", "executor", "schema migration must wait for active queue to drain")) deferred.append(action("try-restart", "dashboard", "dashboard refresh waits for migration window")) + deferred.append(action("try-restart", "webhook", "webhook ingress refresh waits for migration window")) if daemon_reload: affected_units = sorted( @@ -186,6 +215,7 @@ def action(command: str, unit_key: str, reason: str) -> dict[str, str]: for key, filename in ( ("executor", "github-agent-bridge.service"), ("dashboard", "github-agent-bridge-dashboard.service"), + ("webhook", "github-agent-bridge-webhook.service"), ("reader", "github-agent-bridge-reader.timer"), ("monitor", "github-agent-bridge-monitor.timer"), ("feedback", "github-agent-bridge-feedback.timer"), @@ -743,6 +773,11 @@ def plan_update( elif classification["dashboard_only"]: decision = "stage_dashboard_reload" dashboard_restart_allowed = True + elif classification["webhook_only"]: + decision = "stage_webhook_reload" + elif classification["api_only"]: + decision = "stage_api_reload" + dashboard_restart_allowed = True elif active_total: decision = "stage_defer_executor_reload" executor_reload_pending = True diff --git a/src/github_agent_bridge/backend.py b/src/github_agent_bridge/backend.py index 1656803..564b68c 100644 --- a/src/github_agent_bridge/backend.py +++ b/src/github_agent_bridge/backend.py @@ -10,6 +10,7 @@ import secrets import shlex import sqlite3 +import subprocess import sys import threading import urllib.error @@ -216,6 +217,43 @@ def _webhook_delivery_payload(row: sqlite3.Row) -> dict[str, Any]: } +def _webhook_ping_endpoint(row: sqlite3.Row) -> str: + hook_id = str(row["hook_id"]) + target = str(row["target"]) + if row["target_type"] == "organization": + path = f"/orgs/{urllib.parse.quote(target, safe='')}/hooks/{urllib.parse.quote(hook_id, safe='')}/pings" + elif row["target_type"] == "repository" and target.count("/") == 1: + owner, repository = target.split("/", 1) + path = ( + f"/repos/{urllib.parse.quote(owner, safe='')}/{urllib.parse.quote(repository, safe='')}" + f"/hooks/{urllib.parse.quote(hook_id, safe='')}/pings" + ) + else: + raise ValueError("webhook_ping_target_invalid") + parsed = urllib.parse.urlparse(str(row["ping_url"] or "")) + if ( + parsed.scheme != "https" + or parsed.netloc != "api.github.com" + or parsed.path != path + or parsed.params + or parsed.query + or parsed.fragment + ): + raise ValueError("webhook_ping_url_invalid") + return path + + +def _request_webhook_ping(endpoint: str, *, gh_bin: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + [gh_bin, "api", "--method", "POST", endpoint], + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + timeout=15, + ) + + class DashboardConfig: def __init__( self, @@ -239,6 +277,7 @@ def __init__( webhook_retention_days: int | None = None, webhook_mode: str | None = None, webhook_policy: str | Path | None = None, + webhook_primary_ack: bool | None = None, ) -> None: self.db = Path(db).expanduser() self.secret_key = secret_key or os.getenv("GITHUB_AGENT_BRIDGE_DASHBOARD_SECRET_KEY", "") @@ -263,12 +302,19 @@ def __init__( self.webhook_max_bytes = webhook_max_bytes or int(os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_MAX_BYTES", "1048576")) self.webhook_retention_days = webhook_retention_days or int(os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_RETENTION_DAYS", "30")) self.webhook_mode = (webhook_mode or os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_MODE", "shadow")).lower() - if self.webhook_mode not in {"shadow", "canary"}: - raise ValueError("GITHUB_AGENT_BRIDGE_WEBHOOK_MODE must be shadow or canary") + if self.webhook_mode not in {"shadow", "canary", "primary"}: + raise ValueError("GITHUB_AGENT_BRIDGE_WEBHOOK_MODE must be shadow, canary, or primary") policy_value = webhook_policy or os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_POLICY", "") self.webhook_policy = Path(policy_value).expanduser() if policy_value else None - if self.webhook_mode == "canary" and self.webhook_policy is None: - raise ValueError("GITHUB_AGENT_BRIDGE_WEBHOOK_POLICY is required in canary mode") + if self.webhook_mode != "shadow" and self.webhook_policy is None: + raise ValueError("GITHUB_AGENT_BRIDGE_WEBHOOK_POLICY is required outside shadow mode") + self.webhook_primary_ack = ( + webhook_primary_ack + if webhook_primary_ack is not None + else os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_PRIMARY_ACK", "").lower() in {"1", "true", "yes"} + ) + if self.webhook_mode == "primary" and not self.webhook_primary_ack: + raise ValueError("primary webhook mode requires GITHUB_AGENT_BRIDGE_WEBHOOK_PRIMARY_ACK=true") @property def oauth_ready(self) -> bool: @@ -317,6 +363,7 @@ def _autoupdate_systemd_units() -> dict[str, str]: return { "executor": _env("GITHUB_AGENT_BRIDGE_EXECUTOR_UNIT", "github-agent-bridge.service"), "dashboard": _env("GITHUB_AGENT_BRIDGE_DASHBOARD_UNIT", "github-agent-bridge-dashboard.service"), + "webhook": _env("GITHUB_AGENT_BRIDGE_WEBHOOK_UNIT", "github-agent-bridge-webhook.service"), "reader": _env("GITHUB_AGENT_BRIDGE_READER_TIMER_UNIT", "github-agent-bridge-reader.timer"), "monitor": _env("GITHUB_AGENT_BRIDGE_MONITOR_TIMER_UNIT", "github-agent-bridge-monitor.timer"), "feedback": _env("GITHUB_AGENT_BRIDGE_FEEDBACK_TIMER_UNIT", "github-agent-bridge-feedback.timer"), @@ -648,6 +695,112 @@ def _is_admin(config: DashboardConfig, login: str, token: str | None = None) -> return False +def _webhook_schema_initializer(config: DashboardConfig): + lock = threading.Lock() + ready = False + + def ensure() -> None: + nonlocal ready + if ready: + return + with lock: + if not ready: + JobQueue(config.db) + ready = True + + return ensure + + +async def _receive_github_webhook( + request: Request, + config: DashboardConfig, + ensure_webhook_schema, +) -> dict[str, Any]: + if request.headers.get("content-type", "").split(";", 1)[0].strip().lower() != "application/json": + raise HTTPException(status_code=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE, detail="application_json_required") + delivery_id = request.headers.get("x-github-delivery", "").strip() + event_name = request.headers.get("x-github-event", "").strip() + hook_id = request.headers.get("x-github-hook-id", "").strip() or None + signature = request.headers.get("x-hub-signature-256", "").strip() + if not delivery_id or not event_name: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="github_headers_required") + content_length = request.headers.get("content-length") + if content_length: + try: + if int(content_length) > config.webhook_max_bytes: + raise HTTPException(status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, detail="payload_too_large") + except ValueError: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid_content_length") + raw_payload = await request.body() + if len(raw_payload) > config.webhook_max_bytes: + raise HTTPException(status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, detail="payload_too_large") + try: + payload = json.loads(raw_payload) + except (json.JSONDecodeError, UnicodeDecodeError): + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid_json") + repository = payload.get("repository") if isinstance(payload, dict) else None + full_name = repository.get("full_name") if isinstance(repository, dict) else None + owner = str(full_name or "").partition("/")[0].lower() + if config.webhook_secrets_by_owner: + webhook_secrets = config.webhook_secrets_by_owner.get(owner, ()) + if not webhook_secrets: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="repository_owner_not_allowed") + else: + webhook_secrets = config.webhook_secrets + if not verify_signature(raw_payload, signature, webhook_secrets): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid_signature") + ensure_webhook_schema() + enqueue_status = None + job_id = None + if config.webhook_mode in {"canary", "primary"}: + policy = Policy.from_file(config.webhook_policy) + notification = webhook_notification(event_name, delivery_id, payload) + repo = str(full_name or "").lower() + if notification is None: + enqueue_status = "ignored" + elif config.webhook_mode == "canary" and repo not in policy.enabled_repos: + enqueue_status = "outside_canary" + else: + job, enqueue_status = JobQueue(config.db).ingest( + notification, policy, source="webhook", source_key=delivery_id, + ) + job_id = job.id if job else None + receipt = persist_shadow_delivery( + config.db, + delivery_id=delivery_id, + event_name=event_name, + raw_payload=raw_payload, + hook_id=hook_id, + retention_days=config.webhook_retention_days, + ) + response = { + "mode": config.webhook_mode, + "status": receipt.status, + "event_key": receipt.event_key, + } + if config.webhook_mode != "shadow": + response.update({"enqueue_status": enqueue_status, "job_id": job_id}) + return response + + +def create_webhook_app(config: DashboardConfig | None = None) -> FastAPI: + configure_sentry(service="webhook-ingress") + config = config or DashboardConfig() + ensure_webhook_schema = _webhook_schema_initializer(config) + app = FastAPI(title="GitHub Agent Bridge Webhook Ingress") + app.state.dashboard_config = config + + @app.get("/api/health") + def health() -> dict[str, Any]: + return {"ok": True, "service": "github-agent-bridge-webhook-ingress"} + + @app.post("/api/webhooks/github") + async def github_webhook(request: Request) -> dict[str, Any]: + return await _receive_github_webhook(request, config, ensure_webhook_schema) + + return app + + def create_app(config: DashboardConfig | None = None) -> FastAPI: configure_sentry(service="dashboard") config = config or DashboardConfig() @@ -664,17 +817,7 @@ async def lifespan(app: FastAPI): app = FastAPI(title="GitHub Agent Bridge Dashboard API", lifespan=lifespan) app.state.dashboard_config = config app.state.dashboard_shutdown_event = shutdown_event - webhook_schema_lock = threading.Lock() - webhook_schema_ready = False - - def ensure_webhook_schema() -> None: - nonlocal webhook_schema_ready - if webhook_schema_ready: - return - with webhook_schema_lock: - if not webhook_schema_ready: - JobQueue(config.db) - webhook_schema_ready = True + ensure_webhook_schema = _webhook_schema_initializer(config) assets_dir = config.static_dir / "assets" if assets_dir.exists(): @@ -742,71 +885,7 @@ def health() -> dict[str, Any]: @app.post("/api/webhooks/github") async def github_webhook_shadow(request: Request) -> dict[str, Any]: - if request.headers.get("content-type", "").split(";", 1)[0].strip().lower() != "application/json": - raise HTTPException(status_code=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE, detail="application_json_required") - delivery_id = request.headers.get("x-github-delivery", "").strip() - event_name = request.headers.get("x-github-event", "").strip() - hook_id = request.headers.get("x-github-hook-id", "").strip() or None - signature = request.headers.get("x-hub-signature-256", "").strip() - if not delivery_id or not event_name: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="github_headers_required") - content_length = request.headers.get("content-length") - if content_length: - try: - if int(content_length) > config.webhook_max_bytes: - raise HTTPException(status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, detail="payload_too_large") - except ValueError: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid_content_length") - raw_payload = await request.body() - if len(raw_payload) > config.webhook_max_bytes: - raise HTTPException(status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, detail="payload_too_large") - try: - payload = json.loads(raw_payload) - except (json.JSONDecodeError, UnicodeDecodeError): - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid_json") - repository = payload.get("repository") if isinstance(payload, dict) else None - full_name = repository.get("full_name") if isinstance(repository, dict) else None - owner = str(full_name or "").partition("/")[0].lower() - if config.webhook_secrets_by_owner: - webhook_secrets = config.webhook_secrets_by_owner.get(owner, ()) - if not webhook_secrets: - raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="repository_owner_not_allowed") - else: - webhook_secrets = config.webhook_secrets - if not verify_signature(raw_payload, signature, webhook_secrets): - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid_signature") - ensure_webhook_schema() - enqueue_status = None - job_id = None - if config.webhook_mode == "canary": - policy = Policy.from_file(config.webhook_policy) - notification = webhook_notification(event_name, delivery_id, payload) - repo = str(full_name or "").lower() - if notification is None: - enqueue_status = "ignored" - elif repo not in policy.enabled_repos: - enqueue_status = "outside_canary" - else: - job, enqueue_status = JobQueue(config.db).ingest( - notification, policy, source="webhook", source_key=delivery_id, - ) - job_id = job.id if job else None - receipt = persist_shadow_delivery( - config.db, - delivery_id=delivery_id, - event_name=event_name, - raw_payload=raw_payload, - hook_id=hook_id, - retention_days=config.webhook_retention_days, - ) - response = { - "mode": config.webhook_mode, - "status": receipt.status, - "event_key": receipt.event_key, - } - if config.webhook_mode != "shadow": - response.update({"enqueue_status": enqueue_status, "job_id": job_id}) - return response + return await _receive_github_webhook(request, config, ensure_webhook_schema) @app.get("/api/webhooks/github/status") @app.get("/api/webhooks/github/summary") @@ -988,6 +1067,11 @@ def github_webhook_shadow_hook_detail( "WHERE r.hook_id=? ORDER BY r.created_at DESC,r.delivery_id DESC LIMIT 20", (hook_id,), ).fetchall() + recent_actions = con.execute( + "SELECT id,action,actor,status,detail,created_at,completed_at " + "FROM webhook_hook_actions WHERE hook_id=? ORDER BY created_at DESC,id DESC LIMIT 10", + (hook_id,), + ).fetchall() return { "hook": _webhook_hook_payload(hook), "stats": { @@ -996,6 +1080,61 @@ def github_webhook_shadow_hook_detail( "unsupported": stats["unsupported"] or 0, }, "recent_deliveries": [_webhook_delivery_payload(row) for row in recent], + "recent_actions": [dict(row) for row in recent_actions], + } + + @app.post("/api/webhooks/github/hooks/{hook_id}/ping") + def github_webhook_hook_ping( + hook_id: str, + profile: dict[str, Any] = Depends(current_admin_profile), + ) -> dict[str, Any]: + ensure_webhook_schema() + created_at = datetime.now(UTC).isoformat() + with sqlite3.connect(config.db) as con: + con.row_factory = sqlite3.Row + hook = con.execute( + "SELECT hook_id,target,target_type,ping_url FROM webhook_hooks WHERE hook_id=?", + (hook_id,), + ).fetchone() + if hook is None: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="webhook_hook_not_found") + try: + endpoint = _webhook_ping_endpoint(hook) + except ValueError as exc: + raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail=str(exc)) from exc + cursor = con.execute( + "INSERT INTO webhook_hook_actions(hook_id,action,actor,status,created_at) VALUES(?,?,?,?,?)", + (hook_id, "ping", str(profile["login"]), "requested", created_at), + ) + action_id = int(cursor.lastrowid) + con.commit() + + def finish(action_status: str, detail: str) -> None: + with sqlite3.connect(config.db) as con: + con.execute( + "UPDATE webhook_hook_actions SET status=?,detail=?,completed_at=? WHERE id=?", + (action_status, detail[:1000], datetime.now(UTC).isoformat(), action_id), + ) + con.commit() + + try: + result = _request_webhook_ping(endpoint, gh_bin=_env("GITHUB_AGENT_BRIDGE_GH_BIN", "gh")) + except FileNotFoundError as exc: + finish("failed", "gh executable not found") + raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="github_cli_unavailable") from exc + except subprocess.TimeoutExpired as exc: + finish("failed", "GitHub ping request timed out") + raise HTTPException(status_code=status.HTTP_504_GATEWAY_TIMEOUT, detail="github_webhook_ping_timeout") from exc + if result.returncode != 0: + detail = result.stderr.strip() or result.stdout.strip() or f"gh exited {result.returncode}" + finish("failed", detail) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="github_webhook_ping_failed") + finish("succeeded", "GitHub accepted the ping request") + return { + "action_id": action_id, + "hook_id": hook_id, + "status": "succeeded", + "detail": "GitHub accepted the ping request; configuration will refresh when delivery arrives.", } @app.get("/api/webhooks/github/deliveries") @@ -1044,6 +1183,43 @@ def github_webhook_shadow_deliveries( "next_cursor": next_cursor, } + @app.get("/api/webhooks/github/deliveries/{delivery_id}") + def github_webhook_delivery_detail( + delivery_id: str, + _: dict[str, Any] = Depends(current_admin_profile), + ) -> dict[str, Any]: + ensure_webhook_schema() + with sqlite3.connect(config.db) as con: + con.row_factory = sqlite3.Row + row = con.execute( + "SELECT r.delivery_id,r.hook_id,r.event_name,r.action,r.event_key,r.repository,r.status," + "r.duplicate_count,r.created_at,r.payload_hash,r.payload_json," + "h.target hook_target,h.target_type hook_target_type," + "j.id job_id,j.work_key job_work_key,j.status job_status,j.action job_action," + "j.decision job_decision,j.work_intent job_work_intent,j.updated_at job_updated_at " + "FROM webhook_shadow_receipts r " + "LEFT JOIN webhook_hooks h ON h.hook_id=r.hook_id " + "LEFT JOIN ingest_receipts i ON i.source='webhook' AND i.source_key=r.delivery_id " + "LEFT JOIN jobs j ON j.id=i.job_id WHERE r.delivery_id=?", + (delivery_id,), + ).fetchone() + if row is None: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="webhook_delivery_not_found") + payload = json.loads(row["payload_json"]) if row["payload_json"] else None + job = None + if row["job_id"] is not None: + job = { + "id": row["job_id"], "work_key": row["job_work_key"], "status": row["job_status"], + "action": row["job_action"], "decision": row["job_decision"], + "work_intent": row["job_work_intent"], "updated_at": row["job_updated_at"], + } + return { + "delivery": _webhook_delivery_payload(row), + "payload_hash": row["payload_hash"], + "payload": payload, + "job": job, + } + def dashboard_index() -> FileResponse: index = config.static_dir / "index.html" if not index.exists(): @@ -1118,6 +1294,7 @@ def api_status(request: Request, profile: dict[str, Any] = Depends(current_profi "delete_knowledge_rule", "create_mcp_token", "revoke_mcp_token", + "ping_webhook", ] if profile.get("is_admin"): admin_actions.extend(["view_autoupdate_plan", "refresh_autoupdate_plan", "apply_autoupdate", "complete_autoupdate_reload"]) @@ -1567,25 +1744,39 @@ def callback(code: str, state: str, request: Request) -> RedirectResponse: app = create_app() -def build_parser() -> argparse.ArgumentParser: +def build_parser(*, ingress: bool = False) -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog=Path(sys.argv[0]).name) parser.add_argument("--db", default=os.getenv("GITHUB_AGENT_BRIDGE_DASHBOARD_DB", os.getenv("GITHUB_AGENT_BRIDGE_DB", DEFAULT_DB))) - parser.add_argument("--host", default=DEFAULT_HOST) - parser.add_argument("--port", type=int, default=DEFAULT_PORT) - parser.add_argument("--no-auth", action="store_true", help="disable auth for isolated local development only") + parser.add_argument("--host", default=os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_HOST", DEFAULT_HOST) if ingress else DEFAULT_HOST) + parser.add_argument("--port", type=int, default=int(os.getenv("GITHUB_AGENT_BRIDGE_WEBHOOK_PORT", "8766")) if ingress else DEFAULT_PORT) + parser.add_argument("--fd", type=int, help="serve an inherited systemd socket file descriptor") + if not ingress: + parser.add_argument("--no-auth", action="store_true", help="disable auth for isolated local development only") return parser -def main(argv: list[str] | None = None) -> int: - args = build_parser().parse_args(argv) +def _serve_uvicorn(application: FastAPI, args: argparse.Namespace) -> int: try: import uvicorn except ImportError: print("uvicorn is required; install github-agent-bridge[dashboard]", file=sys.stderr) return 2 - uvicorn.run(create_app(DashboardConfig(db=args.db, require_auth=not args.no_auth)), host=args.host, port=args.port) + if args.fd is not None: + uvicorn.run(application, fd=args.fd) + else: + uvicorn.run(application, host=args.host, port=args.port) return 0 +def main(argv: list[str] | None = None) -> int: + args = build_parser().parse_args(argv) + return _serve_uvicorn(create_app(DashboardConfig(db=args.db, require_auth=not args.no_auth)), args) + + +def webhook_main(argv: list[str] | None = None) -> int: + args = build_parser(ingress=True).parse_args(argv) + return _serve_uvicorn(create_webhook_app(DashboardConfig(db=args.db)), args) + + if __name__ == "__main__": raise SystemExit(main()) diff --git a/src/github_agent_bridge/dashboard_static/assets/index-B-EQqzq2.js b/src/github_agent_bridge/dashboard_static/assets/index-B-EQqzq2.js new file mode 100644 index 0000000..032df4f --- /dev/null +++ b/src/github_agent_bridge/dashboard_static/assets/index-B-EQqzq2.js @@ -0,0 +1,187 @@ +var ra=e=>{throw TypeError(e)};var Kr=(e,t,n)=>t.has(e)||ra("Cannot "+n);var g=(e,t,n)=>(Kr(e,t,"read from private field"),n?n.call(e):t.get(e)),U=(e,t,n)=>t.has(e)?ra("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),O=(e,t,n,r)=>(Kr(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),ee=(e,t,n)=>(Kr(e,t,"access private method"),n);var vr=(e,t,n,r)=>({set _(s){O(e,t,s,n)},get _(){return g(e,t,r)}});import{f as oc,h as lc,g as Bi,r as ke,R as A,d as rr,a as qr,C as ir,X as sr,Y as ar,T as or,L as Co,B as Wt,e as cc,c as uc,b as dc}from"./charts-SqBiqy9C.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const a of s)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(s){const a={};return s.integrity&&(a.integrity=s.integrity),s.referrerPolicy&&(a.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?a.credentials="include":s.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(s){if(s.ep)return;s.ep=!0;const a=n(s);fetch(s.href,a)}})();var Qr={exports:{}},In={};/** + * @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 ia;function hc(){if(ia)return In;ia=1;var e=oc(),t=Symbol.for("react.element"),n=Symbol.for("react.fragment"),r=Object.prototype.hasOwnProperty,s=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function o(l,c,u){var d,h={},m=null,p=null;u!==void 0&&(m=""+u),c.key!==void 0&&(m=""+c.key),c.ref!==void 0&&(p=c.ref);for(d in c)r.call(c,d)&&!a.hasOwnProperty(d)&&(h[d]=c[d]);if(l&&l.defaultProps)for(d in c=l.defaultProps,c)h[d]===void 0&&(h[d]=c[d]);return{$$typeof:t,type:l,key:m,ref:p,props:h,_owner:s.current}}return In.Fragment=n,In.jsx=o,In.jsxs=o,In}var sa;function pc(){return sa||(sa=1,Qr.exports=hc()),Qr.exports}var i=pc(),jr={},aa;function mc(){if(aa)return jr;aa=1;var e=lc();return jr.createRoot=e.createRoot,jr.hydrateRoot=e.hydrateRoot,jr}var fc=mc();const xc=Bi(fc);var lr=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(){}},zt,St,cn,xo,gc=(xo=class extends lr{constructor(){super();U(this,zt);U(this,St);U(this,cn);O(this,cn,t=>{if(typeof window<"u"&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){g(this,St)||this.setEventListener(g(this,cn))}onUnsubscribe(){var t;this.hasListeners()||((t=g(this,St))==null||t.call(this),O(this,St,void 0))}setEventListener(t){var n;O(this,cn,t),(n=g(this,St))==null||n.call(this),O(this,St,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){g(this,zt)!==t&&(O(this,zt,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(n=>{n(t)})}isFocused(){var t;return typeof g(this,zt)=="boolean"?g(this,zt):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},zt=new WeakMap,St=new WeakMap,cn=new WeakMap,xo),Ui=new gc,bc={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},Ct,qi,go,yc=(go=class{constructor(){U(this,Ct,bc);U(this,qi,!1)}setTimeoutProvider(e){O(this,Ct,e)}setTimeout(e,t){return g(this,Ct).setTimeout(e,t)}clearTimeout(e){g(this,Ct).clearTimeout(e)}setInterval(e,t){return g(this,Ct).setInterval(e,t)}clearInterval(e){g(this,Ct).clearInterval(e)}},Ct=new WeakMap,qi=new WeakMap,go),Ft=new yc;function wc(e){setTimeout(e,0)}var vc=typeof window>"u"||"Deno"in globalThis;function Ae(){}function jc(e,t){return typeof e=="function"?e(t):e}function ui(e){return typeof e=="number"&&e>=0&&e!==1/0}function _o(e,t){return Math.max(e+(t||0)-Date.now(),0)}function At(e,t){return typeof e=="function"?e(t):e}function Be(e,t){return typeof e=="function"?e(t):e}function oa(e,t){const{type:n="all",exact:r,fetchStatus:s,predicate:a,queryKey:o,stale:l}=e;if(o){if(r){if(t.queryHash!==$i(o,t.options))return!1}else if(!Qn(t.queryKey,o))return!1}if(n!=="all"){const c=t.isActive();if(n==="active"&&!c||n==="inactive"&&c)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||s&&s!==t.state.fetchStatus||a&&!a(t))}function la(e,t){const{exact:n,status:r,predicate:s,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(Kn(t.options.mutationKey)!==Kn(a))return!1}else if(!Qn(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||s&&!s(t))}function $i(e,t){return((t==null?void 0:t.queryKeyHashFn)||Kn)(e)}function Kn(e){return JSON.stringify(e,(t,n)=>hi(n)?Object.keys(n).sort().reduce((r,s)=>(r[s]=n[s],r),{}):n)}function Qn(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(n=>Qn(e[n],t[n])):!1}var kc=Object.prototype.hasOwnProperty;function Eo(e,t,n=0){if(e===t)return e;if(n>500)return t;const r=ca(e)&&ca(t);if(!r&&!(hi(e)&&hi(t)))return t;const a=(r?e:Object.keys(e)).length,o=r?t:Object.keys(t),l=o.length,c=r?new Array(l):{};let u=0;for(let d=0;d{Ft.setTimeout(t,e)})}function pi(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?Eo(e,t):t}function Sc(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function Cc(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var Hi=Symbol();function Po(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===Hi?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function Ro(e,t){return typeof e=="function"?e(...t):!!e}function _c(e,t,n){let r=!1,s;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(s??(s=t()),r||(r=!0,s.aborted?n():s.addEventListener("abort",n,{once:!0})),s)}),e}var Vn=(()=>{let e=()=>vc;return{isServer(){return e()},setIsServer(t){e=t}}})();function mi(){let e,t;const n=new Promise((s,a)=>{e=s,t=a});n.status="pending",n.catch(()=>{});function r(s){Object.assign(n,s),delete n.resolve,delete n.reject}return n.resolve=s=>{r({status:"fulfilled",value:s}),e(s)},n.reject=s=>{r({status:"rejected",reason:s}),t(s)},n}var Ec=wc;function Pc(){let e=[],t=0,n=l=>{l()},r=l=>{l()},s=Ec;const a=l=>{t?e.push(l):s(()=>{n(l)})},o=()=>{const l=e;e=[],l.length&&s(()=>{r(()=>{l.forEach(c=>{n(c)})})})};return{batch:l=>{let c;t++;try{c=l()}finally{t--,t||o()}return c},batchCalls:l=>(...c)=>{a(()=>{l(...c)})},schedule:a,setNotifyFunction:l=>{n=l},setBatchNotifyFunction:l=>{r=l},setScheduler:l=>{s=l}}}var je=Pc(),un,_t,dn,bo,Rc=(bo=class extends lr{constructor(){super();U(this,un,!0);U(this,_t);U(this,dn);O(this,dn,t=>{if(typeof window<"u"&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){g(this,_t)||this.setEventListener(g(this,dn))}onUnsubscribe(){var t;this.hasListeners()||((t=g(this,_t))==null||t.call(this),O(this,_t,void 0))}setEventListener(t){var n;O(this,dn,t),(n=g(this,_t))==null||n.call(this),O(this,_t,t(this.setOnline.bind(this)))}setOnline(t){g(this,un)!==t&&(O(this,un,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return g(this,un)}},un=new WeakMap,_t=new WeakMap,dn=new WeakMap,bo),Ar=new Rc;function Ic(e){return Math.min(1e3*2**e,3e4)}function Io(e){return(e??"online")==="online"?Ar.isOnline():!0}var fi=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function To(e){let t=!1,n=0,r;const s=mi(),a=()=>s.status!=="pending",o=w=>{var v;if(!a()){const y=new fi(w);m(y),(v=e.onCancel)==null||v.call(e,y)}},l=()=>{t=!0},c=()=>{t=!1},u=()=>Ui.isFocused()&&(e.networkMode==="always"||Ar.isOnline())&&e.canRun(),d=()=>Io(e.networkMode)&&e.canRun(),h=w=>{a()||(r==null||r(),s.resolve(w))},m=w=>{a()||(r==null||r(),s.reject(w))},p=()=>new Promise(w=>{var v;r=y=>{(a()||u())&&w(y)},(v=e.onPause)==null||v.call(e)}).then(()=>{var w;r=void 0,a()||(w=e.onContinue)==null||w.call(e)}),b=()=>{if(a())return;let w;const v=n===0?e.initialPromise:void 0;try{w=v??e.fn()}catch(y){w=Promise.reject(y)}Promise.resolve(w).then(h).catch(y=>{var j;if(a())return;const S=e.retry??(Vn.isServer()?0:3),C=e.retryDelay??Ic,k=typeof C=="function"?C(n,y):C,z=S===!0||typeof S=="number"&&nu()?void 0:p()).then(()=>{t?m(y):b()})})};return{promise:s,status:()=>s.status,cancel:o,continue:()=>(r==null||r(),s),cancelRetry:l,continueRetry:c,canStart:d,start:()=>(d()?b():p().then(b),s)}}var qt,yo,Ao=(yo=class{constructor(){U(this,qt)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),ui(this.gcTime)&&O(this,qt,Ft.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Vn.isServer()?1/0:300*1e3))}clearGcTimeout(){g(this,qt)!==void 0&&(Ft.clearTimeout(g(this,qt)),O(this,qt,void 0))}},qt=new WeakMap,yo);function Tc(e){return{onFetch:(t,n)=>{var d,h,m,p,b;const r=t.options,s=(m=(h=(d=t.fetchOptions)==null?void 0:d.meta)==null?void 0:h.fetchMore)==null?void 0:m.direction,a=((p=t.state.data)==null?void 0:p.pages)||[],o=((b=t.state.data)==null?void 0:b.pageParams)||[];let l={pages:[],pageParams:[]},c=0;const u=async()=>{let w=!1;const v=C=>{_c(C,()=>t.signal,()=>w=!0)},y=Po(t.options,t.fetchOptions),S=async(C,k,z)=>{if(w)return Promise.reject(t.signal.reason);if(k==null&&C.pages.length)return Promise.resolve(C);const q=(()=>{const L={client:t.client,queryKey:t.queryKey,pageParam:k,direction:z?"backward":"forward",meta:t.options.meta};return v(L),L})(),D=await y(q),{maxPages:P}=t.options,_=z?Cc:Sc;return{pages:_(C.pages,D,P),pageParams:_(C.pageParams,k,P)}};if(s&&a.length){const C=s==="backward",k=C?Lo:xi,z={pages:a,pageParams:o},j=k(r,z);l=await S(z,j,C)}else{const C=e??a.length;do{const k=c===0?o[0]??r.initialPageParam:xi(r,l);if(c>0&&k==null)break;l=await S(l,k),c++}while(c{var w,v;return(v=(w=t.options).persister)==null?void 0:v.call(w,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=u}}}function xi(e,{pages:t,pageParams:n}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Lo(e,{pages:t,pageParams:n}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n):void 0}function Ac(e,t){return t?xi(e,t)!=null:!1}function Lc(e,t){return!t||!e.getPreviousPageParam?!1:Lo(e,t)!=null}var hn,Bt,pn,$e,Ut,ve,Yn,$t,qe,Mo,ft,wo,Mc=(wo=class extends Ao{constructor(t){super();U(this,qe);U(this,hn);U(this,Bt);U(this,pn);U(this,$e);U(this,Ut);U(this,ve);U(this,Yn);U(this,$t);O(this,$t,!1),O(this,Yn,t.defaultOptions),this.setOptions(t.options),this.observers=[],O(this,Ut,t.client),O(this,$e,g(this,Ut).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,O(this,Bt,ha(this.options)),this.state=t.state??g(this,Bt),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return g(this,hn)}get promise(){var t;return(t=g(this,ve))==null?void 0:t.promise}setOptions(t){if(this.options={...g(this,Yn),...t},t!=null&&t._type&&O(this,hn,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const n=ha(this.options);n.data!==void 0&&(this.setState(da(n.data,n.dataUpdatedAt)),O(this,Bt,n))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&g(this,$e).remove(this)}setData(t,n){const r=pi(this.state.data,t,this.options);return ee(this,qe,ft).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t){ee(this,qe,ft).call(this,{type:"setState",state:t})}cancel(t){var r,s;const n=(r=g(this,ve))==null?void 0:r.promise;return(s=g(this,ve))==null||s.cancel(t),n?n.then(Ae).catch(Ae):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return g(this,Bt)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>Be(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Hi||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>At(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:!_o(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=g(this,ve))==null||n.continue()}onOnline(){var n;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=g(this,ve))==null||n.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),g(this,$e).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(n=>n!==t),this.observers.length||(g(this,ve)&&(g(this,$t)||ee(this,qe,Mo).call(this)?g(this,ve).cancel({revert:!0}):g(this,ve).cancelRetry()),this.scheduleGc()),g(this,$e).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||ee(this,qe,ft).call(this,{type:"invalidate"})}async fetch(t,n){var u,d,h,m,p,b,w,v,y,S,C;if(this.state.fetchStatus!=="idle"&&((u=g(this,ve))==null?void 0:u.status())!=="rejected"){if(this.state.data!==void 0&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if(g(this,ve))return g(this,ve).continueRetry(),g(this,ve).promise}if(t&&this.setOptions(t),!this.options.queryFn){const k=this.observers.find(z=>z.options.queryFn);k&&this.setOptions(k.options)}const r=new AbortController,s=k=>{Object.defineProperty(k,"signal",{enumerable:!0,get:()=>(O(this,$t,!0),r.signal)})},a=()=>{const k=Po(this.options,n),j=(()=>{const q={client:g(this,Ut),queryKey:this.queryKey,meta:this.meta};return s(q),q})();return O(this,$t,!1),this.options.persister?this.options.persister(k,j,this):k(j)},l=(()=>{const k={fetchOptions:n,options:this.options,queryKey:this.queryKey,client:g(this,Ut),state:this.state,fetchFn:a};return s(k),k})(),c=g(this,hn)==="infinite"?Tc(this.options.pages):this.options.behavior;c==null||c.onFetch(l,this),O(this,pn,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=l.fetchOptions)==null?void 0:d.meta))&&ee(this,qe,ft).call(this,{type:"fetch",meta:(h=l.fetchOptions)==null?void 0:h.meta}),O(this,ve,To({initialPromise:n==null?void 0:n.initialPromise,fn:l.fetchFn,onCancel:k=>{k instanceof fi&&k.revert&&this.setState({...g(this,pn),fetchStatus:"idle"}),r.abort()},onFail:(k,z)=>{ee(this,qe,ft).call(this,{type:"failed",failureCount:k,error:z})},onPause:()=>{ee(this,qe,ft).call(this,{type:"pause"})},onContinue:()=>{ee(this,qe,ft).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0}));try{const k=await g(this,ve).start();if(k===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(k),(p=(m=g(this,$e).config).onSuccess)==null||p.call(m,k,this),(w=(b=g(this,$e).config).onSettled)==null||w.call(b,k,this.state.error,this),k}catch(k){if(k instanceof fi){if(k.silent)return g(this,ve).promise;if(k.revert){if(this.state.data===void 0)throw k;return this.state.data}}throw ee(this,qe,ft).call(this,{type:"error",error:k}),(y=(v=g(this,$e).config).onError)==null||y.call(v,k,this),(C=(S=g(this,$e).config).onSettled)==null||C.call(S,this.state.data,k,this),k}finally{this.scheduleGc()}}},hn=new WeakMap,Bt=new WeakMap,pn=new WeakMap,$e=new WeakMap,Ut=new WeakMap,ve=new WeakMap,Yn=new WeakMap,$t=new WeakMap,qe=new WeakSet,Mo=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},ft=function(t){const n=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,...Do(r.data,this.options),fetchMeta:t.meta??null};case"success":const s={...r,...da(t.data,t.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return O(this,pn,t.manual?s:void 0),s;case"error":const a=t.error;return{...r,error:a,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),je.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),g(this,$e).notify({query:this,type:"updated",action:t})})},wo);function Do(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Io(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function da(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function ha(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Te,te,Zn,Ee,Ht,mn,xt,Et,er,fn,xn,Kt,Qt,Pt,gn,re,zn,gi,bi,yi,wi,vi,ji,ki,Fo,vo,Oo=(vo=class extends lr{constructor(t,n){super();U(this,re);U(this,Te);U(this,te);U(this,Zn);U(this,Ee);U(this,Ht);U(this,mn);U(this,xt);U(this,Et);U(this,er);U(this,fn);U(this,xn);U(this,Kt);U(this,Qt);U(this,Pt);U(this,gn,new Set);this.options=n,O(this,Te,t),O(this,Et,null),O(this,xt,mi()),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(g(this,te).addObserver(this),pa(g(this,te),this.options)?ee(this,re,zn).call(this):this.updateResult(),ee(this,re,wi).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Ni(g(this,te),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Ni(g(this,te),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,ee(this,re,vi).call(this),ee(this,re,ji).call(this),g(this,te).removeObserver(this)}setOptions(t){const n=this.options,r=g(this,te);if(this.options=g(this,Te).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof Be(this.options.enabled,g(this,te))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");ee(this,re,ki).call(this),g(this,te).setOptions(this.options),n._defaulted&&!di(this.options,n)&&g(this,Te).getQueryCache().notify({type:"observerOptionsUpdated",query:g(this,te),observer:this});const s=this.hasListeners();s&&ma(g(this,te),r,this.options,n)&&ee(this,re,zn).call(this),this.updateResult(),s&&(g(this,te)!==r||Be(this.options.enabled,g(this,te))!==Be(n.enabled,g(this,te))||At(this.options.staleTime,g(this,te))!==At(n.staleTime,g(this,te)))&&ee(this,re,gi).call(this);const a=ee(this,re,bi).call(this);s&&(g(this,te)!==r||Be(this.options.enabled,g(this,te))!==Be(n.enabled,g(this,te))||a!==g(this,Pt))&&ee(this,re,yi).call(this,a)}getOptimisticResult(t){const n=g(this,Te).getQueryCache().build(g(this,Te),t),r=this.createResult(n,t);return Oc(this,r)&&(O(this,Ee,r),O(this,mn,this.options),O(this,Ht,g(this,te).state)),r}getCurrentResult(){return g(this,Ee)}trackResult(t,n){return new Proxy(t,{get:(r,s)=>(this.trackProp(s),n==null||n(s),s==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&g(this,xt).status==="pending"&&g(this,xt).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(r,s))})}trackProp(t){g(this,gn).add(t)}getCurrentQuery(){return g(this,te)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const n=g(this,Te).defaultQueryOptions(t),r=g(this,Te).getQueryCache().build(g(this,Te),n);return r.fetch().then(()=>this.createResult(r,n))}fetch(t){return ee(this,re,zn).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),g(this,Ee)))}createResult(t,n){var P;const r=g(this,te),s=this.options,a=g(this,Ee),o=g(this,Ht),l=g(this,mn),u=t!==r?t.state:g(this,Zn),{state:d}=t;let h={...d},m=!1,p;if(n._optimisticResults){const _=this.hasListeners(),L=!_&&pa(t,n),R=_&&ma(t,r,n,s);(L||R)&&(h={...h,...Do(d.data,t.options)}),n._optimisticResults==="isRestoring"&&(h.fetchStatus="idle")}let{error:b,errorUpdatedAt:w,status:v}=h;p=h.data;let y=!1;if(n.placeholderData!==void 0&&p===void 0&&v==="pending"){let _;a!=null&&a.isPlaceholderData&&n.placeholderData===(l==null?void 0:l.placeholderData)?(_=a.data,y=!0):_=typeof n.placeholderData=="function"?n.placeholderData((P=g(this,xn))==null?void 0:P.state.data,g(this,xn)):n.placeholderData,_!==void 0&&(v="success",p=pi(a==null?void 0:a.data,_,n),m=!0)}if(n.select&&p!==void 0&&!y)if(a&&p===(o==null?void 0:o.data)&&n.select===g(this,er))p=g(this,fn);else try{O(this,er,n.select),p=n.select(p),p=pi(a==null?void 0:a.data,p,n),O(this,fn,p),O(this,Et,null)}catch(_){O(this,Et,_)}g(this,Et)&&(b=g(this,Et),p=g(this,fn),w=Date.now(),v="error");const S=h.fetchStatus==="fetching",C=v==="pending",k=v==="error",z=C&&S,j=p!==void 0,D={status:v,fetchStatus:h.fetchStatus,isPending:C,isSuccess:v==="success",isError:k,isInitialLoading:z,isLoading:z,data:p,dataUpdatedAt:h.dataUpdatedAt,error:b,errorUpdatedAt:w,failureCount:h.fetchFailureCount,failureReason:h.fetchFailureReason,errorUpdateCount:h.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:h.dataUpdateCount>u.dataUpdateCount||h.errorUpdateCount>u.errorUpdateCount,isFetching:S,isRefetching:S&&!C,isLoadingError:k&&!j,isPaused:h.fetchStatus==="paused",isPlaceholderData:m,isRefetchError:k&&j,isStale:Ki(t,n),refetch:this.refetch,promise:g(this,xt),isEnabled:Be(n.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const _=D.data!==void 0,L=D.status==="error"&&!_,R=E=>{L?E.reject(D.error):_&&E.resolve(D.data)},X=()=>{const E=O(this,xt,D.promise=mi());R(E)},F=g(this,xt);switch(F.status){case"pending":t.queryHash===r.queryHash&&R(F);break;case"fulfilled":(L||D.data!==F.value)&&X();break;case"rejected":(!L||D.error!==F.reason)&&X();break}}return D}updateResult(){const t=g(this,Ee),n=this.createResult(g(this,te),this.options);if(O(this,Ht,g(this,te).state),O(this,mn,this.options),g(this,Ht).data!==void 0&&O(this,xn,g(this,te)),di(n,t))return;O(this,Ee,n);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:s}=this.options,a=typeof s=="function"?s():s;if(a==="all"||!a&&!g(this,gn).size)return!0;const o=new Set(a??g(this,gn));return this.options.throwOnError&&o.add("error"),Object.keys(g(this,Ee)).some(l=>{const c=l;return g(this,Ee)[c]!==t[c]&&o.has(c)})};ee(this,re,Fo).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&ee(this,re,wi).call(this)}},Te=new WeakMap,te=new WeakMap,Zn=new WeakMap,Ee=new WeakMap,Ht=new WeakMap,mn=new WeakMap,xt=new WeakMap,Et=new WeakMap,er=new WeakMap,fn=new WeakMap,xn=new WeakMap,Kt=new WeakMap,Qt=new WeakMap,Pt=new WeakMap,gn=new WeakMap,re=new WeakSet,zn=function(t){ee(this,re,ki).call(this);let n=g(this,te).fetch(this.options,t);return t!=null&&t.throwOnError||(n=n.catch(Ae)),n},gi=function(){ee(this,re,vi).call(this);const t=At(this.options.staleTime,g(this,te));if(Vn.isServer()||g(this,Ee).isStale||!ui(t))return;const r=_o(g(this,Ee).dataUpdatedAt,t)+1;O(this,Kt,Ft.setTimeout(()=>{g(this,Ee).isStale||this.updateResult()},r))},bi=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(g(this,te)):this.options.refetchInterval)??!1},yi=function(t){ee(this,re,ji).call(this),O(this,Pt,t),!(Vn.isServer()||Be(this.options.enabled,g(this,te))===!1||!ui(g(this,Pt))||g(this,Pt)===0)&&O(this,Qt,Ft.setInterval(()=>{(this.options.refetchIntervalInBackground||Ui.isFocused())&&ee(this,re,zn).call(this)},g(this,Pt)))},wi=function(){ee(this,re,gi).call(this),ee(this,re,yi).call(this,ee(this,re,bi).call(this))},vi=function(){g(this,Kt)!==void 0&&(Ft.clearTimeout(g(this,Kt)),O(this,Kt,void 0))},ji=function(){g(this,Qt)!==void 0&&(Ft.clearInterval(g(this,Qt)),O(this,Qt,void 0))},ki=function(){const t=g(this,Te).getQueryCache().build(g(this,Te),this.options);if(t===g(this,te))return;const n=g(this,te);O(this,te,t),O(this,Zn,t.state),this.hasListeners()&&(n==null||n.removeObserver(this),t.addObserver(this))},Fo=function(t){je.batch(()=>{t.listeners&&this.listeners.forEach(n=>{n(g(this,Ee))}),g(this,Te).getQueryCache().notify({query:g(this,te),type:"observerResultsUpdated"})})},vo);function Dc(e,t){return Be(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&Be(t.retryOnMount,e)===!1)}function pa(e,t){return Dc(e,t)||e.state.data!==void 0&&Ni(e,t,t.refetchOnMount)}function Ni(e,t,n){if(Be(t.enabled,e)!==!1&&At(t.staleTime,e)!=="static"){const r=typeof n=="function"?n(e):n;return r==="always"||r!==!1&&Ki(e,t)}return!1}function ma(e,t,n,r){return(e!==t||Be(r.enabled,e)===!1)&&(!n.suspense||e.state.status!=="error")&&Ki(e,n)}function Ki(e,t){return Be(t.enabled,e)!==!1&&e.isStaleByTime(At(t.staleTime,e))}function Oc(e,t){return!di(e.getCurrentResult(),t)}var Fc=class extends Oo{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type="infinite",super.setOptions(e)}getOptimisticResult(e){return e._type="infinite",super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:"forward"}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:"backward"}}})}createResult(e,t){var b,w;const{state:n}=e,r=super.createResult(e,t),{isFetching:s,isRefetching:a,isError:o,isRefetchError:l}=r,c=(w=(b=n.fetchMeta)==null?void 0:b.fetchMore)==null?void 0:w.direction,u=o&&c==="forward",d=s&&c==="forward",h=o&&c==="backward",m=s&&c==="backward";return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:Ac(t,n.data),hasPreviousPage:Lc(t,n.data),isFetchNextPageError:u,isFetchingNextPage:d,isFetchPreviousPageError:h,isFetchingPreviousPage:m,isRefetchError:l&&!u&&!h,isRefetching:a&&!d&&!m}}},tr,rt,Ne,Vt,it,Nt,jo,zc=(jo=class extends Ao{constructor(t){super();U(this,it);U(this,tr);U(this,rt);U(this,Ne);U(this,Vt);O(this,tr,t.client),this.mutationId=t.mutationId,O(this,Ne,t.mutationCache),O(this,rt,[]),this.state=t.state||qc(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){g(this,rt).includes(t)||(g(this,rt).push(t),this.clearGcTimeout(),g(this,Ne).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){O(this,rt,g(this,rt).filter(n=>n!==t)),this.scheduleGc(),g(this,Ne).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){g(this,rt).length||(this.state.status==="pending"?this.scheduleGc():g(this,Ne).remove(this))}continue(){var t;return((t=g(this,Vt))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var o,l,c,u,d,h,m,p,b,w,v,y,S,C,k,z,j,q;const n=()=>{ee(this,it,Nt).call(this,{type:"continue"})},r={client:g(this,tr),meta:this.options.meta,mutationKey:this.options.mutationKey};O(this,Vt,To({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(new Error("No mutationFn found")),onFail:(D,P)=>{ee(this,it,Nt).call(this,{type:"failed",failureCount:D,error:P})},onPause:()=>{ee(this,it,Nt).call(this,{type:"pause"})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>g(this,Ne).canRun(this)}));const s=this.state.status==="pending",a=!g(this,Vt).canStart();try{if(s)n();else{ee(this,it,Nt).call(this,{type:"pending",variables:t,isPaused:a}),g(this,Ne).config.onMutate&&await g(this,Ne).config.onMutate(t,this,r);const P=await((l=(o=this.options).onMutate)==null?void 0:l.call(o,t,r));P!==this.state.context&&ee(this,it,Nt).call(this,{type:"pending",context:P,variables:t,isPaused:a})}const D=await g(this,Vt).start();return await((u=(c=g(this,Ne).config).onSuccess)==null?void 0:u.call(c,D,t,this.state.context,this,r)),await((h=(d=this.options).onSuccess)==null?void 0:h.call(d,D,t,this.state.context,r)),await((p=(m=g(this,Ne).config).onSettled)==null?void 0:p.call(m,D,null,this.state.variables,this.state.context,this,r)),await((w=(b=this.options).onSettled)==null?void 0:w.call(b,D,null,t,this.state.context,r)),ee(this,it,Nt).call(this,{type:"success",data:D}),D}catch(D){try{await((y=(v=g(this,Ne).config).onError)==null?void 0:y.call(v,D,t,this.state.context,this,r))}catch(P){Promise.reject(P)}try{await((C=(S=this.options).onError)==null?void 0:C.call(S,D,t,this.state.context,r))}catch(P){Promise.reject(P)}try{await((z=(k=g(this,Ne).config).onSettled)==null?void 0:z.call(k,void 0,D,this.state.variables,this.state.context,this,r))}catch(P){Promise.reject(P)}try{await((q=(j=this.options).onSettled)==null?void 0:q.call(j,void 0,D,t,this.state.context,r))}catch(P){Promise.reject(P)}throw ee(this,it,Nt).call(this,{type:"error",error:D}),D}finally{g(this,Ne).runNext(this)}}},tr=new WeakMap,rt=new WeakMap,Ne=new WeakMap,Vt=new WeakMap,it=new WeakSet,Nt=function(t){const n=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=n(this.state),je.batch(()=>{g(this,rt).forEach(r=>{r.onMutationUpdate(t)}),g(this,Ne).notify({mutation:this,type:"updated",action:t})})},jo);function qc(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var gt,Je,nr,ko,Bc=(ko=class extends lr{constructor(t={}){super();U(this,gt);U(this,Je);U(this,nr);this.config=t,O(this,gt,new Set),O(this,Je,new Map),O(this,nr,0)}build(t,n,r){const s=new zc({client:t,mutationCache:this,mutationId:++vr(this,nr)._,options:t.defaultMutationOptions(n),state:r});return this.add(s),s}add(t){g(this,gt).add(t);const n=kr(t);if(typeof n=="string"){const r=g(this,Je).get(n);r?r.push(t):g(this,Je).set(n,[t])}this.notify({type:"added",mutation:t})}remove(t){if(g(this,gt).delete(t)){const n=kr(t);if(typeof n=="string"){const r=g(this,Je).get(n);if(r)if(r.length>1){const s=r.indexOf(t);s!==-1&&r.splice(s,1)}else r[0]===t&&g(this,Je).delete(n)}}this.notify({type:"removed",mutation:t})}canRun(t){const n=kr(t);if(typeof n=="string"){const r=g(this,Je).get(n),s=r==null?void 0:r.find(a=>a.state.status==="pending");return!s||s===t}else return!0}runNext(t){var r;const n=kr(t);if(typeof n=="string"){const s=(r=g(this,Je).get(n))==null?void 0:r.find(a=>a!==t&&a.state.isPaused);return(s==null?void 0:s.continue())??Promise.resolve()}else return Promise.resolve()}clear(){je.batch(()=>{g(this,gt).forEach(t=>{this.notify({type:"removed",mutation:t})}),g(this,gt).clear(),g(this,Je).clear()})}getAll(){return Array.from(g(this,gt))}find(t){const n={exact:!0,...t};return this.getAll().find(r=>la(n,r))}findAll(t={}){return this.getAll().filter(n=>la(t,n))}notify(t){je.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){const t=this.getAll().filter(n=>n.state.isPaused);return je.batch(()=>Promise.all(t.map(n=>n.continue().catch(Ae))))}},gt=new WeakMap,Je=new WeakMap,nr=new WeakMap,ko);function kr(e){var t;return(t=e.options.scope)==null?void 0:t.id}var st,No,Uc=(No=class extends lr{constructor(t={}){super();U(this,st);this.config=t,O(this,st,new Map)}build(t,n,r){const s=n.queryKey,a=n.queryHash??$i(s,n);let o=this.get(a);return o||(o=new Mc({client:t,queryKey:s,queryHash:a,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(s)}),this.add(o)),o}add(t){g(this,st).has(t.queryHash)||(g(this,st).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=g(this,st).get(t.queryHash);n&&(t.destroy(),n===t&&g(this,st).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){je.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return g(this,st).get(t)}getAll(){return[...g(this,st).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>oa(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>oa(t,r)):n}notify(t){je.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){je.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){je.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},st=new WeakMap,No),ge,Rt,It,bn,yn,Tt,wn,vn,So,$c=(So=class{constructor(e={}){U(this,ge);U(this,Rt);U(this,It);U(this,bn);U(this,yn);U(this,Tt);U(this,wn);U(this,vn);O(this,ge,e.queryCache||new Uc),O(this,Rt,e.mutationCache||new Bc),O(this,It,e.defaultOptions||{}),O(this,bn,new Map),O(this,yn,new Map),O(this,Tt,0)}mount(){vr(this,Tt)._++,g(this,Tt)===1&&(O(this,wn,Ui.subscribe(async e=>{e&&(await this.resumePausedMutations(),g(this,ge).onFocus())})),O(this,vn,Ar.subscribe(async e=>{e&&(await this.resumePausedMutations(),g(this,ge).onOnline())})))}unmount(){var e,t;vr(this,Tt)._--,g(this,Tt)===0&&((e=g(this,wn))==null||e.call(this),O(this,wn,void 0),(t=g(this,vn))==null||t.call(this),O(this,vn,void 0))}isFetching(e){return g(this,ge).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return g(this,Rt).findAll({...e,status:"pending"}).length}getQueryData(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=g(this,ge).get(t.queryHash))==null?void 0:n.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),n=g(this,ge).build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(At(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return g(this,ge).findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=this.defaultQueryOptions({queryKey:e}),s=g(this,ge).get(r.queryHash),a=s==null?void 0:s.state.data,o=jc(t,a);if(o!==void 0)return g(this,ge).build(this,r).setData(o,{...n,manual:!0})}setQueriesData(e,t,n){return je.batch(()=>g(this,ge).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=g(this,ge).get(t.queryHash))==null?void 0:n.state}removeQueries(e){const t=g(this,ge);je.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=g(this,ge);return je.batch(()=>(n.findAll(e).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const n={revert:!0,...t},r=je.batch(()=>g(this,ge).findAll(e).map(s=>s.cancel(n)));return Promise.all(r).then(Ae).catch(Ae)}invalidateQueries(e,t={}){return je.batch(()=>(g(this,ge).findAll(e).forEach(n=>{n.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 n={...t,cancelRefetch:t.cancelRefetch??!0},r=je.batch(()=>g(this,ge).findAll(e).filter(s=>!s.isDisabled()&&!s.isStatic()).map(s=>{let a=s.fetch(void 0,n);return n.throwOnError||(a=a.catch(Ae)),s.state.fetchStatus==="paused"?Promise.resolve():a}));return Promise.all(r).then(Ae)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const n=g(this,ge).build(this,t);return n.isStaleByTime(At(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Ae).catch(Ae)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Ae).catch(Ae)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Ar.isOnline()?g(this,Rt).resumePausedMutations():Promise.resolve()}getQueryCache(){return g(this,ge)}getMutationCache(){return g(this,Rt)}getDefaultOptions(){return g(this,It)}setDefaultOptions(e){O(this,It,e)}setQueryDefaults(e,t){g(this,bn).set(Kn(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...g(this,bn).values()],n={};return t.forEach(r=>{Qn(e,r.queryKey)&&Object.assign(n,r.defaultOptions)}),n}setMutationDefaults(e,t){g(this,yn).set(Kn(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...g(this,yn).values()],n={};return t.forEach(r=>{Qn(e,r.mutationKey)&&Object.assign(n,r.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;const t={...g(this,It).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=$i(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===Hi&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...g(this,It).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){g(this,ge).clear(),g(this,Rt).clear()}},ge=new WeakMap,Rt=new WeakMap,It=new WeakMap,bn=new WeakMap,yn=new WeakMap,Tt=new WeakMap,wn=new WeakMap,vn=new WeakMap,So),zo=ke.createContext(void 0),qo=e=>{const t=ke.useContext(zo);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},Hc=({client:e,children:t})=>(ke.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),i.jsx(zo.Provider,{value:e,children:t})),Bo=ke.createContext(!1),Kc=()=>ke.useContext(Bo);Bo.Provider;function Qc(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var Vc=ke.createContext(Qc()),Wc=()=>ke.useContext(Vc),Gc=(e,t,n)=>{const r=n!=null&&n.state.error&&typeof e.throwOnError=="function"?Ro(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},Jc=e=>{ke.useEffect(()=>{e.clearReset()},[e])},Xc=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:s})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(s&&e.data===void 0||Ro(n,[e.error,r])),Yc=e=>{if(e.suspense){const n=s=>s==="static"?s:Math.max(s??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...s)=>n(r(...s)):n(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Zc=(e,t)=>e.isLoading&&e.isFetching&&!t,eu=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,fa=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function Uo(e,t,n){var m,p,b,w;const r=Kc(),s=Wc(),a=qo(),o=a.defaultQueryOptions(e);(p=(m=a.getDefaultOptions().queries)==null?void 0:m._experimental_beforeQuery)==null||p.call(m,o);const l=a.getQueryCache().get(o.queryHash);o._optimisticResults=r?"isRestoring":"optimistic",Yc(o),Gc(o,s,l),Jc(s);const c=!a.getQueryCache().get(o.queryHash),[u]=ke.useState(()=>new t(a,o)),d=u.getOptimisticResult(o),h=!r&&e.subscribed!==!1;if(ke.useSyncExternalStore(ke.useCallback(v=>{const y=h?u.subscribe(je.batchCalls(v)):Ae;return u.updateResult(),y},[u,h]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),ke.useEffect(()=>{u.setOptions(o)},[o,u]),eu(o,d))throw fa(o,u,s);if(Xc({result:d,errorResetBoundary:s,throwOnError:o.throwOnError,query:l,suspense:o.suspense}))throw d.error;if((w=(b=a.getDefaultOptions().queries)==null?void 0:b._experimental_afterQuery)==null||w.call(b,o,d),o.experimental_prefetchInRender&&!Vn.isServer()&&Zc(d,r)){const v=c?fa(o,u,s):l==null?void 0:l.promise;v==null||v.catch(Ae).finally(()=>{u.updateResult()})}return o.notifyOnChangeProps?d:u.trackResult(d)}function xe(e,t){return Uo(e,Oo)}function xa(e,t){return Uo(e,Fc)}/** + * @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 tu=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),$o=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).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 nu={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 ru=ke.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:s="",children:a,iconNode:o,...l},c)=>ke.createElement("svg",{ref:c,...nu,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:$o("lucide",s),...l},[...o.map(([u,d])=>ke.createElement(u,d)),...Array.isArray(a)?a:[a]]));/** + * @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 ue=(e,t)=>{const n=ke.forwardRef(({className:r,...s},a)=>ke.createElement(ru,{ref:a,iconNode:t,className:$o(`lucide-${tu(e)}`,r),...s}));return n.displayName=`${e}`,n};/** + * @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 Jt=ue("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 Qi=ue("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 Ho=ue("Bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]);/** + * @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 Vi=ue("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** + * @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 jn=ue("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 kn=ue("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 Wn=ue("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 Ko=ue("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 ga=ue("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 Xt=ue("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 Qo=ue("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @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 iu=ue("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 su=ue("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** + * @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 Lr=ue("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);/** + * @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 Nn=ue("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 au=ue("Pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/** + * @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 cr=ue("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 Gn=ue("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** + * @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 ou=ue("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/** + * @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 lu=ue("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 Vo=ue("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 Wo=ue("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 cu=ue("TimerReset",[["path",{d:"M10 2h4",key:"n1abiw"}],["path",{d:"M12 14v-4",key:"1evpnu"}],["path",{d:"M4 13a8 8 0 0 1 8-7 8 8 0 1 1-5.3 14L4 17.6",key:"1ts96g"}],["path",{d:"M9 17H4v5",key:"8t5av"}]]);/** + * @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 Si=ue("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @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=ue("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 uu=ue("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** + * @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 Yt=ue("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function du(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const hu=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,pu=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,mu={};function ba(e,t){return(mu.jsx?pu:hu).test(e)}const fu=/[ \t\n\f\r]/g;function xu(e){return typeof e=="object"?e.type==="text"?ya(e.value):!1:ya(e)}function ya(e){return e.replace(fu,"")===""}class ur{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}ur.prototype.normal={};ur.prototype.property={};ur.prototype.space=void 0;function Go(e,t){const n={},r={};for(const s of e)Object.assign(n,s.property),Object.assign(r,s.normal);return new ur(n,r,t)}function Ci(e){return e.toLowerCase()}class Me{constructor(t,n){this.attribute=n,this.property=t}}Me.prototype.attribute="";Me.prototype.booleanish=!1;Me.prototype.boolean=!1;Me.prototype.commaOrSpaceSeparated=!1;Me.prototype.commaSeparated=!1;Me.prototype.defined=!1;Me.prototype.mustUseProperty=!1;Me.prototype.number=!1;Me.prototype.overloadedBoolean=!1;Me.prototype.property="";Me.prototype.spaceSeparated=!1;Me.prototype.space=void 0;let gu=0;const Q=Zt(),ye=Zt(),_i=Zt(),I=Zt(),le=Zt(),Gt=Zt(),ze=Zt();function Zt(){return 2**++gu}const Ei=Object.freeze(Object.defineProperty({__proto__:null,boolean:Q,booleanish:ye,commaOrSpaceSeparated:ze,commaSeparated:Gt,number:I,overloadedBoolean:_i,spaceSeparated:le},Symbol.toStringTag,{value:"Module"})),Vr=Object.keys(Ei);class Wi extends Me{constructor(t,n,r,s){let a=-1;if(super(t,n),wa(this,"space",s),typeof r=="number")for(;++a4&&n.slice(0,4)==="data"&&ju.test(t)){if(t.charAt(4)==="-"){const a=t.slice(5).replace(va,Su);r="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=t.slice(4);if(!va.test(a)){let o=a.replace(vu,Nu);o.charAt(0)!=="-"&&(o="-"+o),t="data"+o}}s=Wi}return new s(r,t)}function Nu(e){return"-"+e.toLowerCase()}function Su(e){return e.charAt(1).toUpperCase()}const Cu=Go([Jo,bu,Zo,el,tl],"html"),Gi=Go([Jo,yu,Zo,el,tl],"svg");function _u(e){return e.join(" ").trim()}var rn={},Wr,ja;function Eu(){if(ja)return Wr;ja=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,s=/^:\s*/,a=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,o=/^[;\s]*/,l=/^\s+|\s+$/g,c=` +`,u="/",d="*",h="",m="comment",p="declaration";function b(v,y){if(typeof v!="string")throw new TypeError("First argument must be a string");if(!v)return[];y=y||{};var S=1,C=1;function k(F){var E=F.match(t);E&&(S+=E.length);var $=F.lastIndexOf(c);C=~$?F.length-$:C+F.length}function z(){var F={line:S,column:C};return function(E){return E.position=new j(F),P(),E}}function j(F){this.start=F,this.end={line:S,column:C},this.source=y.source}j.prototype.content=v;function q(F){var E=new Error(y.source+":"+S+":"+C+": "+F);if(E.reason=F,E.filename=y.source,E.line=S,E.column=C,E.source=v,!y.silent)throw E}function D(F){var E=F.exec(v);if(E){var $=E[0];return k($),v=v.slice($.length),E}}function P(){D(n)}function _(F){var E;for(F=F||[];E=L();)E!==!1&&F.push(E);return F}function L(){var F=z();if(!(u!=v.charAt(0)||d!=v.charAt(1))){for(var E=2;h!=v.charAt(E)&&(d!=v.charAt(E)||u!=v.charAt(E+1));)++E;if(E+=2,h===v.charAt(E-1))return q("End of comment missing");var $=v.slice(2,E-2);return C+=2,k($),v=v.slice(E),C+=2,F({type:m,comment:$})}}function R(){var F=z(),E=D(r);if(E){if(L(),!D(s))return q("property missing ':'");var $=D(a),B=F({type:p,property:w(E[0].replace(e,h)),value:$?w($[0].replace(e,h)):h});return D(o),B}}function X(){var F=[];_(F);for(var E;E=R();)E!==!1&&(F.push(E),_(F));return F}return P(),X()}function w(v){return v?v.replace(l,h):h}return Wr=b,Wr}var ka;function Pu(){if(ka)return rn;ka=1;var e=rn&&rn.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(rn,"__esModule",{value:!0}),rn.default=n;const t=e(Eu());function n(r,s){let a=null;if(!r||typeof r!="string")return a;const o=(0,t.default)(r),l=typeof s=="function";return o.forEach(c=>{if(c.type!=="declaration")return;const{property:u,value:d}=c;l?s(u,d,c):d&&(a=a||{},a[u]=d)}),a}return rn}var Tn={},Na;function Ru(){if(Na)return Tn;Na=1,Object.defineProperty(Tn,"__esModule",{value:!0}),Tn.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,s=/^-(ms)-/,a=function(u){return!u||n.test(u)||e.test(u)},o=function(u,d){return d.toUpperCase()},l=function(u,d){return"".concat(d,"-")},c=function(u,d){return d===void 0&&(d={}),a(u)?u:(u=u.toLowerCase(),d.reactCompat?u=u.replace(s,l):u=u.replace(r,l),u.replace(t,o))};return Tn.camelCase=c,Tn}var An,Sa;function Iu(){if(Sa)return An;Sa=1;var e=An&&An.__importDefault||function(s){return s&&s.__esModule?s:{default:s}},t=e(Pu()),n=Ru();function r(s,a){var o={};return!s||typeof s!="string"||(0,t.default)(s,function(l,c){l&&c&&(o[(0,n.camelCase)(l,a)]=c)}),o}return r.default=r,An=r,An}var Tu=Iu();const Au=Bi(Tu),nl=rl("end"),Ji=rl("start");function rl(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function Lu(e){const t=Ji(e),n=nl(e);if(t&&n)return{start:t,end:n}}function Bn(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?Ca(e.position):"start"in e||"end"in e?Ca(e):"line"in e||"column"in e?Pi(e):""}function Pi(e){return _a(e&&e.line)+":"+_a(e&&e.column)}function Ca(e){return Pi(e&&e.start)+"-"+Pi(e&&e.end)}function _a(e){return e&&typeof e=="number"?e:1}class Ce extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let s="",a={},o=!1;if(n&&("line"in n&&"column"in n?a={place:n}:"start"in n&&"end"in n?a={place:n}:"type"in n?a={ancestors:[n],place:n.position}:a={...n}),typeof t=="string"?s=t:!a.cause&&t&&(o=!0,s=t.message,a.cause=t),!a.ruleId&&!a.source&&typeof r=="string"){const c=r.indexOf(":");c===-1?a.ruleId=r:(a.source=r.slice(0,c),a.ruleId=r.slice(c+1))}if(!a.place&&a.ancestors&&a.ancestors){const c=a.ancestors[a.ancestors.length-1];c&&(a.place=c.position)}const l=a.place&&"start"in a.place?a.place.start:a.place;this.ancestors=a.ancestors||void 0,this.cause=a.cause||void 0,this.column=l?l.column:void 0,this.fatal=void 0,this.file="",this.message=s,this.line=l?l.line:void 0,this.name=Bn(a.place)||"1:1",this.place=a.place||void 0,this.reason=this.message,this.ruleId=a.ruleId||void 0,this.source=a.source||void 0,this.stack=o&&a.cause&&typeof a.cause.stack=="string"?a.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}Ce.prototype.file="";Ce.prototype.name="";Ce.prototype.reason="";Ce.prototype.message="";Ce.prototype.stack="";Ce.prototype.column=void 0;Ce.prototype.line=void 0;Ce.prototype.ancestors=void 0;Ce.prototype.cause=void 0;Ce.prototype.fatal=void 0;Ce.prototype.place=void 0;Ce.prototype.ruleId=void 0;Ce.prototype.source=void 0;const Xi={}.hasOwnProperty,Mu=new Map,Du=/[A-Z]/g,Ou=new Set(["table","tbody","thead","tfoot","tr"]),Fu=new Set(["td","th"]),il="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function zu(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Vu(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=Qu(n,t.jsx,t.jsxs)}const s={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Gi:Cu,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},a=sl(s,e,void 0);return a&&typeof a!="string"?a:s.create(e,s.Fragment,{children:a||void 0},void 0)}function sl(e,t,n){if(t.type==="element")return qu(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return Bu(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return $u(e,t,n);if(t.type==="mdxjsEsm")return Uu(e,t);if(t.type==="root")return Hu(e,t,n);if(t.type==="text")return Ku(e,t)}function qu(e,t,n){const r=e.schema;let s=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(s=Gi,e.schema=s),e.ancestors.push(t);const a=ol(e,t.tagName,!1),o=Wu(e,t);let l=Zi(e,t);return Ou.has(t.tagName)&&(l=l.filter(function(c){return typeof c=="string"?!xu(c):!0})),al(e,o,a,t),Yi(o,l),e.ancestors.pop(),e.schema=r,e.create(t,a,o,n)}function Bu(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}Jn(e,t.position)}function Uu(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Jn(e,t.position)}function $u(e,t,n){const r=e.schema;let s=r;t.name==="svg"&&r.space==="html"&&(s=Gi,e.schema=s),e.ancestors.push(t);const a=t.name===null?e.Fragment:ol(e,t.name,!0),o=Gu(e,t),l=Zi(e,t);return al(e,o,a,t),Yi(o,l),e.ancestors.pop(),e.schema=r,e.create(t,a,o,n)}function Hu(e,t,n){const r={};return Yi(r,Zi(e,t)),e.create(t,e.Fragment,r,n)}function Ku(e,t){return t.value}function al(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function Yi(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function Qu(e,t,n){return r;function r(s,a,o,l){const u=Array.isArray(o.children)?n:t;return l?u(a,o,l):u(a,o)}}function Vu(e,t){return n;function n(r,s,a,o){const l=Array.isArray(a.children),c=Ji(r);return t(s,a,o,l,{columnNumber:c?c.column-1:void 0,fileName:e,lineNumber:c?c.line:void 0},void 0)}}function Wu(e,t){const n={};let r,s;for(s in t.properties)if(s!=="children"&&Xi.call(t.properties,s)){const a=Ju(e,s,t.properties[s]);if(a){const[o,l]=a;e.tableCellAlignToStyle&&o==="align"&&typeof l=="string"&&Fu.has(t.tagName)?r=l:n[o]=l}}if(r){const a=n.style||(n.style={});a[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function Gu(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const a=r.data.estree.body[0];a.type;const o=a.expression;o.type;const l=o.properties[0];l.type,Object.assign(n,e.evaluater.evaluateExpression(l.argument))}else Jn(e,t.position);else{const s=r.name;let a;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const l=r.value.data.estree.body[0];l.type,a=e.evaluater.evaluateExpression(l.expression)}else Jn(e,t.position);else a=r.value===null?!0:r.value;n[s]=a}return n}function Zi(e,t){const n=[];let r=-1;const s=e.passKeys?new Map:Mu;for(;++rs?0:s+t:t=t>s?s:t,n=n>0?n:0,r.length<1e4)o=Array.from(r),o.unshift(t,n),e.splice(...o);else for(n&&e.splice(t,n);a0?(ot(e,e.length,0,t),e):t}const Ra={}.hasOwnProperty;function id(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function on(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const at=Lt(/[A-Za-z]/),Ue=Lt(/[\dA-Za-z]/),od=Lt(/[#-'*+\--9=?A-Z^-~]/);function Ri(e){return e!==null&&(e<32||e===127)}const Ii=Lt(/\d/),ld=Lt(/[\dA-Fa-f]/),cd=Lt(/[!-/:-@[-`{-~]/);function H(e){return e!==null&&e<-2}function Le(e){return e!==null&&(e<0||e===32)}function ne(e){return e===-2||e===-1||e===32}const ud=Lt(new RegExp("\\p{P}|\\p{S}","u")),dd=Lt(/\s/);function Lt(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function Cn(e){const t=[];let n=-1,r=0,s=0;for(;++n55295&&a<57344){const l=e.charCodeAt(n+1);a<56320&&l>56319&&l<57344?(o=String.fromCharCode(a,l),s=1):o="�"}else o=String.fromCharCode(a);o&&(t.push(e.slice(r,n),encodeURIComponent(o)),r=n+s+1,o=""),s&&(n+=s,s=0)}return t.join("")+e.slice(r)}function he(e,t,n,r){const s=r?r-1:Number.POSITIVE_INFINITY;let a=0;return o;function o(c){return ne(c)?(e.enter(n),l(c)):t(c)}function l(c){return ne(c)&&a++o))return;const q=t.events.length;let D=q,P,_;for(;D--;)if(t.events[D][0]==="exit"&&t.events[D][1].type==="chunkFlow"){if(P){_=t.events[D][1].end;break}P=!0}for(y(r),j=q;jC;){const z=n[k];t.containerState=z[1],z[0].exit.call(t,e)}n.length=C}function S(){s.write([null]),a=void 0,s=void 0,t.containerState._closeFlow=void 0}}function xd(e,t,n){return he(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Ta(e){if(e===null||Le(e)||dd(e))return 1;if(ud(e))return 2}function ts(e,t,n){const r=[];let s=-1;for(;++s1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const h={...e[r][1].end},m={...e[n][1].start};Aa(h,-c),Aa(m,c),o={type:c>1?"strongSequence":"emphasisSequence",start:h,end:{...e[r][1].end}},l={type:c>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:m},a={type:c>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},s={type:c>1?"strong":"emphasis",start:{...o.start},end:{...l.end}},e[r][1].end={...o.start},e[n][1].start={...l.end},u=[],e[r][1].end.offset-e[r][1].start.offset&&(u=He(u,[["enter",e[r][1],t],["exit",e[r][1],t]])),u=He(u,[["enter",s,t],["enter",o,t],["exit",o,t],["enter",a,t]]),u=He(u,ts(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),u=He(u,[["exit",a,t],["enter",l,t],["exit",l,t],["exit",s,t]]),e[n][1].end.offset-e[n][1].start.offset?(d=2,u=He(u,[["enter",e[n][1],t],["exit",e[n][1],t]])):d=0,ot(e,r-1,n-r+3,u),n=r+u.length-d-2;break}}for(n=-1;++n0&&ne(j)?he(e,S,"linePrefix",a+1)(j):S(j)}function S(j){return j===null||H(j)?e.check(La,w,k)(j):(e.enter("codeFlowValue"),C(j))}function C(j){return j===null||H(j)?(e.exit("codeFlowValue"),S(j)):(e.consume(j),C)}function k(j){return e.exit("codeFenced"),t(j)}function z(j,q,D){let P=0;return _;function _(E){return j.enter("lineEnding"),j.consume(E),j.exit("lineEnding"),L}function L(E){return j.enter("codeFencedFence"),ne(E)?he(j,R,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(E):R(E)}function R(E){return E===l?(j.enter("codeFencedFenceSequence"),X(E)):D(E)}function X(E){return E===l?(P++,j.consume(E),X):P>=o?(j.exit("codeFencedFenceSequence"),ne(E)?he(j,F,"whitespace")(E):F(E)):D(E)}function F(E){return E===null||H(E)?(j.exit("codeFencedFence"),q(E)):D(E)}}}function Ed(e,t,n){const r=this;return s;function s(o){return o===null?n(o):(e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),a)}function a(o){return r.parser.lazy[r.now().line]?n(o):t(o)}}const Jr={name:"codeIndented",tokenize:Rd},Pd={partial:!0,tokenize:Id};function Rd(e,t,n){const r=this;return s;function s(u){return e.enter("codeIndented"),he(e,a,"linePrefix",5)(u)}function a(u){const d=r.events[r.events.length-1];return d&&d[1].type==="linePrefix"&&d[2].sliceSerialize(d[1],!0).length>=4?o(u):n(u)}function o(u){return u===null?c(u):H(u)?e.attempt(Pd,o,c)(u):(e.enter("codeFlowValue"),l(u))}function l(u){return u===null||H(u)?(e.exit("codeFlowValue"),o(u)):(e.consume(u),l)}function c(u){return e.exit("codeIndented"),t(u)}}function Id(e,t,n){const r=this;return s;function s(o){return r.parser.lazy[r.now().line]?n(o):H(o)?(e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),s):he(e,a,"linePrefix",5)(o)}function a(o){const l=r.events[r.events.length-1];return l&&l[1].type==="linePrefix"&&l[2].sliceSerialize(l[1],!0).length>=4?t(o):H(o)?s(o):n(o)}}const Td={name:"codeText",previous:Ld,resolve:Ad,tokenize:Md};function Ad(e){let t=e.length-4,n=3,r,s;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const s=n||0;this.setCursor(Math.trunc(t));const a=this.right.splice(this.right.length-s,Number.POSITIVE_INFINITY);return r&&Ln(this.left,r),a.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),Ln(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),Ln(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(o):e.interrupt(r.parser.constructs.flow,n,t)(o)}}function ml(e,t,n,r,s,a,o,l,c){const u=c||Number.POSITIVE_INFINITY;let d=0;return h;function h(y){return y===60?(e.enter(r),e.enter(s),e.enter(a),e.consume(y),e.exit(a),m):y===null||y===32||y===41||Ri(y)?n(y):(e.enter(r),e.enter(o),e.enter(l),e.enter("chunkString",{contentType:"string"}),w(y))}function m(y){return y===62?(e.enter(a),e.consume(y),e.exit(a),e.exit(s),e.exit(r),t):(e.enter(l),e.enter("chunkString",{contentType:"string"}),p(y))}function p(y){return y===62?(e.exit("chunkString"),e.exit(l),m(y)):y===null||y===60||H(y)?n(y):(e.consume(y),y===92?b:p)}function b(y){return y===60||y===62||y===92?(e.consume(y),p):p(y)}function w(y){return!d&&(y===null||y===41||Le(y))?(e.exit("chunkString"),e.exit(l),e.exit(o),e.exit(r),t(y)):d999||p===null||p===91||p===93&&!c||p===94&&!l&&"_hiddenFootnoteSupport"in o.parser.constructs?n(p):p===93?(e.exit(a),e.enter(s),e.consume(p),e.exit(s),e.exit(r),t):H(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),d):(e.enter("chunkString",{contentType:"string"}),h(p))}function h(p){return p===null||p===91||p===93||H(p)||l++>999?(e.exit("chunkString"),d(p)):(e.consume(p),c||(c=!ne(p)),p===92?m:h)}function m(p){return p===91||p===92||p===93?(e.consume(p),l++,h):h(p)}}function xl(e,t,n,r,s,a){let o;return l;function l(m){return m===34||m===39||m===40?(e.enter(r),e.enter(s),e.consume(m),e.exit(s),o=m===40?41:m,c):n(m)}function c(m){return m===o?(e.enter(s),e.consume(m),e.exit(s),e.exit(r),t):(e.enter(a),u(m))}function u(m){return m===o?(e.exit(a),c(o)):m===null?n(m):H(m)?(e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),he(e,u,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),d(m))}function d(m){return m===o||m===null||H(m)?(e.exit("chunkString"),u(m)):(e.consume(m),m===92?h:d)}function h(m){return m===o||m===92?(e.consume(m),d):d(m)}}function Un(e,t){let n;return r;function r(s){return H(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),n=!0,r):ne(s)?he(e,r,n?"linePrefix":"lineSuffix")(s):t(s)}}const $d={name:"definition",tokenize:Kd},Hd={partial:!0,tokenize:Qd};function Kd(e,t,n){const r=this;let s;return a;function a(p){return e.enter("definition"),o(p)}function o(p){return fl.call(r,e,l,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(p)}function l(p){return s=on(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),p===58?(e.enter("definitionMarker"),e.consume(p),e.exit("definitionMarker"),c):n(p)}function c(p){return Le(p)?Un(e,u)(p):u(p)}function u(p){return ml(e,d,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(p)}function d(p){return e.attempt(Hd,h,h)(p)}function h(p){return ne(p)?he(e,m,"whitespace")(p):m(p)}function m(p){return p===null||H(p)?(e.exit("definition"),r.parser.defined.push(s),t(p)):n(p)}}function Qd(e,t,n){return r;function r(l){return Le(l)?Un(e,s)(l):n(l)}function s(l){return xl(e,a,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(l)}function a(l){return ne(l)?he(e,o,"whitespace")(l):o(l)}function o(l){return l===null||H(l)?t(l):n(l)}}const Vd={name:"hardBreakEscape",tokenize:Wd};function Wd(e,t,n){return r;function r(a){return e.enter("hardBreakEscape"),e.consume(a),s}function s(a){return H(a)?(e.exit("hardBreakEscape"),t(a)):n(a)}}const Gd={name:"headingAtx",resolve:Jd,tokenize:Xd};function Jd(e,t){let n=e.length-2,r=3,s,a;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(s={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},a={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},ot(e,r,n-r+1,[["enter",s,t],["enter",a,t],["exit",a,t],["exit",s,t]])),e}function Xd(e,t,n){let r=0;return s;function s(d){return e.enter("atxHeading"),a(d)}function a(d){return e.enter("atxHeadingSequence"),o(d)}function o(d){return d===35&&r++<6?(e.consume(d),o):d===null||Le(d)?(e.exit("atxHeadingSequence"),l(d)):n(d)}function l(d){return d===35?(e.enter("atxHeadingSequence"),c(d)):d===null||H(d)?(e.exit("atxHeading"),t(d)):ne(d)?he(e,l,"whitespace")(d):(e.enter("atxHeadingText"),u(d))}function c(d){return d===35?(e.consume(d),c):(e.exit("atxHeadingSequence"),l(d))}function u(d){return d===null||d===35||Le(d)?(e.exit("atxHeadingText"),l(d)):(e.consume(d),u)}}const Yd=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Da=["pre","script","style","textarea"],Zd={concrete:!0,name:"htmlFlow",resolveTo:nh,tokenize:rh},eh={partial:!0,tokenize:sh},th={partial:!0,tokenize:ih};function nh(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function rh(e,t,n){const r=this;let s,a,o,l,c;return u;function u(x){return d(x)}function d(x){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(x),h}function h(x){return x===33?(e.consume(x),m):x===47?(e.consume(x),a=!0,w):x===63?(e.consume(x),s=3,r.interrupt?t:f):at(x)?(e.consume(x),o=String.fromCharCode(x),v):n(x)}function m(x){return x===45?(e.consume(x),s=2,p):x===91?(e.consume(x),s=5,l=0,b):at(x)?(e.consume(x),s=4,r.interrupt?t:f):n(x)}function p(x){return x===45?(e.consume(x),r.interrupt?t:f):n(x)}function b(x){const De="CDATA[";return x===De.charCodeAt(l++)?(e.consume(x),l===De.length?r.interrupt?t:R:b):n(x)}function w(x){return at(x)?(e.consume(x),o=String.fromCharCode(x),v):n(x)}function v(x){if(x===null||x===47||x===62||Le(x)){const De=x===47,lt=o.toLowerCase();return!De&&!a&&Da.includes(lt)?(s=1,r.interrupt?t(x):R(x)):Yd.includes(o.toLowerCase())?(s=6,De?(e.consume(x),y):r.interrupt?t(x):R(x)):(s=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(x):a?S(x):C(x))}return x===45||Ue(x)?(e.consume(x),o+=String.fromCharCode(x),v):n(x)}function y(x){return x===62?(e.consume(x),r.interrupt?t:R):n(x)}function S(x){return ne(x)?(e.consume(x),S):_(x)}function C(x){return x===47?(e.consume(x),_):x===58||x===95||at(x)?(e.consume(x),k):ne(x)?(e.consume(x),C):_(x)}function k(x){return x===45||x===46||x===58||x===95||Ue(x)?(e.consume(x),k):z(x)}function z(x){return x===61?(e.consume(x),j):ne(x)?(e.consume(x),z):C(x)}function j(x){return x===null||x===60||x===61||x===62||x===96?n(x):x===34||x===39?(e.consume(x),c=x,q):ne(x)?(e.consume(x),j):D(x)}function q(x){return x===c?(e.consume(x),c=null,P):x===null||H(x)?n(x):(e.consume(x),q)}function D(x){return x===null||x===34||x===39||x===47||x===60||x===61||x===62||x===96||Le(x)?z(x):(e.consume(x),D)}function P(x){return x===47||x===62||ne(x)?C(x):n(x)}function _(x){return x===62?(e.consume(x),L):n(x)}function L(x){return x===null||H(x)?R(x):ne(x)?(e.consume(x),L):n(x)}function R(x){return x===45&&s===2?(e.consume(x),$):x===60&&s===1?(e.consume(x),B):x===62&&s===4?(e.consume(x),ie):x===63&&s===3?(e.consume(x),f):x===93&&s===5?(e.consume(x),me):H(x)&&(s===6||s===7)?(e.exit("htmlFlowData"),e.check(eh,Re,X)(x)):x===null||H(x)?(e.exit("htmlFlowData"),X(x)):(e.consume(x),R)}function X(x){return e.check(th,F,Re)(x)}function F(x){return e.enter("lineEnding"),e.consume(x),e.exit("lineEnding"),E}function E(x){return x===null||H(x)?X(x):(e.enter("htmlFlowData"),R(x))}function $(x){return x===45?(e.consume(x),f):R(x)}function B(x){return x===47?(e.consume(x),o="",de):R(x)}function de(x){if(x===62){const De=o.toLowerCase();return Da.includes(De)?(e.consume(x),ie):R(x)}return at(x)&&o.length<8?(e.consume(x),o+=String.fromCharCode(x),de):R(x)}function me(x){return x===93?(e.consume(x),f):R(x)}function f(x){return x===62?(e.consume(x),ie):x===45&&s===2?(e.consume(x),f):R(x)}function ie(x){return x===null||H(x)?(e.exit("htmlFlowData"),Re(x)):(e.consume(x),ie)}function Re(x){return e.exit("htmlFlow"),t(x)}}function ih(e,t,n){const r=this;return s;function s(o){return H(o)?(e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),a):n(o)}function a(o){return r.parser.lazy[r.now().line]?n(o):t(o)}}function sh(e,t,n){return r;function r(s){return e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),e.attempt(Ur,t,n)}}const ah={name:"htmlText",tokenize:oh};function oh(e,t,n){const r=this;let s,a,o;return l;function l(f){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(f),c}function c(f){return f===33?(e.consume(f),u):f===47?(e.consume(f),z):f===63?(e.consume(f),C):at(f)?(e.consume(f),D):n(f)}function u(f){return f===45?(e.consume(f),d):f===91?(e.consume(f),a=0,b):at(f)?(e.consume(f),S):n(f)}function d(f){return f===45?(e.consume(f),p):n(f)}function h(f){return f===null?n(f):f===45?(e.consume(f),m):H(f)?(o=h,B(f)):(e.consume(f),h)}function m(f){return f===45?(e.consume(f),p):h(f)}function p(f){return f===62?$(f):f===45?m(f):h(f)}function b(f){const ie="CDATA[";return f===ie.charCodeAt(a++)?(e.consume(f),a===ie.length?w:b):n(f)}function w(f){return f===null?n(f):f===93?(e.consume(f),v):H(f)?(o=w,B(f)):(e.consume(f),w)}function v(f){return f===93?(e.consume(f),y):w(f)}function y(f){return f===62?$(f):f===93?(e.consume(f),y):w(f)}function S(f){return f===null||f===62?$(f):H(f)?(o=S,B(f)):(e.consume(f),S)}function C(f){return f===null?n(f):f===63?(e.consume(f),k):H(f)?(o=C,B(f)):(e.consume(f),C)}function k(f){return f===62?$(f):C(f)}function z(f){return at(f)?(e.consume(f),j):n(f)}function j(f){return f===45||Ue(f)?(e.consume(f),j):q(f)}function q(f){return H(f)?(o=q,B(f)):ne(f)?(e.consume(f),q):$(f)}function D(f){return f===45||Ue(f)?(e.consume(f),D):f===47||f===62||Le(f)?P(f):n(f)}function P(f){return f===47?(e.consume(f),$):f===58||f===95||at(f)?(e.consume(f),_):H(f)?(o=P,B(f)):ne(f)?(e.consume(f),P):$(f)}function _(f){return f===45||f===46||f===58||f===95||Ue(f)?(e.consume(f),_):L(f)}function L(f){return f===61?(e.consume(f),R):H(f)?(o=L,B(f)):ne(f)?(e.consume(f),L):P(f)}function R(f){return f===null||f===60||f===61||f===62||f===96?n(f):f===34||f===39?(e.consume(f),s=f,X):H(f)?(o=R,B(f)):ne(f)?(e.consume(f),R):(e.consume(f),F)}function X(f){return f===s?(e.consume(f),s=void 0,E):f===null?n(f):H(f)?(o=X,B(f)):(e.consume(f),X)}function F(f){return f===null||f===34||f===39||f===60||f===61||f===96?n(f):f===47||f===62||Le(f)?P(f):(e.consume(f),F)}function E(f){return f===47||f===62||Le(f)?P(f):n(f)}function $(f){return f===62?(e.consume(f),e.exit("htmlTextData"),e.exit("htmlText"),t):n(f)}function B(f){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(f),e.exit("lineEnding"),de}function de(f){return ne(f)?he(e,me,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(f):me(f)}function me(f){return e.enter("htmlTextData"),o(f)}}const ns={name:"labelEnd",resolveAll:dh,resolveTo:hh,tokenize:ph},lh={tokenize:mh},ch={tokenize:fh},uh={tokenize:xh};function dh(e){let t=-1;const n=[];for(;++t=3&&(u===null||H(u))?(e.exit("thematicBreak"),t(u)):n(u)}function c(u){return u===s?(e.consume(u),r++,c):(e.exit("thematicBreakSequence"),ne(u)?he(e,l,"whitespace")(u):l(u))}}const Ie={continuation:{tokenize:Ch},exit:Eh,name:"list",tokenize:Sh},kh={partial:!0,tokenize:Ph},Nh={partial:!0,tokenize:_h};function Sh(e,t,n){const r=this,s=r.events[r.events.length-1];let a=s&&s[1].type==="linePrefix"?s[2].sliceSerialize(s[1],!0).length:0,o=0;return l;function l(p){const b=r.containerState.type||(p===42||p===43||p===45?"listUnordered":"listOrdered");if(b==="listUnordered"?!r.containerState.marker||p===r.containerState.marker:Ii(p)){if(r.containerState.type||(r.containerState.type=b,e.enter(b,{_container:!0})),b==="listUnordered")return e.enter("listItemPrefix"),p===42||p===45?e.check(Ir,n,u)(p):u(p);if(!r.interrupt||p===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),c(p)}return n(p)}function c(p){return Ii(p)&&++o<10?(e.consume(p),c):(!r.interrupt||o<2)&&(r.containerState.marker?p===r.containerState.marker:p===41||p===46)?(e.exit("listItemValue"),u(p)):n(p)}function u(p){return e.enter("listItemMarker"),e.consume(p),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||p,e.check(Ur,r.interrupt?n:d,e.attempt(kh,m,h))}function d(p){return r.containerState.initialBlankLine=!0,a++,m(p)}function h(p){return ne(p)?(e.enter("listItemPrefixWhitespace"),e.consume(p),e.exit("listItemPrefixWhitespace"),m):n(p)}function m(p){return r.containerState.size=a+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(p)}}function Ch(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Ur,s,a);function s(l){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,he(e,t,"listItemIndent",r.containerState.size+1)(l)}function a(l){return r.containerState.furtherBlankLines||!ne(l)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,o(l)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Nh,t,o)(l))}function o(l){return r.containerState._closeFlow=!0,r.interrupt=void 0,he(e,e.attempt(Ie,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(l)}}function _h(e,t,n){const r=this;return he(e,s,"listItemIndent",r.containerState.size+1);function s(a){const o=r.events[r.events.length-1];return o&&o[1].type==="listItemIndent"&&o[2].sliceSerialize(o[1],!0).length===r.containerState.size?t(a):n(a)}}function Eh(e){e.exit(this.containerState.type)}function Ph(e,t,n){const r=this;return he(e,s,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function s(a){const o=r.events[r.events.length-1];return!ne(a)&&o&&o[1].type==="listItemPrefixWhitespace"?t(a):n(a)}}const Oa={name:"setextUnderline",resolveTo:Rh,tokenize:Ih};function Rh(e,t){let n=e.length,r,s,a;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(s=n)}else e[n][1].type==="content"&&e.splice(n,1),!a&&e[n][1].type==="definition"&&(a=n);const o={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[s][1].type="setextHeadingText",a?(e.splice(s,0,["enter",o,t]),e.splice(a+1,0,["exit",e[r][1],t]),e[r][1].end={...e[a][1].end}):e[r][1]=o,e.push(["exit",o,t]),e}function Ih(e,t,n){const r=this;let s;return a;function a(u){let d=r.events.length,h;for(;d--;)if(r.events[d][1].type!=="lineEnding"&&r.events[d][1].type!=="linePrefix"&&r.events[d][1].type!=="content"){h=r.events[d][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||h)?(e.enter("setextHeadingLine"),s=u,o(u)):n(u)}function o(u){return e.enter("setextHeadingLineSequence"),l(u)}function l(u){return u===s?(e.consume(u),l):(e.exit("setextHeadingLineSequence"),ne(u)?he(e,c,"lineSuffix")(u):c(u))}function c(u){return u===null||H(u)?(e.exit("setextHeadingLine"),t(u)):n(u)}}const Th={tokenize:Ah};function Ah(e){const t=this,n=e.attempt(Ur,r,e.attempt(this.parser.constructs.flowInitial,s,he(e,e.attempt(this.parser.constructs.flow,s,e.attempt(Fd,s)),"linePrefix")));return n;function r(a){if(a===null){e.consume(a);return}return e.enter("lineEndingBlank"),e.consume(a),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function s(a){if(a===null){e.consume(a);return}return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Lh={resolveAll:bl()},Mh=gl("string"),Dh=gl("text");function gl(e){return{resolveAll:bl(e==="text"?Oh:void 0),tokenize:t};function t(n){const r=this,s=this.parser.constructs[e],a=n.attempt(s,o,l);return o;function o(d){return u(d)?a(d):l(d)}function l(d){if(d===null){n.consume(d);return}return n.enter("data"),n.consume(d),c}function c(d){return u(d)?(n.exit("data"),a(d)):(n.consume(d),c)}function u(d){if(d===null)return!0;const h=s[d];let m=-1;if(h)for(;++m-1){const l=o[0];typeof l=="string"?o[0]=l.slice(r):o.shift()}a>0&&o.push(e[s].slice(0,a))}return o}function Jh(e,t){let n=-1;const r=[];let s;for(;++n0){const Fe=K.tokenStack[K.tokenStack.length-1];(Fe[1]||za).call(K,void 0,Fe[0])}for(M.position={start:vt(N.length>0?N[0][1].start:{line:1,column:1,offset:0}),end:vt(N.length>0?N[N.length-2][1].end:{line:1,column:1,offset:0})},se=-1;++se0&&(r.className=["language-"+s[0]]);let a={type:"element",tagName:"code",properties:r,children:[{type:"text",value:n}]};return t.meta&&(a.data={meta:t.meta}),e.patch(t,a),a=e.applyData(t,a),a={type:"element",tagName:"pre",properties:{},children:[a]},e.patch(t,a),a}function up(e,t){const n={type:"element",tagName:"del",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function dp(e,t){const n={type:"element",tagName:"em",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function hp(e,t){const n=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",r=String(t.identifier).toUpperCase(),s=Cn(r.toLowerCase()),a=e.footnoteOrder.indexOf(r);let o,l=e.footnoteCounts.get(r);l===void 0?(l=0,e.footnoteOrder.push(r),o=e.footnoteOrder.length):o=a+1,l+=1,e.footnoteCounts.set(r,l);const c={type:"element",tagName:"a",properties:{href:"#"+n+"fn-"+s,id:n+"fnref-"+s+(l>1?"-"+l:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(o)}]};e.patch(t,c);const u={type:"element",tagName:"sup",properties:{},children:[c]};return e.patch(t,u),e.applyData(t,u)}function pp(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function mp(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function vl(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const s=e.all(t),a=s[0];a&&a.type==="text"?a.value="["+a.value:s.unshift({type:"text",value:"["});const o=s[s.length-1];return o&&o.type==="text"?o.value+=r:s.push({type:"text",value:r}),s}function fp(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return vl(e,t);const s={src:Cn(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(s.title=r.title);const a={type:"element",tagName:"img",properties:s,children:[]};return e.patch(t,a),e.applyData(t,a)}function xp(e,t){const n={src:Cn(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function gp(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function bp(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return vl(e,t);const s={href:Cn(r.url||"")};r.title!==null&&r.title!==void 0&&(s.title=r.title);const a={type:"element",tagName:"a",properties:s,children:e.all(t)};return e.patch(t,a),e.applyData(t,a)}function yp(e,t){const n={href:Cn(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function wp(e,t,n){const r=e.all(t),s=n?vp(n):jl(t),a={},o=[];if(typeof t.checked=="boolean"){const d=r[0];let h;d&&d.type==="element"&&d.tagName==="p"?h=d:(h={type:"element",tagName:"p",properties:{},children:[]},r.unshift(h)),h.children.length>0&&h.children.unshift({type:"text",value:" "}),h.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),a.className=["task-list-item"]}let l=-1;for(;++l1}function jp(e,t){const n={},r=e.all(t);let s=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++s0){const o={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},l=Ji(t.children[1]),c=nl(t.children[t.children.length-1]);l&&c&&(o.position={start:l,end:c}),s.push(o)}const a={type:"element",tagName:"table",properties:{},children:e.wrap(s,!0)};return e.patch(t,a),e.applyData(t,a)}function _p(e,t,n){const r=n?n.children:void 0,a=(r?r.indexOf(t):1)===0?"th":"td",o=n&&n.type==="table"?n.align:void 0,l=o?o.length:t.children.length;let c=-1;const u=[];for(;++c0,!0),r[0]),s=r.index+r[0].length,r=n.exec(t);return a.push(Ua(t.slice(s),s>0,!1)),a.join("")}function Ua(e,t,n){let r=0,s=e.length;if(t){let a=e.codePointAt(r);for(;a===qa||a===Ba;)r++,a=e.codePointAt(r)}if(n){let a=e.codePointAt(s-1);for(;a===qa||a===Ba;)s--,a=e.codePointAt(s-1)}return s>r?e.slice(r,s):""}function Rp(e,t){const n={type:"text",value:Pp(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function Ip(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Tp={blockquote:op,break:lp,code:cp,delete:up,emphasis:dp,footnoteReference:hp,heading:pp,html:mp,imageReference:fp,image:xp,inlineCode:gp,linkReference:bp,link:yp,listItem:wp,list:jp,paragraph:kp,root:Np,strong:Sp,table:Cp,tableCell:Ep,tableRow:_p,text:Rp,thematicBreak:Ip,toml:Nr,yaml:Nr,definition:Nr,footnoteDefinition:Nr};function Nr(){}const kl=-1,$r=0,$n=1,Mr=2,rs=3,is=4,ss=5,as=6,Nl=7,Sl=8,Ap=typeof self=="object"?self:globalThis,$a=(e,t)=>{switch(e){case"Function":case"SharedWorker":case"Worker":case"eval":case"setInterval":case"setTimeout":throw new TypeError("unable to deserialize "+e)}return new Ap[e](t)},Lp=(e,t)=>{const n=(s,a)=>(e.set(a,s),s),r=s=>{if(e.has(s))return e.get(s);const[a,o]=t[s];switch(a){case $r:case kl:return n(o,s);case $n:{const l=n([],s);for(const c of o)l.push(r(c));return l}case Mr:{const l=n({},s);for(const[c,u]of o)l[r(c)]=r(u);return l}case rs:return n(new Date(o),s);case is:{const{source:l,flags:c}=o;return n(new RegExp(l,c),s)}case ss:{const l=n(new Map,s);for(const[c,u]of o)l.set(r(c),r(u));return l}case as:{const l=n(new Set,s);for(const c of o)l.add(r(c));return l}case Nl:{const{name:l,message:c}=o;return n($a(l,c),s)}case Sl:return n(BigInt(o),s);case"BigInt":return n(Object(BigInt(o)),s);case"ArrayBuffer":return n(new Uint8Array(o).buffer,o);case"DataView":{const{buffer:l}=new Uint8Array(o);return n(new DataView(l),o)}}return n($a(a,o),s)};return r},Ha=e=>Lp(new Map,e)(0),sn="",{toString:Mp}={},{keys:Dp}=Object,Mn=e=>{const t=typeof e;if(t!=="object"||!e)return[$r,t];const n=Mp.call(e).slice(8,-1);switch(n){case"Array":return[$n,sn];case"Object":return[Mr,sn];case"Date":return[rs,sn];case"RegExp":return[is,sn];case"Map":return[ss,sn];case"Set":return[as,sn];case"DataView":return[$n,n]}return n.includes("Array")?[$n,n]:n.includes("Error")?[Nl,n]:[Mr,n]},Sr=([e,t])=>e===$r&&(t==="function"||t==="symbol"),Op=(e,t,n,r)=>{const s=(o,l)=>{const c=r.push(o)-1;return n.set(l,c),c},a=o=>{if(n.has(o))return n.get(o);let[l,c]=Mn(o);switch(l){case $r:{let d=o;switch(c){case"bigint":l=Sl,d=o.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+c);d=null;break;case"undefined":return s([kl],o)}return s([l,d],o)}case $n:{if(c){let m=o;return c==="DataView"?m=new Uint8Array(o.buffer):c==="ArrayBuffer"&&(m=new Uint8Array(o)),s([c,[...m]],o)}const d=[],h=s([l,d],o);for(const m of o)d.push(a(m));return h}case Mr:{if(c)switch(c){case"BigInt":return s([c,o.toString()],o);case"Boolean":case"Number":case"String":return s([c,o.valueOf()],o)}if(t&&"toJSON"in o)return a(o.toJSON());const d=[],h=s([l,d],o);for(const m of Dp(o))(e||!Sr(Mn(o[m])))&&d.push([a(m),a(o[m])]);return h}case rs:return s([l,o.toISOString()],o);case is:{const{source:d,flags:h}=o;return s([l,{source:d,flags:h}],o)}case ss:{const d=[],h=s([l,d],o);for(const[m,p]of o)(e||!(Sr(Mn(m))||Sr(Mn(p))))&&d.push([a(m),a(p)]);return h}case as:{const d=[],h=s([l,d],o);for(const m of o)(e||!Sr(Mn(m)))&&d.push(a(m));return h}}const{message:u}=o;return s([l,{name:c,message:u}],o)};return a},Ka=(e,{json:t,lossy:n}={})=>{const r=[];return Op(!(t||n),!!t,new Map,r)(e),r},Dr=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?Ha(Ka(e,t)):structuredClone(e):(e,t)=>Ha(Ka(e,t));function Fp(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function zp(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function qp(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Fp,r=e.options.footnoteBackLabel||zp,s=e.options.footnoteLabel||"Footnotes",a=e.options.footnoteLabelTagName||"h2",o=e.options.footnoteLabelProperties||{className:["sr-only"]},l=[];let c=-1;for(;++c0&&b.push({type:"text",value:" "});let S=typeof n=="string"?n:n(c,p);typeof S=="string"&&(S={type:"text",value:S}),b.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+m+(p>1?"-"+p:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(c,p),className:["data-footnote-backref"]},children:Array.isArray(S)?S:[S]})}const v=d[d.length-1];if(v&&v.type==="element"&&v.tagName==="p"){const S=v.children[v.children.length-1];S&&S.type==="text"?S.value+=" ":v.children.push({type:"text",value:" "}),v.children.push(...b)}else d.push(...b);const y={type:"element",tagName:"li",properties:{id:t+"fn-"+m},children:e.wrap(d,!0)};e.patch(u,y),l.push(y)}if(l.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:a,properties:{...Dr(o),id:"footnote-label"},children:[{type:"text",value:s}]},{type:"text",value:` +`},{type:"element",tagName:"ol",properties:{},children:e.wrap(l,!0)},{type:"text",value:` +`}]}}const Cl=(function(e){if(e==null)return Hp;if(typeof e=="function")return Hr(e);if(typeof e=="object")return Array.isArray(e)?Bp(e):Up(e);if(typeof e=="string")return $p(e);throw new Error("Expected function, string, or object as test")});function Bp(e){const t=[];let n=-1;for(;++n":""))+")"})}return m;function m(){let p=_l,b,w,v;if((!t||a(c,u,d[d.length-1]||void 0))&&(p=Gp(n(c,d)),p[0]===Qa))return p;if("children"in c&&c.children){const y=c;if(y.children&&p[0]!==Vp)for(w=(r?y.children.length:-1)+o,v=d.concat(y);w>-1&&w0&&n.push({type:"text",value:` +`}),n}function Va(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function Wa(e,t){const n=Xp(e,t),r=n.one(e,void 0),s=qp(n),a=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return s&&a.children.push({type:"text",value:` +`},s),a}function nm(e,t){return e&&"run"in e?async function(n,r){const s=Wa(n,{file:r,...t});await e.run(s,r)}:function(n,r){return Wa(n,{file:r,...e||t})}}function Ga(e){if(e)throw e}var Yr,Ja;function rm(){if(Ja)return Yr;Ja=1;var e=Object.prototype.hasOwnProperty,t=Object.prototype.toString,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=function(u){return typeof Array.isArray=="function"?Array.isArray(u):t.call(u)==="[object Array]"},a=function(u){if(!u||t.call(u)!=="[object Object]")return!1;var d=e.call(u,"constructor"),h=u.constructor&&u.constructor.prototype&&e.call(u.constructor.prototype,"isPrototypeOf");if(u.constructor&&!d&&!h)return!1;var m;for(m in u);return typeof m>"u"||e.call(u,m)},o=function(u,d){n&&d.name==="__proto__"?n(u,d.name,{enumerable:!0,configurable:!0,value:d.newValue,writable:!0}):u[d.name]=d.newValue},l=function(u,d){if(d==="__proto__")if(e.call(u,d)){if(r)return r(u,d).value}else return;return u[d]};return Yr=function c(){var u,d,h,m,p,b,w=arguments[0],v=1,y=arguments.length,S=!1;for(typeof w=="boolean"&&(S=w,w=arguments[1]||{},v=2),(w==null||typeof w!="object"&&typeof w!="function")&&(w={});vo.length;let c;l&&o.push(s);try{c=e.apply(this,o)}catch(u){const d=u;if(l&&n)throw d;return s(d)}l||(c&&c.then&&typeof c.then=="function"?c.then(a,s):c instanceof Error?s(c):a(c))}function s(o,...l){n||(n=!0,t(o,...l))}function a(o){s(null,o)}}const nt={basename:om,dirname:lm,extname:cm,join:um,sep:"/"};function om(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');dr(e);let n=0,r=-1,s=e.length,a;if(t===void 0||t.length===0||t.length>e.length){for(;s--;)if(e.codePointAt(s)===47){if(a){n=s+1;break}}else r<0&&(a=!0,r=s+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let o=-1,l=t.length-1;for(;s--;)if(e.codePointAt(s)===47){if(a){n=s+1;break}}else o<0&&(a=!0,o=s+1),l>-1&&(e.codePointAt(s)===t.codePointAt(l--)?l<0&&(r=s):(l=-1,r=o));return n===r?r=o:r<0&&(r=e.length),e.slice(n,r)}function lm(e){if(dr(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function cm(e){dr(e);let t=e.length,n=-1,r=0,s=-1,a=0,o;for(;t--;){const l=e.codePointAt(t);if(l===47){if(o){r=t+1;break}continue}n<0&&(o=!0,n=t+1),l===46?s<0?s=t:a!==1&&(a=1):s>-1&&(a=-1)}return s<0||n<0||a===0||a===1&&s===n-1&&s===r+1?"":e.slice(s,n)}function um(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function hm(e,t){let n="",r=0,s=-1,a=0,o=-1,l,c;for(;++o<=e.length;){if(o2){if(c=n.lastIndexOf("/"),c!==n.length-1){c<0?(n="",r=0):(n=n.slice(0,c),r=n.length-1-n.lastIndexOf("/")),s=o,a=0;continue}}else if(n.length>0){n="",r=0,s=o,a=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(s+1,o):n=e.slice(s+1,o),r=o-s-1;s=o,a=0}else l===46&&a>-1?a++:a=-1}return n}function dr(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const pm={cwd:mm};function mm(){return"/"}function Mi(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function fm(e){if(typeof e=="string")e=new URL(e);else if(!Mi(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return xm(e)}function xm(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[p,...b]=d;const w=r[m][1];Li(w)&&Li(p)&&(p=Zr(!0,w,p)),r[m]=[u,p,...b]}}}}const wm=new os().freeze();function ri(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function ii(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function si(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function Ya(e){if(!Li(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function Za(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function Cr(e){return vm(e)?e:new Pl(e)}function vm(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function jm(e){return typeof e=="string"||km(e)}function km(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const Nm="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",eo=[],to={allowDangerousHtml:!0},Sm=/^(https?|ircs?|mailto|xmpp)$/i,Cm=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"className",id:"remove-classname"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function _m(e){const t=Em(e),n=Pm(e);return Rm(t.runSync(t.parse(n),n),e)}function Em(e){const t=e.rehypePlugins||eo,n=e.remarkPlugins||eo,r=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...to}:to;return wm().use(ap).use(n).use(nm,r).use(t)}function Pm(e){const t=e.children||"",n=new Pl;return typeof t=="string"&&(n.value=t),n}function Rm(e,t){const n=t.allowedElements,r=t.allowElement,s=t.components,a=t.disallowedElements,o=t.skipHtml,l=t.unwrapDisallowed,c=t.urlTransform||Im;for(const d of Cm)Object.hasOwn(t,d.from)&&(""+d.from+(d.to?"use `"+d.to+"` instead":"remove it")+Nm+d.id,void 0);return El(e,u),zu(e,{Fragment:i.Fragment,components:s,ignoreInvalidStyle:!0,jsx:i.jsx,jsxs:i.jsxs,passKeys:!0,passNode:!0});function u(d,h,m){if(d.type==="raw"&&m&&typeof h=="number")return o?m.children.splice(h,1):m.children[h]={type:"text",value:d.value},h;if(d.type==="element"){let p;for(p in Gr)if(Object.hasOwn(Gr,p)&&Object.hasOwn(d.properties,p)){const b=d.properties[p],w=Gr[p];(w===null||w.includes(d.tagName))&&(d.properties[p]=c(String(b||""),p,d))}}if(d.type==="element"){let p=n?!n.includes(d.tagName):a?a.includes(d.tagName):!1;if(!p&&r&&typeof h=="number"&&(p=!r(d,h,m)),p&&m&&typeof h=="number")return l&&d.children?m.children.splice(h,1,...d.children):m.children.splice(h,1),h}}}function Im(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),s=e.indexOf("/");return t===-1||s!==-1&&t>s||n!==-1&&t>n||r!==-1&&t>r||Sm.test(e.slice(0,t))?e:""}const ls="-",Tm=e=>{const t=Lm(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:o=>{const l=o.split(ls);return l[0]===""&&l.length!==1&&l.shift(),Rl(l,t)||Am(o)},getConflictingClassGroupIds:(o,l)=>{const c=n[o]||[];return l&&r[o]?[...c,...r[o]]:c}}},Rl=(e,t)=>{var o;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),s=r?Rl(e.slice(1),r):void 0;if(s)return s;if(t.validators.length===0)return;const a=e.join(ls);return(o=t.validators.find(({validator:l})=>l(a)))==null?void 0:o.classGroupId},no=/^\[(.+)\]$/,Am=e=>{if(no.test(e)){const t=no.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},Lm=e=>{const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return Dm(Object.entries(e.classGroups),n).forEach(([a,o])=>{Di(o,r,a,t)}),r},Di=(e,t,n,r)=>{e.forEach(s=>{if(typeof s=="string"){const a=s===""?t:ro(t,s);a.classGroupId=n;return}if(typeof s=="function"){if(Mm(s)){Di(s(r),t,n,r);return}t.validators.push({validator:s,classGroupId:n});return}Object.entries(s).forEach(([a,o])=>{Di(o,ro(t,a),n,r)})})},ro=(e,t)=>{let n=e;return t.split(ls).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n},Mm=e=>e.isThemeGetter,Dm=(e,t)=>t?e.map(([n,r])=>{const s=r.map(a=>typeof a=="string"?t+a:typeof a=="object"?Object.fromEntries(Object.entries(a).map(([o,l])=>[t+o,l])):a);return[n,s]}):e,Om=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;const s=(a,o)=>{n.set(a,o),t++,t>e&&(t=0,r=n,n=new Map)};return{get(a){let o=n.get(a);if(o!==void 0)return o;if((o=r.get(a))!==void 0)return s(a,o),o},set(a,o){n.has(a)?n.set(a,o):s(a,o)}}},Il="!",Fm=e=>{const{separator:t,experimentalParseClassName:n}=e,r=t.length===1,s=t[0],a=t.length,o=l=>{const c=[];let u=0,d=0,h;for(let v=0;vd?h-d:void 0;return{modifiers:c,hasImportantModifier:p,baseClassName:b,maybePostfixModifierPosition:w}};return n?l=>n({className:l,parseClassName:o}):o},zm=e=>{if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t},qm=e=>({cache:Om(e.cacheSize),parseClassName:Fm(e),...Tm(e)}),Bm=/\s+/,Um=(e,t)=>{const{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:s}=t,a=[],o=e.trim().split(Bm);let l="";for(let c=o.length-1;c>=0;c-=1){const u=o[c],{modifiers:d,hasImportantModifier:h,baseClassName:m,maybePostfixModifierPosition:p}=n(u);let b=!!p,w=r(b?m.substring(0,p):m);if(!w){if(!b){l=u+(l.length>0?" "+l:l);continue}if(w=r(m),!w){l=u+(l.length>0?" "+l:l);continue}b=!1}const v=zm(d).join(":"),y=h?v+Il:v,S=y+w;if(a.includes(S))continue;a.push(S);const C=s(w,b);for(let k=0;k0?" "+l:l)}return l};function $m(){let e=0,t,n,r="";for(;e{if(typeof e=="string")return e;let t,n="";for(let r=0;rh(d),e());return n=qm(u),r=n.cache.get,s=n.cache.set,a=l,l(c)}function l(c){const u=r(c);if(u)return u;const d=Um(c,n);return s(c,d),d}return function(){return a($m.apply(null,arguments))}}const pe=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},Al=/^\[(?:([a-z-]+):)?(.+)\]$/i,Km=/^\d+\/\d+$/,Qm=new Set(["px","full","screen"]),Vm=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Wm=/\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$/,Gm=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Jm=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Xm=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,mt=e=>ln(e)||Qm.has(e)||Km.test(e),jt=e=>_n(e,"length",af),ln=e=>!!e&&!Number.isNaN(Number(e)),ai=e=>_n(e,"number",ln),Dn=e=>!!e&&Number.isInteger(Number(e)),Ym=e=>e.endsWith("%")&&ln(e.slice(0,-1)),G=e=>Al.test(e),kt=e=>Vm.test(e),Zm=new Set(["length","size","percentage"]),ef=e=>_n(e,Zm,Ll),tf=e=>_n(e,"position",Ll),nf=new Set(["image","url"]),rf=e=>_n(e,nf,lf),sf=e=>_n(e,"",of),On=()=>!0,_n=(e,t,n)=>{const r=Al.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1},af=e=>Wm.test(e)&&!Gm.test(e),Ll=()=>!1,of=e=>Jm.test(e),lf=e=>Xm.test(e),cf=()=>{const e=pe("colors"),t=pe("spacing"),n=pe("blur"),r=pe("brightness"),s=pe("borderColor"),a=pe("borderRadius"),o=pe("borderSpacing"),l=pe("borderWidth"),c=pe("contrast"),u=pe("grayscale"),d=pe("hueRotate"),h=pe("invert"),m=pe("gap"),p=pe("gradientColorStops"),b=pe("gradientColorStopPositions"),w=pe("inset"),v=pe("margin"),y=pe("opacity"),S=pe("padding"),C=pe("saturate"),k=pe("scale"),z=pe("sepia"),j=pe("skew"),q=pe("space"),D=pe("translate"),P=()=>["auto","contain","none"],_=()=>["auto","hidden","clip","visible","scroll"],L=()=>["auto",G,t],R=()=>[G,t],X=()=>["",mt,jt],F=()=>["auto",ln,G],E=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],$=()=>["solid","dashed","dotted","double","none"],B=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],de=()=>["start","end","center","between","around","evenly","stretch"],me=()=>["","0",G],f=()=>["auto","avoid","all","avoid-page","page","left","right","column"],ie=()=>[ln,G];return{cacheSize:500,separator:":",theme:{colors:[On],spacing:[mt,jt],blur:["none","",kt,G],brightness:ie(),borderColor:[e],borderRadius:["none","","full",kt,G],borderSpacing:R(),borderWidth:X(),contrast:ie(),grayscale:me(),hueRotate:ie(),invert:me(),gap:R(),gradientColorStops:[e],gradientColorStopPositions:[Ym,jt],inset:L(),margin:L(),opacity:ie(),padding:R(),saturate:ie(),scale:ie(),sepia:me(),skew:ie(),space:R(),translate:R()},classGroups:{aspect:[{aspect:["auto","square","video",G]}],container:["container"],columns:[{columns:[kt]}],"break-after":[{"break-after":f()}],"break-before":[{"break-before":f()}],"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:[...E(),G]}],overflow:[{overflow:_()}],"overflow-x":[{"overflow-x":_()}],"overflow-y":[{"overflow-y":_()}],overscroll:[{overscroll:P()}],"overscroll-x":[{"overscroll-x":P()}],"overscroll-y":[{"overscroll-y":P()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[w]}],"inset-x":[{"inset-x":[w]}],"inset-y":[{"inset-y":[w]}],start:[{start:[w]}],end:[{end:[w]}],top:[{top:[w]}],right:[{right:[w]}],bottom:[{bottom:[w]}],left:[{left:[w]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Dn,G]}],basis:[{basis:L()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",G]}],grow:[{grow:me()}],shrink:[{shrink:me()}],order:[{order:["first","last","none",Dn,G]}],"grid-cols":[{"grid-cols":[On]}],"col-start-end":[{col:["auto",{span:["full",Dn,G]},G]}],"col-start":[{"col-start":F()}],"col-end":[{"col-end":F()}],"grid-rows":[{"grid-rows":[On]}],"row-start-end":[{row:["auto",{span:[Dn,G]},G]}],"row-start":[{"row-start":F()}],"row-end":[{"row-end":F()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",G]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",G]}],gap:[{gap:[m]}],"gap-x":[{"gap-x":[m]}],"gap-y":[{"gap-y":[m]}],"justify-content":[{justify:["normal",...de()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...de(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...de(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[S]}],px:[{px:[S]}],py:[{py:[S]}],ps:[{ps:[S]}],pe:[{pe:[S]}],pt:[{pt:[S]}],pr:[{pr:[S]}],pb:[{pb:[S]}],pl:[{pl:[S]}],m:[{m:[v]}],mx:[{mx:[v]}],my:[{my:[v]}],ms:[{ms:[v]}],me:[{me:[v]}],mt:[{mt:[v]}],mr:[{mr:[v]}],mb:[{mb:[v]}],ml:[{ml:[v]}],"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",G,t]}],"min-w":[{"min-w":[G,t,"min","max","fit"]}],"max-w":[{"max-w":[G,t,"none","full","min","max","fit","prose",{screen:[kt]},kt]}],h:[{h:[G,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[G,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[G,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[G,t,"auto","min","max","fit"]}],"font-size":[{text:["base",kt,jt]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ai]}],"font-family":[{font:[On]}],"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",G]}],"line-clamp":[{"line-clamp":["none",ln,ai]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",mt,G]}],"list-image":[{"list-image":["none",G]}],"list-style-type":[{list:["none","disc","decimal",G]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[y]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[y]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...$(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",mt,jt]}],"underline-offset":[{"underline-offset":["auto",mt,G]}],"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:R()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",G]}],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",G]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[y]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...E(),tf]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",ef]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},rf]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[p]}],"gradient-via":[{via:[p]}],"gradient-to":[{to:[p]}],rounded:[{rounded:[a]}],"rounded-s":[{"rounded-s":[a]}],"rounded-e":[{"rounded-e":[a]}],"rounded-t":[{"rounded-t":[a]}],"rounded-r":[{"rounded-r":[a]}],"rounded-b":[{"rounded-b":[a]}],"rounded-l":[{"rounded-l":[a]}],"rounded-ss":[{"rounded-ss":[a]}],"rounded-se":[{"rounded-se":[a]}],"rounded-ee":[{"rounded-ee":[a]}],"rounded-es":[{"rounded-es":[a]}],"rounded-tl":[{"rounded-tl":[a]}],"rounded-tr":[{"rounded-tr":[a]}],"rounded-br":[{"rounded-br":[a]}],"rounded-bl":[{"rounded-bl":[a]}],"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":[y]}],"border-style":[{border:[...$(),"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":[y]}],"divide-style":[{divide:$()}],"border-color":[{border:[s]}],"border-color-x":[{"border-x":[s]}],"border-color-y":[{"border-y":[s]}],"border-color-s":[{"border-s":[s]}],"border-color-e":[{"border-e":[s]}],"border-color-t":[{"border-t":[s]}],"border-color-r":[{"border-r":[s]}],"border-color-b":[{"border-b":[s]}],"border-color-l":[{"border-l":[s]}],"divide-color":[{divide:[s]}],"outline-style":[{outline:["",...$()]}],"outline-offset":[{"outline-offset":[mt,G]}],"outline-w":[{outline:[mt,jt]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:X()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[y]}],"ring-offset-w":[{"ring-offset":[mt,jt]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",kt,sf]}],"shadow-color":[{shadow:[On]}],opacity:[{opacity:[y]}],"mix-blend":[{"mix-blend":[...B(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":B()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[c]}],"drop-shadow":[{"drop-shadow":["","none",kt,G]}],grayscale:[{grayscale:[u]}],"hue-rotate":[{"hue-rotate":[d]}],invert:[{invert:[h]}],saturate:[{saturate:[C]}],sepia:[{sepia:[z]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[c]}],"backdrop-grayscale":[{"backdrop-grayscale":[u]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[d]}],"backdrop-invert":[{"backdrop-invert":[h]}],"backdrop-opacity":[{"backdrop-opacity":[y]}],"backdrop-saturate":[{"backdrop-saturate":[C]}],"backdrop-sepia":[{"backdrop-sepia":[z]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[o]}],"border-spacing-x":[{"border-spacing-x":[o]}],"border-spacing-y":[{"border-spacing-y":[o]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",G]}],duration:[{duration:ie()}],ease:[{ease:["linear","in","out","in-out",G]}],delay:[{delay:ie()}],animate:[{animate:["none","spin","ping","pulse","bounce",G]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[k]}],"scale-x":[{"scale-x":[k]}],"scale-y":[{"scale-y":[k]}],rotate:[{rotate:[Dn,G]}],"translate-x":[{"translate-x":[D]}],"translate-y":[{"translate-y":[D]}],"skew-x":[{"skew-x":[j]}],"skew-y":[{"skew-y":[j]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",G]}],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",G]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":R()}],"scroll-mx":[{"scroll-mx":R()}],"scroll-my":[{"scroll-my":R()}],"scroll-ms":[{"scroll-ms":R()}],"scroll-me":[{"scroll-me":R()}],"scroll-mt":[{"scroll-mt":R()}],"scroll-mr":[{"scroll-mr":R()}],"scroll-mb":[{"scroll-mb":R()}],"scroll-ml":[{"scroll-ml":R()}],"scroll-p":[{"scroll-p":R()}],"scroll-px":[{"scroll-px":R()}],"scroll-py":[{"scroll-py":R()}],"scroll-ps":[{"scroll-ps":R()}],"scroll-pe":[{"scroll-pe":R()}],"scroll-pt":[{"scroll-pt":R()}],"scroll-pr":[{"scroll-pr":R()}],"scroll-pb":[{"scroll-pb":R()}],"scroll-pl":[{"scroll-pl":R()}],"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",G]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[mt,jt,ai]}],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"]}}},uf=Hm(cf),Oi={status:"",repo:"",thread:"",action:"",intent:"",actor:""},df=new $c({defaultOptions:{queries:{retry:1}}}),io=12,hf=12,pf=10080*60*1e3,mf=1e3,Ml=Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC";function W(...e){return uf(cc(e))}async function Z(e,t){const n=new Headers(t==null?void 0:t.headers);n.set("Accept","application/json");const r=await fetch(e,{...t,headers:n});if(!r.ok)throw new Error(`${r.status} ${r.statusText}`);return r.json()}function Ke(e){if(e==null)return"n/a";const t=Math.max(0,Math.floor(e));if(t<60)return`${t}s`;const n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}const ff=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}),xf=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});function hr(e){if(!e)return null;const t=new Date(e);return Number.isNaN(t.getTime())?null:t}function gf(e){const t=hr(e);return t?ff.format(t):e??""}function Hn(e){const t=hr(e);return t?xf.format(t):e??""}function Dl(e,t){const n=hr(e);if(!n)return e??"";const r=t-n.getTime(),s=Math.abs(r);if(s>pf)return Hn(e);const a=r>=0?"ago":"from now",o=Math.round(s/1e3);if(o<45)return r>=0?"just now":"soon";if(o<90)return`1m ${a}`;const l=Math.round(o/60);if(l<60)return`${l}m ${a}`;if(l<90)return`1h ${a}`;const c=Math.round(l/60);return c<24?`${c}h ${a}`:c<36?`1d ${a}`:`${Math.round(c/24)}d ${a}`}function Pe({value:e,compact:t=!1,relative:n=!1,now:r=Date.now()}){const s=hr(e);return s?i.jsx("time",{dateTime:s.toISOString(),title:`UTC: ${s.toISOString()}`,children:n?Dl(e,r):t?Hn(e):gf(e)}):i.jsx(i.Fragment,{children:e??""})}function Ol(e,t){const n=hr(e);return n?Math.max(0,Math.floor((t-n.getTime())/1e3)):null}function cs(e,t){return e.status==="running"?Ol(e.started_at,t)??e.runtime_seconds:e.runtime_seconds}function us(e,t){return e.status==="pending"?Ol(e.created_at,t)??e.queue_wait_seconds:e.queue_wait_seconds}function bf(e){const[t,n]=A.useState(()=>Date.now());return A.useEffect(()=>{if(!e)return;n(Date.now());const r=window.setInterval(()=>n(Date.now()),mf);return()=>window.clearInterval(r)},[e]),t}function yf(e){return(e??"").split(/\r?\n/).map(n=>n.trim()).find(Boolean)??""}function Or(e,t,n=1){const r=yf(t),s=n>1?` (${n})`:"";return r?`${e}${s}: ${r}`:`${e}${s}`}function Fr(e){return e==="openclaw_stdout"||e==="openclaw_stderr"}function Fl(e){return e.map(t=>t==null?void 0:t.trim()).filter(Boolean).join(` +`)}function wf(e){const t=[];for(const n of e){const r=t[t.length-1];if(r&&Fr(n.event_type)&&r.eventType===n.event_type){r.count+=1,r.meta=n.ts,r.detail=Fl([r.detail,n.detail]),r.summary=Or(n.summary,r.detail,r.count);continue}t.push({id:String(n.id),badge:n.event_type,meta:n.ts,summary:Fr(n.event_type)?Or(n.summary,n.detail):n.summary,detail:n.detail,eventType:n.event_type,count:1})}return t}function vf(e){const t=[];return e.forEach((n,r)=>{const s=t[t.length-1];if(s&&Fr(n.kind)&&s.kind===n.kind){s.count+=1,s.meta=n.timestamp,s.text=Fl([s.text,n.text]),s.summary=Or(`${n.role} · ${n.kind}`,s.text,s.count);return}t.push({id:`${n.timestamp??"entry"}-${r}`,badge:n.title,meta:n.timestamp,summary:Fr(n.kind)?Or(`${n.role} · ${n.kind}`,n.text):`${n.role} · ${n.kind}`,text:n.text,kind:n.kind,count:1})}),t}function so(e,t,n,r){return e==="openclaw_stdout"?!1:t||n>=r-2}function jf(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 kf(e,t){const n=new URLSearchParams;for(const[r,s]of Object.entries(e))s.trim()&&n.set(r,s.trim());return n.set("limit",String(t)),`/api/jobs?${n.toString()}`}function Nf(e,t,n=50){const r=new URLSearchParams;return e.trim()&&r.set("repo",e.trim()),t.trim()&&r.set("status",t.trim()),r.set("limit",String(n)),`/api/knowledge?${r.toString()}`}function Sf(e){return{timeseries:e==="overview",hooks:e==="hooks",deliveries:e==="deliveries"}}function Cf(e,t,n="day"){return`/api/webhooks/github/timeseries?${new URLSearchParams({from:e,to:t,bucket:n}).toString()}`}function _f(e=50,t){const n=new URLSearchParams({limit:String(e)});return t&&n.set("cursor",t),`/api/webhooks/github/hooks?${n.toString()}`}function Ef(e=50,t,n){const r=new URLSearchParams({limit:String(e)});t&&r.set("cursor",t);for(const[s,a]of Object.entries(n??{}))a!=null&&a.trim()&&r.set(s,a.trim());return`/api/webhooks/github/deliveries?${r.toString()}`}function _r(e=new Date){return{from:new Date(e.getTime()-720*60*60*1e3).toISOString(),to:e.toISOString()}}function Pf(e=Ml){return`/api/metrics/summary?timezone=${encodeURIComponent(e)}`}function Ze(e){try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:"#"}catch{return"#"}}function Tr(){return"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window}function Rf(e){return!!(e&&typeof e=="object"&&"type"in e&&e.type==="github-agent-bridge:push")}function If(e){const t="=".repeat((4-e.length%4)%4),n=(e+t).replace(/-/g,"+").replace(/_/g,"/"),r=window.atob(n),s=new Uint8Array(r.length);for(let a=0;an.id===t.id)?e:[...e,t]}function Af(e,t){const n=ao(t);return e.some(r=>ao(r)===n)?e:[...e,t]}function ao(e){return`${e.timestamp??""}:${e.role}:${e.kind}:${e.title}:${e.text}`}function Lf(e){return["claimed","dispatch_started","dispatch_finished","done","blocked","denied","waiting_approval"].includes(e)}function qn(e){return["blocked","denied","waiting_approval"].includes(e)}function Fi(e,t){return e.status!=="running"?!1:t!=null&&t.is_admin?!0:!!(t!=null&&t.login&&e.trigger_actor&&t.login.toLowerCase()===e.trigger_actor.toLowerCase())}function Mf(e=window.location.pathname){const t=e.match(/^\/jobs\/(\d+)\/?$/);return t?Number(t[1]):null}function Df(e=window.location.pathname){return/^\/knowledge\/?$/.test(e)}function Of(e=window.location.pathname){return/^\/mcp\/?$/.test(e)}function Ff(e=window.location.pathname){return/^\/system\/?$/.test(e)}function zf(e=window.location.pathname){const t=e.match(/^\/webhooks\/hooks\/([^/]+)\/?$/);return t?decodeURIComponent(t[1]):null}function qf(e=window.location.pathname){const t=e.match(/^\/webhooks\/deliveries\/([^/]+)\/?$/);return t?decodeURIComponent(t[1]):null}function oi(e=window.location.pathname){return/^\/webhooks(?:\/(?:hooks|deliveries)\/[^/]+)?\/?$/.test(e)}function zl(e){return e.startsWith("repo:")?e.slice(5):e}function oo(e){return Object.values(e).some(t=>t.trim()!=="")}function Bf(e){return[{key:"status",label:"Status",value:e.status},{key:"repo",label:"Repo",value:e.repo},{key:"thread",label:"Thread",value:e.thread},{key:"action",label:"Action",value:e.action},{key:"actor",label:"Actor",value:e.actor.trim()?`@${e.actor.trim().replace(/^@/,"")}`:""},{key:"intent",label:"Intent",value:e.intent}].filter(t=>t.value.trim()!=="")}function Uf(){var ps,ms,fs,xs,gs,bs,ys,ws,vs,js,ks,Ns,Ss,Cs,_s,Es,Ps,Rs,Is,Ts,As,Ls,Ms,Ds,Os,Fs,zs,qs,Bs,Us,$s,Hs,Ks,Qs,Vs,Ws,Gs,Js,Xs,Ys,Zs,ea,ta;const e=qo(),[t,n]=A.useState(Oi),[r,s]=A.useState(io),a=A.useRef(!1),[o,l]=A.useState(""),[c,u]=A.useState("proposed"),[d,h]=A.useState("overview"),[m,p]=A.useState({hook_id:"",event_name:"",repository:"",result:""}),[b,w]=A.useState(()=>_r()),[v,y]=A.useState(null),[S,C]=A.useState(""),[k,z]=A.useState(()=>window.location.pathname),[j,q]=A.useState(null),D=Mf(k),P=D!==null,_=Df(k),L=Of(k),R=Ff(k),X=oi(k),F=zf(k),E=qf(k),$=!P&&!_&&!L&&!R&&!X,B=D,de=xe({queryKey:["metrics",Ml],queryFn:()=>Z(Pf()),enabled:$||R}),me=xe({queryKey:["dashboard-status"],queryFn:()=>Z("/api/status")}),f=xe({queryKey:["me"],queryFn:()=>Z("/api/me"),refetchInterval:!1}),ie=X&&!!((ms=(ps=f.data)==null?void 0:ps.user)!=null&&ms.is_admin&&((fs=me.data)!=null&&fs.webhook_configured)),Re=Sf(d),x=xe({queryKey:["web-push-config"],queryFn:()=>Z("/api/web-push/config"),enabled:!!((xs=f.data)!=null&&xs.user)}),De=xe({queryKey:["about"],queryFn:()=>Z("/api/about")}),lt=xe({queryKey:["job-actors"],queryFn:()=>Z("/api/jobs/actors"),enabled:$}),oe=xe({queryKey:["jobs",t,r],queryFn:()=>Z(kf(t,r)),enabled:$,placeholderData:T=>T}),Qe=xe({queryKey:["processes"],queryFn:()=>Z("/api/processes"),enabled:R}),Oe=xe({queryKey:["systemd"],queryFn:()=>Z("/api/systemd"),enabled:R}),Ve=xe({queryKey:["alerts"],queryFn:()=>Z("/api/alerts"),enabled:R}),We=xe({queryKey:["webhook-summary"],queryFn:()=>Z("/api/webhooks/github/summary"),enabled:ie}),bt=xe({queryKey:["webhook-timeseries",b.from,b.to,"day"],queryFn:()=>Z(Cf(b.from,b.to)),enabled:ie&&Re.timeseries}),pr=xe({queryKey:["webhook-exceptions"],queryFn:()=>Z("/api/webhooks/github/exceptions"),enabled:ie&&Re.timeseries}),ct=xa({queryKey:["webhook-hooks"],queryFn:({pageParam:T})=>Z(_f(50,T)),initialPageParam:null,getNextPageParam:T=>T.next_cursor??void 0,enabled:ie&&Re.hooks&&F===null&&E===null}),ut=xa({queryKey:["webhook-deliveries",m],queryFn:({pageParam:T})=>Z(Ef(50,T,m)),initialPageParam:null,getNextPageParam:T=>T.next_cursor??void 0,enabled:ie&&Re.deliveries&&F===null&&E===null}),et=xe({queryKey:["webhook-hook",F],queryFn:()=>Z(`/api/webhooks/github/hooks/${encodeURIComponent(F??"")}`),enabled:ie&&F!==null}),mr=A.useCallback(async T=>{const ae=await Z(`/api/webhooks/github/hooks/${encodeURIComponent(T)}/ping`,{method:"POST"});return et.refetch(),window.setTimeout(()=>void et.refetch(),1500),ae.detail},[et]),Mt=xe({queryKey:["webhook-delivery",E],queryFn:()=>Z(`/api/webhooks/github/deliveries/${encodeURIComponent(E??"")}`),enabled:ie&&E!==null}),en=xe({queryKey:["knowledge",o,c],queryFn:()=>Z(Nf(o,c)),enabled:_}),Dt=xe({queryKey:["mcp-tokens"],queryFn:()=>Z("/api/mcp/tokens"),enabled:L&&!!((gs=f.data)!=null&&gs.user)}),fr=xe({queryKey:["mcp-users"],queryFn:()=>Z("/api/mcp/users"),enabled:L&&!!((bs=f.data)!=null&&bs.user)}),tn=xe({queryKey:["job",B],queryFn:()=>Z(`/api/jobs/${B}`),enabled:B!==null}),xr=xe({queryKey:["job-session",B],queryFn:()=>Z(`/api/jobs/${B}/session`),enabled:B!==null}),gr=xe({queryKey:["job-session-events",B],queryFn:()=>Z(`/api/jobs/${B}/session/events`),enabled:B!==null}),br=xe({queryKey:["job-session-transcript",B],queryFn:()=>Z(`/api/jobs/${B}/session/transcript`),enabled:B!==null}),yr=A.useCallback(async T=>{const ae=await Z(`/api/jobs/${T}/retry`,{method:"POST"});e.setQueryData(["job",T],{job:ae.job}),e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["metrics"]})},[e]),N=A.useCallback(async T=>{const ae=await Z(`/api/jobs/${T}/dismiss`,{method:"POST"});e.setQueryData(["job",T],{job:ae.job}),e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["metrics"]})},[e]),M=A.useCallback(async(T,ae)=>{const fe=await Z(`/api/jobs/${T}/cancel`,{method:"POST",body:JSON.stringify({reason:ae||""})});e.setQueryData(["job",T],{job:fe.job}),e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["metrics"]}),e.invalidateQueries({queryKey:["dashboard-status"]})},[e]),K=A.useCallback(async(T,ae)=>{await Z(`/api/knowledge/proposals/${encodeURIComponent(T)}/${ae}`,{method:"POST"}),e.invalidateQueries({queryKey:["knowledge"]}),e.invalidateQueries({queryKey:["dashboard-status"]})},[e]),Y=A.useCallback(async T=>{await Z(`/api/knowledge/rules/${encodeURIComponent(T)}`,{method:"DELETE"}),e.invalidateQueries({queryKey:["knowledge"]})},[e]),se=A.useCallback(async(T,ae)=>{await Z(`/api/knowledge/rules/${encodeURIComponent(T)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({scope:ae})}),e.invalidateQueries({queryKey:["knowledge"]})},[e]),Fe=A.useCallback(async(T,ae)=>{const fe=await Z("/api/mcp/tokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:T,user_login:ae||void 0})});return e.invalidateQueries({queryKey:["mcp-tokens"]}),fe},[e]),dt=A.useCallback(async(T,ae)=>{await Z(`/api/mcp/tokens/${encodeURIComponent(T)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_login:ae})}),e.invalidateQueries({queryKey:["mcp-tokens"]}),e.invalidateQueries({queryKey:["mcp-users"]})},[e]),Ge=A.useCallback(async T=>{await Z(`/api/mcp/tokens/${encodeURIComponent(T)}`,{method:"DELETE"}),e.invalidateQueries({queryKey:["mcp-tokens"]})},[e]),ht=A.useCallback(async T=>{const ae={refresh:"/api/autoupdate/refresh",apply:"/api/autoupdate/apply",complete:"/api/autoupdate/complete-pending"}[T];y(T),C("");try{await Z(ae,{method:"POST"}),e.invalidateQueries({queryKey:["dashboard-status"]})}catch(fe){e.invalidateQueries({queryKey:["dashboard-status"]}),C(fe instanceof Error?fe.message:String(fe))}finally{y(null)}},[e]),Ot=A.useCallback(async()=>{var na;const T=(na=x.data)==null?void 0:na.public_key;if(!T)throw new Error("web_push_not_configured");if(!Tr())throw new Error("web_push_not_supported");if(await window.Notification.requestPermission()!=="granted")throw new Error("notification_permission_denied");const fe=await navigator.serviceWorker.register("/service-worker.js"),ac=await fe.pushManager.getSubscription()??await fe.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:If(T)});await Z("/api/web-push/subscriptions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ac.toJSON())}),e.invalidateQueries({queryKey:["web-push-config"]})},[e,(ys=x.data)==null?void 0:ys.public_key]),_e=A.useCallback(async()=>{if(!Tr())return;const ae=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!ae)return;const fe=ae.endpoint;await ae.unsubscribe(),await Z("/api/web-push/subscriptions",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:fe})}),e.invalidateQueries({queryKey:["web-push-config"]})},[e]);A.useEffect(()=>{var T;!((T=x.data)!=null&&T.status.enabled)||!Tr()||navigator.serviceWorker.register("/service-worker.js").catch(()=>{})},[(ws=x.data)==null?void 0:ws.status.enabled]),A.useEffect(()=>{if(B===null)return;const T=new EventSource(`/api/jobs/${B}/session/stream`);return T.addEventListener("session_event",ae=>{const fe=zr(ae);fe&&(e.setQueryData(["job-session-events",B],wt=>({events:Tf((wt==null?void 0:wt.events)??[],fe)})),Lf(fe.event_type)&&(e.invalidateQueries({queryKey:["job",B]}),e.invalidateQueries({queryKey:["jobs"]})))}),T.addEventListener("transcript_entry",ae=>{const fe=zr(ae);!fe||fe.job_id!==B||e.setQueryData(["job-session-transcript",B],wt=>({entries:Af((wt==null?void 0:wt.entries)??[],fe.entry)}))}),T.onerror=()=>{e.invalidateQueries({queryKey:["job",B]}),e.invalidateQueries({queryKey:["job-session-events",B]}),e.invalidateQueries({queryKey:["job-session-transcript",B]})},()=>T.close()},[B,e]),A.useEffect(()=>{const T=()=>{oi(window.location.pathname)&&w(_r()),z(window.location.pathname)};return window.addEventListener("popstate",T),()=>window.removeEventListener("popstate",T)},[]),A.useEffect(()=>{if(!("serviceWorker"in navigator))return;const T=ae=>{if(!Rf(ae.data))return;const fe={...ae.data.payload,id:Date.now(),receivedAt:Date.now()};q(fe),fe.job_id&&(e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["job",fe.job_id]}),e.invalidateQueries({queryKey:["metrics"]}))};return navigator.serviceWorker.addEventListener("message",T),()=>navigator.serviceWorker.removeEventListener("message",T)},[e]),A.useEffect(()=>{if(!j)return;const T=window.setTimeout(()=>q(null),12e3);return()=>window.clearTimeout(T)},[j]);const pt=A.useCallback(T=>{window.history.pushState({},"",En(T)),z(window.location.pathname)},[]),be=A.useCallback(T=>{window.history.pushState({},"",T),oi(T)&&w(_r()),z(window.location.pathname)},[]),nn=((vs=de.data)==null?void 0:vs.metrics.status_counts)??{},wr=((js=oe.data)==null?void 0:js.jobs)??[],Xl=A.useCallback(T=>{n(T),s(io),a.current=!1},[]);A.useEffect(()=>{oe.isFetching||(a.current=!1)},[oe.isFetching]);const Yl=A.useCallback(()=>{a.current||(a.current=!0,s(T=>T+hf))},[]),yt=B?((ks=tn.data)==null?void 0:ks.job)??null:null,Zl=wr.some(T=>T.status==="running"||T.status==="pending")||(yt==null?void 0:yt.status)==="running"||(yt==null?void 0:yt.status)==="pending"||!!((Ns=Qe.data)!=null&&Ns.running_jobs.length),Rn=bf(Zl),ec=i.jsx(rx,{selectedJobId:B,selectedJob:yt,loading:tn.isLoading,error:tn.error,session:(Ss=xr.data)==null?void 0:Ss.session,sessionEvents:(Cs=gr.data)==null?void 0:Cs.events,transcript:(_s=br.data)==null?void 0:_s.entries,now:Rn}),tc=((Es=ct.data)==null?void 0:Es.pages.flatMap(T=>T.hooks))??[],nc=((Ps=ut.data)==null?void 0:Ps.pages.flatMap(T=>T.deliveries))??[],rc=d==="overview"?bt.isLoading:d==="hooks"?ct.isLoading:ut.isLoading,ic=d==="overview"?bt.error:d==="hooks"?ct.error:ut.error,sc=()=>{We.refetch(),d==="overview"&&pr.refetch(),d==="overview"&&w(_r()),d==="hooks"&&ct.refetch(),d==="deliveries"&&ut.refetch()};return i.jsxs("div",{className:"min-h-screen bg-background text-foreground",children:[i.jsx("header",{className:"border-b border-slate-800 bg-slate-950 text-white",children:i.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:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h1",{className:"truncate text-xl font-semibold",children:"GitHub Agent Bridge"}),i.jsx($f,{about:De.data})]}),i.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[i.jsx(fx,{config:x.data,loading:x.isLoading,onEnable:Ot,onDisable:_e}),i.jsx(mx,{user:(Rs=f.data)==null?void 0:Rs.user,loading:f.isLoading})]})]})}),i.jsxs("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:[i.jsx(Gf,{isDashboardRoute:$,isSystemRoute:R,isKnowledgeRoute:_,isMcpRoute:L,isWebhooksRoute:X,showWebhooks:!!((Ts=(Is=f.data)==null?void 0:Is.user)!=null&&Ts.is_admin&&((As=me.data)!=null&&As.webhook_configured)),knowledgeBadgeCount:((Ds=(Ms=(Ls=me.data)==null?void 0:Ls.metrics)==null?void 0:Ms.knowledge)==null?void 0:Ds.proposed)??0,onNavigate:be}),i.jsx(xx,{notification:j,onDismiss:()=>q(null),onNavigate:be}),D!==null?i.jsx(nx,{jobId:D,detail:ec,selectedJob:yt,user:(Os=f.data)==null?void 0:Os.user,onBackToDashboard:()=>be("/"),onRetry:yr,onDismiss:N,onCancel:M,onRefresh:()=>{tn.refetch(),xr.refetch(),gr.refetch(),br.refetch()}}):_?i.jsx(ix,{data:en.data,loading:en.isLoading,error:en.error,repo:o,status:c,user:(Fs=f.data)==null?void 0:Fs.user,now:Rn,onRepoChange:l,onStatusChange:u,onApprove:T=>K(T,"approve"),onReject:T=>K(T,"reject"),onUpdateRuleScope:se,onDeleteRule:Y,onRefresh:()=>en.refetch()}):L?i.jsx(ux,{tokens:(zs=Dt.data)==null?void 0:zs.tokens,loading:Dt.isLoading,error:Dt.error,user:(qs=f.data)==null?void 0:qs.user,ownerOptions:((Bs=fr.data)==null?void 0:Bs.users)??[],dashboardUrl:(Us=me.data)==null?void 0:Us.dashboard_url,dashboardUrlSource:($s=me.data)==null?void 0:$s.dashboard_url_source,now:Rn,onCreate:Fe,onUpdateOwner:dt,onRevoke:Ge,onRefresh:()=>Dt.refetch()}):X?E?i.jsx(ex,{data:Mt.data,loading:Mt.isLoading,error:Mt.error,onBack:()=>{h("deliveries"),be("/webhooks")},onRefresh:()=>Mt.refetch(),onViewHook:T=>be(`/webhooks/hooks/${encodeURIComponent(T)}`),onViewJob:pt}):F?i.jsx(Zf,{data:et.data,loading:et.isLoading,error:et.error,onBack:()=>{h("hooks"),be("/webhooks")},onRefresh:()=>et.refetch(),onViewHook:T=>be(`/webhooks/hooks/${encodeURIComponent(T)}`),onViewDelivery:T=>be(`/webhooks/deliveries/${encodeURIComponent(T)}`),onPing:mr}):i.jsx(Jf,{summary:We.data,timeseries:(Hs=bt.data)==null?void 0:Hs.points,exceptions:(Ks=pr.data)==null?void 0:Ks.exceptions,hooks:tc,deliveries:nc,section:d,summaryLoading:We.isLoading,sectionLoading:rc,loadingMore:d==="hooks"?ct.isFetchingNextPage:ut.isFetchingNextPage,hasMore:d==="hooks"?ct.hasNextPage:ut.hasNextPage,deliveryFilters:m,error:We.error??ic,onSectionChange:h,onLoadMore:()=>d==="hooks"?ct.fetchNextPage():ut.fetchNextPage(),onDeliveryFiltersChange:p,onViewHook:T=>be(`/webhooks/hooks/${encodeURIComponent(T)}`),onViewDelivery:T=>be(`/webhooks/deliveries/${encodeURIComponent(T)}`),onRefresh:sc}):R?i.jsx(tx,{processes:Qe.data,processesLoading:Qe.isLoading,processesError:Qe.error,systemd:Oe.data,systemdLoading:Oe.isLoading,systemdError:Oe.error,alerts:(Qs=Ve.data)==null?void 0:Qs.alerts,alertsLoading:Ve.isLoading,alertsError:Ve.error,now:Rn,onRefreshProcesses:()=>Qe.refetch(),onRefreshSystemd:()=>Oe.refetch(),onRefreshAlerts:()=>Ve.refetch()}):i.jsxs(i.Fragment,{children:[de.error?i.jsx(we,{tone:"error",text:de.error.message}):null,me.error?i.jsx(we,{tone:"error",text:me.error.message}):null,i.jsx(Hf,{state:(Vs=me.data)==null?void 0:Vs.autoupdate,isAdmin:!!((Gs=(Ws=f.data)==null?void 0:Ws.user)!=null&&Gs.is_admin),runningAction:v,actionError:S,onRefresh:()=>ht("refresh"),onApply:()=>ht("apply"),onCompletePending:()=>ht("complete")}),i.jsxs("section",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Summary metrics",children:[i.jsx(Se,{title:"Pending",value:nn.pending??0,icon:i.jsx(Ko,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Running",value:nn.running??0,icon:i.jsx(Jt,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Blocked",value:nn.blocked??0,icon:i.jsx(Br,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Done",value:nn.done??0,icon:i.jsx(kn,{className:"h-5 w-5"})})]}),i.jsxs("section",{className:"grid gap-3",children:[i.jsx(gx,{count:wr.length,limit:r,loading:oe.isLoading,onRefresh:()=>oe.refetch()}),i.jsxs(ce,{title:"Recent jobs",flushHeader:!0,children:[i.jsx(bx,{filters:t,actorOptions:((Js=lt.data)==null?void 0:Js.actors)??[],onChange:Xl}),oe.error?i.jsx(we,{tone:"error",text:oe.error.message}):null,i.jsx(wx,{jobs:wr,loading:oe.isLoading,loadingMore:oe.isFetching&&!oe.isLoading,hasMore:wr.length>=r,onLoadMore:Yl,onViewJob:pt,now:Rn,user:(Xs=f.data)==null?void 0:Xs.user,onRetry:yr,onDismiss:N,onCancel:M})]}),i.jsx(ce,{title:"Runtime usage",action:i.jsx(Ye,{onClick:()=>de.refetch()}),children:i.jsx(Ax,{usage:(Ys=de.data)==null?void 0:Ys.metrics.runtime_usage,loading:de.isLoading,totalJobs:ho(nn)})})]}),i.jsxs("section",{className:"grid gap-4 xl:grid-cols-3",children:[i.jsx(ce,{title:"Runtime percentiles",children:i.jsx(uo,{label:"runtime",values:(Zs=de.data)==null?void 0:Zs.metrics.runtime_seconds})}),i.jsx(ce,{title:"Jobs per day",children:i.jsx(Tx,{values:(ea=de.data)==null?void 0:ea.metrics.by_created_day,loading:de.isLoading,totalJobs:ho(nn)})}),i.jsx(ce,{title:"Queue wait percentiles",children:i.jsx(uo,{label:"queue wait",values:(ta=de.data)==null?void 0:ta.metrics.queue_wait_seconds})})]})]})]})]})}function $f({about:e}){const t=e!=null&&e.version?`v${e.version}`:"version loading";return i.jsxs("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-slate-300",children:[i.jsx("span",{children:"Operational dashboard"}),i.jsx("span",{className:"font-mono text-xs text-slate-400",children:t}),e!=null&&e.repository_url?i.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-slate-200 hover:underline",href:Ze(e.repository_url),rel:"noreferrer",target:"_blank",children:[i.jsx(Xt,{className:"h-3.5 w-3.5","aria-hidden":!0}),"GitHub"]}):null]})}function Hf({state:e,isAdmin:t,runningAction:n=null,actionError:r="",onRefresh:s,onApply:a,onCompletePending:o}){var v,y,S,C,k,z,j,q,D,P,_;if(!e)return null;const l=(y=(v=e==null?void 0:e.target)==null?void 0:v.tag_name)==null?void 0:y.trim();if(!t||!l||(e==null?void 0:e.decision)==="noop")return null;const c=Kf(e.decision),u=((S=e.queue)==null?void 0:S.active_total)??0,d=Qf((C=e.classification)==null?void 0:C.risk),h=Vf((k=e.target)==null?void 0:k.body),m=((j=(z=e.classification)==null?void 0:z.migration_files)==null?void 0:j.length)??0,p=((D=(q=e.classification)==null?void 0:q.risky_files)==null?void 0:D.length)??0,b=!!(e.executor_reload_pending&&e.dashboard_applied_at&&o),w=!!(a&&m===0);return i.jsxs("section",{className:"rounded-md border border-amber-300 bg-amber-50 p-3 text-amber-950 shadow-sm","aria-label":"Update available",children:[i.jsxs("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i.jsx(Br,{className:"h-4 w-4 text-amber-700","aria-hidden":!0}),i.jsx("h2",{className:"text-sm font-semibold",children:"Update available"}),i.jsx("span",{className:"rounded-sm border border-amber-300 bg-white px-1.5 py-0.5 font-mono text-[11px] text-amber-800",children:l}),(P=e.target)!=null&&P.url?i.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-amber-800 hover:underline",href:Ze(e.target.url),rel:"noreferrer",target:"_blank",children:[i.jsx(Xt,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Release"]}):null]}),i.jsxs("p",{className:"mt-1 text-sm text-amber-900",children:[c,e.installed_tag?i.jsxs("span",{className:"font-mono",children:[" from ",e.installed_tag]}):null]}),i.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[s?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-amber-300 bg-white px-2.5 text-xs font-semibold text-amber-900 hover:bg-amber-100 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:n!==null,onClick:s,children:[i.jsx(cr,{className:W("h-3.5 w-3.5",n==="refresh"&&"animate-spin"),"aria-hidden":!0}),n==="refresh"?"Checking...":"Check now"]}):null,w?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md bg-amber-800 px-2.5 text-xs font-semibold text-white hover:bg-amber-900 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:n!==null,onClick:()=>{window.confirm(`Apply ${l}? This can restart bridge services according to the recorded safe plan.`)&&(a==null||a())},children:[i.jsx(kn,{className:"h-3.5 w-3.5","aria-hidden":!0}),n==="apply"?"Applying...":"Apply update"]}):null,b?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-amber-300 bg-white px-2.5 text-xs font-semibold text-amber-900 hover:bg-amber-100 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:n!==null,onClick:o,children:[i.jsx(Gn,{className:"h-3.5 w-3.5","aria-hidden":!0}),n==="complete"?"Completing...":"Complete reload"]}):null]})]}),i.jsxs("div",{className:"grid gap-2 text-xs sm:grid-cols-3 lg:min-w-[420px]",children:[i.jsx(li,{label:"Impact",value:d}),i.jsx(li,{label:"Active jobs",value:String(u)}),i.jsx(li,{label:"Admin only",value:"autoupdate"})]})]}),e.blocked_reason||e.executor_reload_pending||m>0||p>0?i.jsxs("div",{className:"mt-3 flex flex-wrap gap-2 text-xs",children:[e.executor_reload_pending?i.jsx("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1 font-semibold",children:"executor reload pending"}):null,e.blocked_reason?i.jsx("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1 font-mono",children:e.blocked_reason}):null,m>0?i.jsxs("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1",children:[m," migration file",m===1?"":"s"]}):null,p>0?i.jsxs("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1",children:[p," executor/shared file",p===1?"":"s"]}):null]}):null,h?i.jsxs("div",{className:"mt-3 rounded-md border border-amber-200 bg-white/70 p-2.5",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-amber-800",children:"Changelog preview"}),i.jsx(Wf,{markdown:h})]}):null,(_=e.warnings)!=null&&_.length?i.jsx("div",{className:"mt-2 font-mono text-xs text-amber-800",children:e.warnings[0]}):null,r?i.jsxs("div",{className:"mt-2 rounded-sm border border-amber-300 bg-white px-2 py-1 font-mono text-xs text-amber-900",children:["Action failed: ",r]}):null]})}function li({label:e,value:t}){return i.jsxs("div",{className:"min-w-0 rounded-md border border-amber-200 bg-white/80 px-2 py-1.5",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-amber-700",children:e}),i.jsx("div",{className:"mt-0.5 truncate font-mono text-xs text-amber-950",children:t})]})}function Kf(e){return{stage_dashboard_reload:"Dashboard reload can be staged now",stage_defer_executor_reload:"Dashboard reload can be staged; executor reload waits for the queue",stage_full_reload:"Full reload can be staged now",defer_migration:"Migration release is waiting for a quiet queue"}[e??""]??"Update plan recorded"}function Qf(e){return{dashboard_only:"dashboard only",executor_or_queue:"executor or queue",executor_or_shared:"executor or shared",migration_required:"migration",none:"none"}[e??""]??"unknown"}function Vf(e){return(e??"").trim()}function Wf({markdown:e}){return i.jsx("div",{className:"mt-1 text-sm leading-relaxed text-amber-950",children:i.jsx(_m,{allowedElements:["a","blockquote","code","em","h1","h2","h3","h4","li","ol","p","strong","ul"],components:{a:({href:t,children:n})=>i.jsx("a",{className:"font-semibold text-amber-800 underline underline-offset-2",href:Ze(t??""),rel:"noreferrer",target:"_blank",children:n}),blockquote:({children:t})=>i.jsx("blockquote",{className:"mt-2 border-l-2 border-amber-300 pl-2 text-amber-900",children:t}),code:({children:t})=>i.jsx("code",{className:"rounded-sm bg-amber-100 px-1 py-0.5 font-mono text-[0.85em] text-amber-950",children:t}),h1:({children:t})=>i.jsx("h3",{className:"mt-2 text-sm font-semibold text-amber-950 first:mt-0",children:t}),h2:({children:t})=>i.jsx("h3",{className:"mt-2 text-sm font-semibold text-amber-950 first:mt-0",children:t}),h3:({children:t})=>i.jsx("h3",{className:"mt-2 text-sm font-semibold text-amber-950 first:mt-0",children:t}),h4:({children:t})=>i.jsx("h4",{className:"mt-2 text-xs font-semibold uppercase text-amber-800 first:mt-0",children:t}),li:({children:t})=>i.jsx("li",{className:"break-words pl-0.5 [overflow-wrap:anywhere]",children:t}),ol:({children:t})=>i.jsx("ol",{className:"mt-1 list-decimal space-y-1 pl-5 first:mt-0",children:t}),p:({children:t})=>i.jsx("p",{className:"mt-1 break-words [overflow-wrap:anywhere] first:mt-0",children:t}),strong:({children:t})=>i.jsx("strong",{className:"font-semibold",children:t}),em:({children:t})=>i.jsx("em",{className:"italic",children:t}),ul:({children:t})=>i.jsx("ul",{className:"mt-1 list-disc space-y-1 pl-5 first:mt-0",children:t})},children:e})})}function Gf({isDashboardRoute:e,isSystemRoute:t=!1,isKnowledgeRoute:n,isMcpRoute:r=!1,isWebhooksRoute:s=!1,showWebhooks:a=!1,knowledgeBadgeCount:o=0,onNavigate:l}){return i.jsxs("nav",{className:"flex min-w-0 rounded-lg border border-border bg-panel p-1 shadow-sm","aria-label":"Dashboard sections",children:[i.jsxs(Fn,{href:"/",active:e,onNavigate:l,children:[i.jsx(Wo,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"Jobs"})]}),i.jsxs(Fn,{href:"/system",active:t,onNavigate:l,children:[i.jsx(su,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"System"})]}),a?i.jsxs(Fn,{href:"/webhooks",active:s,onNavigate:l,children:[i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"Webhooks"})]}):null,i.jsxs(Fn,{href:"/knowledge",active:n,onNavigate:l,children:[i.jsx(Vi,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"Knowledge"}),o>0?i.jsx("span",{className:W("inline-flex h-5 min-w-5 items-center justify-center rounded-full border px-1 font-mono text-[11px] leading-none",n?"border-white/40 bg-white/15 text-white":"border-amber-200 bg-amber-100 text-amber-800"),"aria-label":`${o} proposed knowledge ${o===1?"item":"items"}`,children:o}):null]}),i.jsxs(Fn,{href:"/mcp",active:r,onNavigate:l,children:[i.jsx(Lr,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"MCP"})]})]})}function an({text:e}){return i.jsxs("div",{className:"flex items-center justify-center gap-2 py-10 text-sm text-muted",children:[i.jsx(cr,{className:"h-4 w-4 animate-spin","aria-hidden":!0}),e]})}function Jf({summary:e,timeseries:t,exceptions:n,hooks:r,deliveries:s,section:a,summaryLoading:o,sectionLoading:l,loadingMore:c,hasMore:u,deliveryFilters:d,error:h,onSectionChange:m,onLoadMore:p,onDeliveryFiltersChange:b,onViewHook:w,onViewDelivery:v=()=>{},onRefresh:y}){var k,z,j,q,D,P;const S=Object.values((e==null?void 0:e.receipts)??{}).reduce((_,L)=>_+L,0),C=[{id:"overview",label:"Overview"},{id:"hooks",label:"Hooks",count:(k=e==null?void 0:e.totals)==null?void 0:k.hooks},{id:"deliveries",label:"Deliveries",count:(z=e==null?void 0:e.totals)==null?void 0:z.deliveries}];return i.jsxs("section",{className:"grid gap-4",children:[i.jsx(Bl,{icon:i.jsx(Jt,{className:"h-5 w-5 text-muted","aria-hidden":!0}),title:"GitHub webhooks",subtitle:(e==null?void 0:e.mode)==="primary"?"Primary webhook ingestion. IMAP remains active as an idempotent safety net.":(e==null?void 0:e.mode)==="canary"?"Canary ingestion health. Only enabled repositories may create jobs.":"Shadow ingestion health. Deliveries are observed but do not create jobs.",action:i.jsx(Ye,{onClick:y})}),h?i.jsx(we,{tone:"error",text:h.message}):null,i.jsx("div",{className:"flex max-w-full flex-wrap rounded-md border border-border bg-white p-1",role:"tablist","aria-label":"Webhook dashboard section",children:C.map(_=>i.jsxs("button",{type:"button",role:"tab","aria-label":_.count===void 0?_.label:`${_.label} (${_.count} total)`,"aria-selected":a===_.id,className:W("inline-flex h-8 items-center gap-2 rounded px-3 text-sm font-semibold",a===_.id?"bg-primary text-white":"text-muted hover:bg-slate-50 hover:text-foreground"),onClick:()=>m(_.id),children:[_.label,_.count!==void 0?i.jsx("span",{className:"rounded border border-current/30 px-1 font-mono text-[10px]",children:_.count}):null]},_.id))}),i.jsxs("div",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Webhook status",children:[i.jsx(Se,{title:"Receipts",value:S,icon:i.jsx(Jt,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Duplicates",value:(e==null?void 0:e.duplicate_deliveries)??0,icon:i.jsx(cr,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Cross-source matches",value:(e==null?void 0:e.cross_source_matches)??0,icon:i.jsx(Nn,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Mode",value:o?"…":(e==null?void 0:e.mode)??"unknown",icon:i.jsx(Qo,{className:"h-5 w-5"})})]}),a==="overview"?i.jsxs(i.Fragment,{children:[i.jsx(ce,{title:"Delivery activity",children:l?i.jsx(an,{text:"Loading delivery activity…"}):t!=null&&t.length?i.jsx("div",{className:"h-72","aria-label":"Webhook deliveries over time",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(qr,{data:t,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"bucket"}),i.jsx(ar,{allowDecimals:!1}),i.jsx(or,{}),i.jsx(Co,{}),i.jsx(Wt,{dataKey:"observed",stackId:"deliveries",fill:"#2563eb"}),i.jsx(Wt,{dataKey:"duplicate",stackId:"deliveries",fill:"#f59e0b"}),i.jsx(Wt,{dataKey:"unsupported",stackId:"deliveries",fill:"#94a3b8"})]})})}):i.jsx(J,{text:"No webhook activity in the selected 30-day window."})}),i.jsx(ce,{title:"Receipt states",children:o?i.jsx(an,{text:"Loading webhook summary…"}):Object.keys((e==null?void 0:e.receipts)??{}).length?i.jsx("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:Object.entries((e==null?void 0:e.receipts)??{}).sort(([_],[L])=>_.localeCompare(L)).map(([_,L])=>i.jsx(V,{label:_,value:L},_))}):i.jsx(J,{text:"No webhook deliveries observed yet."})}),i.jsx(ce,{title:"Cross-source coverage",children:i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-4",children:[i.jsx(V,{label:"Both sources",value:((j=e==null?void 0:e.coverage)==null?void 0:j.both)??0}),i.jsx(V,{label:"IMAP only",value:((q=e==null?void 0:e.coverage)==null?void 0:q.imap_only)??0}),i.jsx(V,{label:"Webhook only",value:((D=e==null?void 0:e.coverage)==null?void 0:D.webhook_only)??0}),i.jsx(V,{label:"Coverage",value:((P=e==null?void 0:e.coverage)==null?void 0:P.ratio)==null?"not measurable":`${Math.round(e.coverage.ratio*100)}%`})]})}),i.jsx(ce,{title:"Exceptions requiring review",children:n!=null&&n.length?i.jsx("div",{className:"overflow-x-auto",children:i.jsxs("table",{className:"w-full min-w-[720px] text-left text-sm",children:[i.jsx("thead",{className:"border-b border-border text-xs text-muted",children:i.jsxs("tr",{children:[i.jsx("th",{className:"px-3 py-2",children:"Type"}),i.jsx("th",{className:"px-3 py-2",children:"Repository"}),i.jsx("th",{className:"px-3 py-2",children:"Reference"}),i.jsx("th",{className:"px-3 py-2",children:"Observed"})]})}),i.jsx("tbody",{children:n.map(_=>i.jsxs("tr",{className:"border-b border-border/70 last:border-0",children:[i.jsx("td",{className:"px-3 py-2 font-semibold",children:_.kind}),i.jsx("td",{className:"px-3 py-2 font-mono text-xs",children:_.repository??"unknown"}),i.jsx("td",{className:"px-3 py-2 font-mono text-xs",children:_.event_key??_.reference}),i.jsx("td",{className:"px-3 py-2 font-mono text-xs text-muted",children:_.created_at})]},`${_.kind}:${_.reference}`))})]})}):i.jsx(J,{text:"No cross-source exceptions in retained data."})})]}):null,a==="hooks"?i.jsx(ce,{title:"Hook inventory",children:l?i.jsx(an,{text:"Loading hook inventory…"}):r!=null&&r.length?i.jsx(zi,{noun:"hooks",hasMore:u,loading:c,onLoadMore:p,children:i.jsxs("table",{className:"w-full min-w-[920px] text-left text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"sticky top-0 z-10 border-b border-border bg-panel text-left text-xs text-muted",children:[i.jsx("th",{className:"px-3 py-2",children:"Target"}),i.jsx("th",{className:"px-3 py-2",children:"State"}),i.jsx("th",{className:"px-3 py-2",children:"Configuration"}),i.jsx("th",{className:"px-3 py-2",children:"Last delivery"}),i.jsx("th",{className:"px-3 py-2",children:"Last ping"})]})}),i.jsx("tbody",{children:r.map(_=>i.jsxs("tr",{className:"cursor-pointer border-b border-border/70 last:border-0 hover:bg-slate-50",onClick:()=>w(_.id),children:[i.jsxs("td",{className:"px-3 py-3",children:[i.jsx("button",{type:"button",className:"text-left font-semibold text-primary hover:underline",onClick:L=>{L.stopPropagation(),w(_.id)},children:_.target}),i.jsxs("div",{className:"font-mono text-xs text-muted",children:[_.target_type," · #",_.id]})]}),i.jsx("td",{className:"px-3 py-3",children:i.jsx("span",{className:W("rounded border px-2 py-1 text-xs font-semibold",_.status==="receiving"?"border-emerald-200 bg-emerald-50 text-emerald-700":_.status==="inactive"?"border-red-200 bg-red-50 text-red-700":"border-slate-200 bg-slate-50 text-slate-600"),children:_.status})}),i.jsxs("td",{className:"max-w-sm px-3 py-3 text-xs",children:[i.jsx("div",{children:_.events.join(", ")||"No event snapshot"}),i.jsxs("div",{className:"mt-1 font-mono text-muted",children:[_.content_type??"content type unknown"," · SSL ",_.ssl_verify===null||_.ssl_verify===void 0?"unknown":_.ssl_verify?"verified":"disabled"]})]}),i.jsxs("td",{className:"px-3 py-3 text-xs",children:[i.jsxs("div",{className:"font-semibold",children:[_.last_event_name??"Never",_.last_action?` · ${_.last_action}`:""]}),i.jsx("div",{className:"mt-1 font-mono text-muted",children:_.last_repository??_.last_event_at??"No delivery observed"})]}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs text-muted",children:_.last_ping_at??"Never"})]},_.id))})]})}):i.jsx(J,{text:"No hook inventory is available. Redeliver a signed ping from GitHub to create the sanitized configuration snapshot."})}):null,a==="deliveries"?i.jsxs(ce,{title:"Recent deliveries",children:[i.jsx(Xf,{filters:d,onChange:b}),l?i.jsx(an,{text:"Loading deliveries…"}):s!=null&&s.length?i.jsx(zi,{noun:"deliveries",hasMore:u,loading:c,onLoadMore:p,children:i.jsx(ql,{deliveries:s,onViewHook:w,onViewDelivery:v})}):i.jsx(J,{text:"No deliveries match the current filters."})]}):null]})}function Xf({filters:e,onChange:t}){const n=[{key:"hook_id",label:"Hook ID",placeholder:"690954530"},{key:"event_name",label:"Event",placeholder:"issue_comment"},{key:"repository",label:"Repository",placeholder:"gisce/repository"},{key:"result",label:"Result",placeholder:"observed"}];return i.jsx("div",{className:"grid gap-2 border-b border-border p-3 sm:grid-cols-2 xl:grid-cols-4",children:n.map(r=>i.jsxs("label",{className:"grid gap-1 text-xs font-semibold text-muted",children:[r.label,i.jsx("input",{className:"h-9 rounded-md border border-border bg-white px-2 font-mono text-xs text-foreground",value:e[r.key],placeholder:r.placeholder,onChange:s=>t({...e,[r.key]:s.target.value})})]},r.key))})}function ql({deliveries:e,onViewHook:t,onViewDelivery:n=()=>{}}){return i.jsxs("table",{className:"w-full min-w-[980px] text-left text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"sticky top-0 z-10 border-b border-border bg-panel text-left text-xs text-muted",children:[i.jsx("th",{className:"px-3 py-2",children:"Received"}),i.jsx("th",{className:"px-3 py-2",children:"Hook"}),i.jsx("th",{className:"px-3 py-2",children:"Event"}),i.jsx("th",{className:"px-3 py-2",children:"Repository"}),i.jsx("th",{className:"px-3 py-2",children:"Result"}),i.jsx("th",{className:"px-3 py-2",children:"Delivery"})]})}),i.jsx("tbody",{children:e.map(r=>{var s;return i.jsxs("tr",{className:"border-b border-border/70 last:border-0 hover:bg-slate-50",children:[i.jsx("td",{className:"px-3 py-3 font-mono text-xs text-muted",children:r.created_at}),i.jsx("td",{className:"px-3 py-3",children:r.hook_id?i.jsxs("button",{type:"button",className:"text-left text-primary hover:underline",onClick:()=>t(r.hook_id),children:[i.jsx("span",{className:"block font-semibold",children:((s=r.hook)==null?void 0:s.target)??`Hook #${r.hook_id}`}),i.jsxs("span",{className:"font-mono text-xs",children:["#",r.hook_id]})]}):i.jsx("span",{className:"text-xs text-muted",children:"Unknown (legacy)"})}),i.jsxs("td",{className:"px-3 py-3 font-semibold",children:[r.event_name,r.action?` · ${r.action}`:""]}),i.jsx("td",{className:"px-3 py-3",children:r.repository??"—"}),i.jsxs("td",{className:"px-3 py-3",children:[i.jsx("span",{className:"rounded border border-border bg-slate-50 px-2 py-1 text-xs font-semibold",children:r.status}),r.duplicate_count?i.jsxs("span",{className:"ml-2 font-mono text-xs text-muted",children:[r.duplicate_count," retries"]}):null]}),i.jsx("td",{className:"max-w-[14rem] px-3 py-3",children:i.jsx("button",{type:"button",className:"block max-w-full truncate font-mono text-xs font-semibold text-primary hover:underline",title:r.delivery_id,onClick:()=>n(r.delivery_id),children:r.delivery_id})})]},r.delivery_id)})})]})}function zi({noun:e,hasMore:t,loading:n,onLoadMore:r,children:s,className:a}){return i.jsxs("div",{"data-testid":`lazy-scroll-${e}`,className:W("max-h-[640px] overflow-auto rounded-md border border-border",a),children:[s,i.jsx(Yf,{noun:e,hasMore:t,loading:n,onLoadMore:r})]})}function Yf({noun:e,hasMore:t,loading:n,onLoadMore:r}){const s=A.useRef(null),a=A.useRef(!1);return A.useEffect(()=>{n||(a.current=!1)},[n]),A.useEffect(()=>{const o=s.current;if(!o||!t||n||!r)return;const l=()=>{a.current||(a.current=!0,r())};if(!("IntersectionObserver"in window)){l();return}const c=new IntersectionObserver(u=>{u.some(d=>d.isIntersecting)&&l()},{rootMargin:"240px 0px"});return c.observe(o),()=>c.disconnect()},[t,n,e,r]),!t&&!n?null:i.jsx("div",{ref:s,className:"flex min-h-10 items-center justify-center border-t border-border px-3 py-2 text-xs font-medium text-muted","aria-live":"polite",children:n?`Loading more ${e}...`:`Scroll for more ${e}`})}function Zf({data:e,loading:t,error:n,onBack:r,onRefresh:s,onViewHook:a,onViewDelivery:o=()=>{},onPing:l}){const[c,u]=A.useState(!1),[d,h]=A.useState(""),[m,p]=A.useState("");if(t)return i.jsx(an,{text:"Loading hook detail…"});if(n)return i.jsxs("div",{className:"grid gap-3",children:[i.jsx(we,{tone:"error",text:n.message}),i.jsx("button",{type:"button",className:"w-fit rounded border border-border px-3 py-2 text-sm font-semibold",onClick:r,children:"Back to hooks"})]});if(!e)return i.jsx(J,{text:"Hook detail is not available."});const b=e.hook,w=async()=>{if(!(!l||c)){u(!0),h(""),p("");try{h(await l(b.id))}catch(y){p(y instanceof Error?y.message:String(y))}finally{u(!1)}}},v=e.recent_actions??[];return i.jsxs("section",{className:"grid gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{children:[i.jsxs("button",{type:"button",className:"mb-2 inline-flex items-center gap-2 text-sm font-semibold text-primary hover:underline",onClick:r,children:[i.jsx(Qi,{className:"h-4 w-4","aria-hidden":!0}),"Back to hooks"]}),i.jsx("h2",{className:"text-xl font-semibold",children:b.target}),i.jsxs("p",{className:"font-mono text-xs text-muted",children:[b.target_type," webhook #",b.id]})]}),i.jsxs("div",{className:"flex flex-wrap gap-2",children:[b.ping_url&&l?i.jsxs("button",{type:"button",className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold hover:bg-slate-50 disabled:cursor-wait disabled:opacity-60",disabled:c,onClick:()=>void w(),children:[i.jsx(Jt,{className:W("h-4 w-4",c&&"animate-pulse"),"aria-hidden":!0}),c?"Sending ping…":"Send ping"]}):null,i.jsx(Ye,{onClick:s}),b.admin_url?i.jsxs("a",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold hover:bg-slate-50",href:Ze(b.admin_url),target:"_blank",rel:"noreferrer",children:[i.jsx(Xt,{className:"h-4 w-4","aria-hidden":!0}),"Open in GitHub"]}):null]})]}),m?i.jsx(we,{tone:"error",text:m}):null,d?i.jsx("div",{className:"rounded-md border border-emerald-200 bg-emerald-50 p-3 text-sm text-emerald-700",children:d}):null,i.jsxs("div",{className:"grid grid-cols-2 gap-3 lg:grid-cols-4",children:[i.jsx(Se,{title:"State",value:b.status,icon:i.jsx(Jt,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Deliveries",value:e.stats.deliveries,icon:i.jsx(Nn,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Retries",value:e.stats.duplicates,icon:i.jsx(cr,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Unsupported",value:e.stats.unsupported,icon:i.jsx(Br,{className:"h-5 w-5"})})]}),i.jsxs(ce,{title:"Sanitized configuration",children:[i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[i.jsx(V,{label:"Active",value:b.active?"yes":"no"}),i.jsx(V,{label:"Content type",value:b.content_type??"unknown"}),i.jsx(V,{label:"SSL verification",value:b.ssl_verify===null||b.ssl_verify===void 0?"unknown":b.ssl_verify?"enabled":"disabled"}),i.jsx(V,{label:"Destination URL",value:b.delivery_url??"unknown"}),i.jsx(V,{label:"GitHub created",value:b.github_created_at??"unknown"}),i.jsx(V,{label:"GitHub updated",value:b.github_updated_at??"unknown"}),i.jsx(V,{label:"Last ping",value:b.last_ping_at??"never"}),i.jsx(V,{label:"Last delivery",value:b.last_event_at??"never"}),i.jsx(V,{label:"Last result",value:b.last_result??"unknown"})]}),i.jsxs("div",{className:"mt-3 rounded-md border border-border p-3",children:[i.jsx("div",{className:"text-xs font-semibold text-muted",children:"Subscribed events"}),i.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:b.events.length?b.events.map(y=>i.jsx("span",{className:"rounded border border-border bg-slate-50 px-2 py-1 font-mono text-xs",children:y},y)):i.jsx("span",{className:"text-sm text-muted",children:"No event snapshot; send a ping to refresh it."})})]})]}),i.jsx(ce,{title:"Latest observed delivery",children:i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[i.jsx(V,{label:"Event",value:b.last_event_name?`${b.last_event_name}${b.last_action?` · ${b.last_action}`:""}`:"none"}),i.jsx(V,{label:"Repository",value:b.last_repository??"none"}),i.jsx(V,{label:"Delivery ID",value:b.last_delivery_id??"none"})]})}),i.jsx(ce,{title:"Recent administrative actions",children:v.length?i.jsx("div",{className:"divide-y divide-border rounded-md border border-border",children:v.map(y=>i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 px-3 py-2 text-sm",children:[i.jsxs("div",{children:[i.jsx("span",{className:"font-semibold",children:y.action}),i.jsxs("span",{className:"ml-2 text-muted",children:["by @",y.actor]})]}),i.jsxs("span",{className:"font-mono text-xs text-muted",children:[y.status," · ",y.created_at]})]},y.id))}):i.jsx(J,{text:"No administrative actions recorded for this hook."})}),i.jsx(ce,{title:"Recent deliveries",children:e.recent_deliveries.length?i.jsx(ql,{deliveries:e.recent_deliveries,onViewHook:a,onViewDelivery:o}):i.jsx(J,{text:"This hook has no retained deliveries."})})]})}function ex({data:e,loading:t,error:n,onBack:r,onRefresh:s,onViewHook:a,onViewJob:o}){if(t)return i.jsx(an,{text:"Loading delivery detail…"});if(n)return i.jsxs("div",{className:"grid gap-3",children:[i.jsx(we,{tone:"error",text:n.message}),i.jsx("button",{type:"button",className:"w-fit rounded border border-border px-3 py-2 text-sm font-semibold",onClick:r,children:"Back to deliveries"})]});if(!e)return i.jsx(J,{text:"Delivery detail is not available."});const l=e.delivery;return i.jsxs("section",{className:"grid gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{children:[i.jsxs("button",{type:"button",className:"mb-2 inline-flex items-center gap-2 text-sm font-semibold text-primary hover:underline",onClick:r,children:[i.jsx(Qi,{className:"h-4 w-4","aria-hidden":!0}),"Back to deliveries"]}),i.jsxs("h2",{className:"text-xl font-semibold",children:[l.event_name,l.action?` · ${l.action}`:""]}),i.jsxs("p",{className:"font-mono text-xs text-muted",children:["Delivery ",l.delivery_id]})]}),i.jsx(Ye,{onClick:s})]}),i.jsxs(ce,{title:"Delivery",children:[i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[i.jsx(V,{label:"Received",value:l.created_at}),i.jsx(V,{label:"Repository",value:l.repository??"unknown"}),i.jsx(V,{label:"Result",value:l.status}),i.jsx(V,{label:"Event key",value:l.event_key??"unmatchable"}),i.jsx(V,{label:"Payload SHA-256",value:e.payload_hash}),i.jsx(V,{label:"Retries",value:l.duplicate_count??0})]}),l.hook_id?i.jsxs("button",{type:"button",className:"mt-3 text-sm font-semibold text-primary hover:underline",onClick:()=>a(l.hook_id),children:["View hook #",l.hook_id]}):null]}),i.jsx(ce,{title:"Generated job",children:e.job?i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{children:[i.jsx("div",{className:"font-semibold",children:e.job.work_key}),i.jsxs("div",{className:"mt-1 font-mono text-xs text-muted",children:["Job #",e.job.id," · ",e.job.status," · ",e.job.action," · ",e.job.work_intent]})]}),i.jsx("button",{type:"button",className:"rounded-md border border-border px-3 py-2 text-sm font-semibold hover:bg-slate-50",onClick:()=>o(e.job.id),children:"Open job"})]}):i.jsx(J,{text:"This delivery did not generate or coalesce into a job."})}),i.jsx(ce,{title:"Full payload",children:e.payload===null?i.jsx(J,{text:"Payload was not retained for this legacy delivery."}):i.jsx("pre",{className:"max-h-[640px] overflow-auto rounded-md border border-border bg-slate-950 p-4 font-mono text-xs leading-relaxed text-slate-100",children:JSON.stringify(e.payload,null,2)})})]})}function tx({processes:e,processesLoading:t,processesError:n,systemd:r,systemdLoading:s,systemdError:a,alerts:o,alertsLoading:l,alertsError:c,now:u,onRefreshProcesses:d,onRefreshSystemd:h,onRefreshAlerts:m}){return i.jsxs("section",{className:"grid gap-4","aria-label":"Bridge system",children:[i.jsxs(ce,{title:"Systemd",action:i.jsx(Ye,{onClick:h}),children:[a?i.jsx(we,{tone:"error",text:a.message}):null,i.jsx(Mx,{data:r,loading:s})]}),i.jsxs(ce,{title:"Process activity",action:i.jsx(Ye,{onClick:d}),children:[n?i.jsx(we,{tone:"error",text:n.message}):null,i.jsx(Fx,{data:e,loading:t})]}),i.jsxs(ce,{title:"Monitor alerts",action:i.jsx(Ye,{onClick:m}),children:[c?i.jsx(we,{tone:"error",text:c.message}):null,i.jsx(zx,{alerts:o,loading:l,now:u})]})]})}function Fn({href:e,active:t,children:n,onNavigate:r}){return i.jsx("a",{className:W("inline-flex h-8 min-w-0 flex-1 items-center justify-center gap-1 rounded-md px-1.5 text-xs font-semibold sm:flex-none sm:gap-1.5 sm:px-3 sm:text-sm [&>span]:truncate [&>svg]:shrink-0",t?"bg-primary text-white shadow-sm":"text-muted hover:bg-slate-50 hover:text-foreground"),href:e,onClick:s=>{!r||s.defaultPrevented||s.button!==0||s.metaKey||s.ctrlKey||s.altKey||s.shiftKey||(s.preventDefault(),r(e))},children:n})}function nx({jobId:e,detail:t,selectedJob:n,user:r,onBackToDashboard:s,onRetry:a,onDismiss:o,onCancel:l,onRefresh:c}){const[u,d]=A.useState(!1),[h,m]=A.useState(!1),[p,b]=A.useState(!1),w=!!(r!=null&&r.is_admin&&n&&qn(n.status)),v=!!(n&&Fi(n,r)),y=u?"Retrying...":"Retry",S=h?"Dismissing...":"Dismiss",C=p?"Cancelling...":"Cancel";return i.jsxs("div",{className:"grid min-w-0 gap-3 sm:gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.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:"/",onClick:k=>{k.defaultPrevented||k.button!==0||k.metaKey||k.ctrlKey||k.altKey||k.shiftKey||(k.preventDefault(),s())},children:[i.jsx(Qi,{className:"h-4 w-4","aria-hidden":!0}),"Dashboard"]}),i.jsxs("div",{className:"flex items-center gap-2",children:[w?i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-semibold text-white disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:u,onClick:async()=>{if(window.confirm(`Retry job #${e}?`)){d(!0);try{await a(e)}finally{d(!1)}}},children:[i.jsx(Gn,{className:"h-4 w-4","aria-hidden":!0}),y]}):null,w?i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border bg-white px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:h,onClick:async()=>{if(window.confirm(`Dismiss job #${e}?`)){m(!0);try{await o(e)}finally{m(!1)}}},children:[i.jsx(kn,{className:"h-4 w-4","aria-hidden":!0}),S]}):null,v?i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-red-200 bg-red-50 px-3 text-sm font-semibold text-red-700 hover:bg-red-100 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:p,onClick:async()=>{const k=window.prompt(`Cancel job #${e}? Optional reason:`);if(k!==null){b(!0);try{await l(e,k)}finally{b(!1)}}},children:[i.jsx(Yt,{className:"h-4 w-4","aria-hidden":!0}),C]}):null,i.jsx(Ye,{onClick:c})]})]}),i.jsx(ce,{title:`Job #${e}`,className:"p-3 sm:p-4",children:t})]})}function rx({selectedJobId:e,selectedJob:t,loading:n,error:r,session:s,sessionEvents:a,transcript:o,now:l}){return t?i.jsx(Ex,{job:t,session:s,sessionEvents:a,transcript:o,now:l}):e!==null&&n?i.jsx(J,{text:"Loading selected job..."}):e!==null&&r?i.jsx(we,{tone:"error",text:`Job #${e}: ${r.message}`}):i.jsx(J,{text:"Select a job to inspect its timeline, worklog and GitHub links."})}function ix({data:e,loading:t,error:n,repo:r,status:s,user:a,now:o,onRepoChange:l,onStatusChange:c,onApprove:u,onReject:d,onUpdateRuleScope:h,onDeleteRule:m,onRefresh:p}){const b=(e==null?void 0:e.summary)??{},[w,v]=A.useState("proposals"),y=[{id:"proposals",label:"Proposals",count:(e==null?void 0:e.proposals.length)??0},{id:"rules",label:"Rules",count:(e==null?void 0:e.rules.length)??0},{id:"events",label:"Events",count:(e==null?void 0:e.events.length)??0}];return i.jsxs("div",{className:"grid min-w-0 gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("h2",{className:"flex items-center gap-2 text-base font-semibold",children:[i.jsx(Vi,{className:"h-5 w-5 text-muted","aria-hidden":!0}),"Acquired knowledge"]}),i.jsx("p",{className:"text-xs text-muted",children:"Captured feedback, proposed rules and curated agent memory."})]}),i.jsx(Ye,{onClick:p})]}),n?i.jsx(we,{tone:"error",text:n.message}):null,i.jsxs("section",{className:"grid grid-cols-2 gap-3 lg:grid-cols-4","aria-label":"Knowledge metrics",children:[i.jsx(Se,{title:"Proposed",value:b.proposed??0,icon:i.jsx(Ko,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Approved",value:b.approved??0,icon:i.jsx(kn,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Rules",value:b.rules??0,icon:i.jsx(Vo,{className:"h-5 w-5"})}),i.jsx(Se,{title:"Events",value:b.events??0,icon:i.jsx(Jt,{className:"h-5 w-5"})})]}),i.jsx(ce,{title:"Filters",className:"p-3",children:i.jsxs("div",{className:W("grid gap-3",w==="proposals"?"md:grid-cols-[minmax(0,1fr)_220px]":"md:grid-cols-[minmax(0,1fr)]"),children:[i.jsx(Xe,{label:"Repository",children:i.jsxs("select",{className:"control",value:r,onChange:S=>l(S.target.value),children:[i.jsx("option",{value:"",children:"All repositories"}),((e==null?void 0:e.repositories)??[]).map(S=>i.jsx("option",{value:S,children:S},S))]})}),w==="proposals"?i.jsx(Xe,{label:"Proposal status",children:i.jsxs("select",{className:"control",value:s,onChange:S=>c(S.target.value),children:[i.jsx("option",{value:"",children:"All statuses"}),i.jsx("option",{value:"proposed",children:"proposed"}),i.jsx("option",{value:"approved",children:"approved"}),i.jsx("option",{value:"rejected",children:"rejected"}),i.jsx("option",{value:"error",children:"error"})]})}):null]})}),i.jsxs(ce,{title:"Knowledge records",action:i.jsx("div",{className:"flex max-w-full flex-wrap rounded-md border border-border bg-white p-0.5",role:"tablist","aria-label":"Knowledge record type",children:y.map(S=>i.jsxs("button",{className:W("inline-flex h-8 items-center gap-1.5 rounded px-2.5 text-xs font-semibold",w===S.id?"bg-primary text-white":"text-muted hover:bg-slate-50 hover:text-foreground"),type:"button",role:"tab","aria-label":`${S.label} (${S.count})`,"aria-selected":w===S.id,onClick:()=>v(S.id),children:[i.jsx("span",{children:S.label}),i.jsx("span",{className:W("rounded-sm border px-1 font-mono text-[10px]",w===S.id?"border-white/40 text-white":"border-border text-muted"),children:S.count})]},S.id))}),children:[w==="proposals"?i.jsx(sx,{proposals:(e==null?void 0:e.proposals)??[],loading:t,isAdmin:!!(a!=null&&a.is_admin),now:o,onApprove:u,onReject:d}):null,w==="rules"?i.jsx(lx,{rules:(e==null?void 0:e.rules)??[],loading:t,now:o,onUpdateRuleScope:h,onDeleteRule:m}):null,w==="events"?i.jsx(cx,{events:(e==null?void 0:e.events)??[],loading:t,now:o}):null]})]})}function sx({proposals:e,loading:t,isAdmin:n,now:r,onApprove:s,onReject:a}){const[o,l]=A.useState(null);return t&&e.length===0?i.jsx(J,{text:"Loading proposals..."}):e.length===0?i.jsx(J,{text:"No proposals match the current filters."}):i.jsx("div",{className:"grid gap-2",children:e.map(c=>i.jsxs("article",{className:"grid min-w-0 gap-2 rounded-md border border-border bg-white p-3",children:[i.jsx($l,{scope:c.scope,type:c.type,confidence:c.confidence,status:c.status,timestamp:c.updated_at,now:r}),i.jsx("p",{className:"min-w-0 break-words text-sm font-medium [overflow-wrap:anywhere]",children:c.rule||c.reason||"No reusable rule proposed."}),c.reason?i.jsx("p",{className:"min-w-0 break-words text-xs text-muted [overflow-wrap:anywhere]",children:c.reason}):null,c.source_event?i.jsx(ax,{event:c.source_event}):i.jsxs("p",{className:"font-mono text-xs text-muted",children:["Source event ",c.event_id]}),c.error?i.jsx(we,{tone:"error",text:c.error}):null,n&&c.status==="proposed"?i.jsxs("div",{className:"flex flex-wrap gap-2",children:[i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md bg-primary px-3 text-sm font-semibold text-white disabled:opacity-60",type:"button",disabled:o===c.id,onClick:async()=>{l(c.id);try{await s(c.id)}finally{l(null)}},children:[i.jsx(kn,{className:"h-4 w-4","aria-hidden":!0}),"Approve"]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:o===c.id,onClick:async()=>{l(c.id);try{await a(c.id)}finally{l(null)}},children:[i.jsx(Yt,{className:"h-4 w-4","aria-hidden":!0}),"Reject"]})]}):null]},c.id))})}function ax({event:e}){const t=e.trigger_actor||(e.actor!=="github"?e.actor:null);return i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2 rounded-md border border-border bg-slate-50 px-2 py-1.5",children:[i.jsx(Pn,{actor:t,avatarUrl:e.trigger_actor_avatar_url,framed:!0}),e.source_job_id?i.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border bg-white px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:En(e.source_job_id),children:[i.jsx(Nn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.source_job_id]}):null,e.github_urls.length>0?i.jsx(Xn,{urls:e.github_urls,compact:!0}):i.jsx("span",{className:"font-mono text-xs text-muted",children:"No GitHub link"})]})}function ox(e){const t=[{value:"global",label:"global"}];if(e.startsWith("repo:")){const n=e.slice(5),[r,s]=n.split("/",2);r&&s&&(t.push({value:`org:${r}`,label:`org:${r}`}),t.push({value:`repo:${r}/${s}`,label:`repo:${r}/${s}`}))}else e.startsWith("org:")&&t.push({value:e,label:e});return t.some(n=>n.value===e)||t.push({value:e,label:e}),t}function lx({rules:e,loading:t,now:n,onUpdateRuleScope:r,onDeleteRule:s}){const[a,o]=A.useState(null),[l,c]=A.useState(null),[u,d]=A.useState("");return t&&e.length===0?i.jsx(J,{text:"Loading curated rules..."}):e.length===0?i.jsx(J,{text:"No curated rules match the current filters."}):i.jsx("div",{className:"grid gap-2",children:e.map(h=>{const m=h.source_event_details??[],p=m[0],b=p?p.trigger_actor||(p.actor!=="github"?p.actor:null):null,w=m.flatMap(k=>k.github_urls??[]),v=ox(h.scope),y=l===h.id,S=a===h.id,C=!!h.can_manage;return i.jsxs("article",{className:"grid min-w-0 gap-2 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsx($l,{scope:h.scope,type:h.type,confidence:h.confidence,status:`${h.observations} observation${h.observations===1?"":"s"}`,timestamp:h.last_seen,now:n}),C?i.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[y?i.jsxs(i.Fragment,{children:[i.jsx(Xe,{label:"Scope",children:i.jsx("select",{className:"control h-8 min-w-[180px] py-1 text-xs",value:u,disabled:S,onChange:k=>d(k.target.value),children:v.map(k=>i.jsx("option",{value:k.value,children:k.label},k.value))})}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:S||u===h.scope,title:"Save scope",onClick:async()=>{if(u!==h.scope){o(h.id);try{await r(h.id,u),c(null)}finally{o(null)}}},children:[i.jsx(ou,{className:"h-4 w-4","aria-hidden":!0}),"Save"]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-muted hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:S,title:"Cancel scope edit",onClick:()=>{c(null),d("")},children:[i.jsx(Yt,{className:"h-4 w-4","aria-hidden":!0}),"Cancel"]})]}):i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:S,title:"Edit scope",onClick:()=>{c(h.id),d(h.scope)},children:[i.jsx(au,{className:"h-4 w-4","aria-hidden":!0}),"Edit"]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-red-200 px-3 text-sm font-semibold text-red-700 hover:bg-red-50 disabled:opacity-60",type:"button",disabled:S,onClick:async()=>{if(window.confirm("Delete this curated rule?")){o(h.id);try{await s(h.id)}finally{o(null)}}},children:[i.jsx(Si,{className:"h-4 w-4","aria-hidden":!0}),"Delete"]})]}):null]}),i.jsx("p",{className:"min-w-0 break-words text-sm font-medium [overflow-wrap:anywhere]",children:h.rule}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsx(Pn,{actor:b,avatarUrl:p==null?void 0:p.trigger_actor_avatar_url,framed:!0}),p!=null&&p.source_job_id?i.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-white",href:En(p.source_job_id),children:[i.jsx(Nn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",p.source_job_id]}):null,w.length>0?i.jsx(Xn,{urls:w,compact:!0}):i.jsx("span",{className:"font-mono text-xs text-muted",children:"No GitHub link"})]})]},h.id)})})}function cx({events:e,loading:t,now:n}){return t&&e.length===0?i.jsx(J,{text:"Loading captured events..."}):e.length===0?i.jsx(J,{text:"No captured feedback events match the current filters."}):i.jsx("div",{className:"grid gap-2",children:e.map(r=>{const s=r.trigger_actor||(r.actor!=="github"?r.actor:null);return i.jsxs("details",{className:"group rounded-md border border-border bg-white",children:[i.jsxs("summary",{className:"grid cursor-pointer list-none gap-2 px-3 py-2 marker:hidden hover:bg-slate-50",children:[i.jsxs("div",{className:"flex min-w-0 items-center justify-between gap-2",children:[i.jsxs("span",{className:"inline-flex min-w-0 items-center gap-2 font-mono text-xs font-semibold text-muted",children:[i.jsx(jn,{className:"h-3.5 w-3.5 shrink-0 transition-transform group-open:rotate-180","aria-hidden":!0}),i.jsx("span",{className:"truncate",children:zl(r.scope)})]}),i.jsx("span",{className:"shrink-0 font-mono text-xs text-muted",children:i.jsx(Pe,{value:r.occurred_at,relative:!0,now:n})})]}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsx(Pn,{actor:s,avatarUrl:r.trigger_actor_avatar_url,framed:!0}),r.source_job_id?i.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-white",href:En(r.source_job_id),children:[i.jsx(Nn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",r.source_job_id]}):null,r.github_urls.length>0?i.jsx(Xn,{urls:r.github_urls,compact:!0}):i.jsx("span",{className:"font-mono text-xs text-muted",children:"No GitHub link"})]}),i.jsx("p",{className:"line-clamp-2 break-words text-sm [overflow-wrap:anywhere]",children:r.comment})]}),i.jsxs("div",{className:"grid gap-2 border-t border-border px-3 py-2",children:[i.jsxs("div",{children:[i.jsx("h3",{className:"mb-1 text-xs font-semibold text-muted",children:"GitHub links"}),r.github_urls.length>0?i.jsx(Xn,{urls:r.github_urls}):i.jsx("p",{className:"text-xs text-muted",children:"No links recorded."})]}),i.jsx("pre",{className:"max-h-72 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs leading-relaxed text-slate-100",children:JSON.stringify(r.context,null,2)})]})]},r.id)})})}function ux({tokens:e,loading:t,error:n,user:r,ownerOptions:s,dashboardUrl:a,dashboardUrlSource:o,now:l,onCreate:c,onUpdateOwner:u,onRevoke:d,onRefresh:h}){const[m,p]=A.useState(""),[b,w]=A.useState(""),[v,y]=A.useState(!1),[S,C]=A.useState(null),[k,z]=A.useState(null),[j,q]=A.useState(null),[D,P]=A.useState(""),_=e??[],L=s.find(E=>E.login===b);A.useEffect(()=>{var E;r!=null&&r.is_admin&&(b&&s.some($=>$.login===b)||w((r==null?void 0:r.login)||((E=s[0])==null?void 0:E.login)||""))},[s,r==null?void 0:r.is_admin,r==null?void 0:r.login,b]);const R=(a||(typeof window>"u"?"":window.location.origin)).replace(/\/$/,""),X=`${R}/mcp`,F=`${R}/api/mcp`;return i.jsxs("div",{className:"grid min-w-0 gap-4",children:[i.jsx(Bl,{icon:i.jsx(Lr,{className:"h-5 w-5 text-muted","aria-hidden":!0}),title:"MCP access",subtitle:r!=null&&r.is_admin?"Issue and revoke read-only tokens for any dashboard user.":"Issue and revoke read-only tokens linked to your user.",action:i.jsx(Ye,{onClick:h})}),n?i.jsx(we,{tone:"error",text:n.message}):null,D?i.jsx(we,{tone:"error",text:D}):null,i.jsx(dx,{dashboardUrl:X,endpointUrl:F,dashboardUrlSource:o??"request"}),j?i.jsxs("section",{className:"rounded-md border border-emerald-300 bg-emerald-50 p-3 text-emerald-950","aria-label":"Created MCP token",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{children:[i.jsx("h2",{className:"text-sm font-semibold",children:"Token created"}),i.jsx("p",{className:"mt-1 text-xs text-emerald-800",children:"This secret is shown once. Store it in the local agent environment before leaving this page."})]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-emerald-300 bg-white px-3 text-sm font-semibold text-emerald-900 hover:bg-emerald-100",type:"button",onClick:()=>q(null),children:[i.jsx(Yt,{className:"h-4 w-4","aria-hidden":!0}),"Hide"]})]}),i.jsx("pre",{className:"mt-3 overflow-auto rounded bg-emerald-950 px-3 py-2 font-mono text-xs text-emerald-50",children:j.token})]}):null,i.jsx(ce,{title:"Create token",children:i.jsxs("form",{className:r!=null&&r.is_admin?"grid gap-3 md:grid-cols-[minmax(0,1fr)_minmax(12rem,16rem)_auto]":"grid gap-3 md:grid-cols-[minmax(0,1fr)_auto]",onSubmit:async E=>{E.preventDefault();const $=m.trim();if($){y(!0),P("");try{const B=await c($,r!=null&&r.is_admin?b:void 0);q(B),p("")}catch(B){P(B instanceof Error?B.message:String(B))}finally{y(!1)}}},children:[i.jsx(Xe,{label:"Token name",children:i.jsx("input",{className:"control",value:m,placeholder:"local agent",disabled:v,onChange:E=>p(E.target.value)})}),r!=null&&r.is_admin?i.jsxs(Xe,{label:"Owner",children:[i.jsx(Ul,{ariaLabel:"Owner",value:b,ownerOptions:s,disabled:v||s.length===0,selectedSuffix:E=>E.login===(r==null?void 0:r.login)?" (you)":"",emptyLabel:"No known users",onChange:w}),L?i.jsxs("span",{className:"font-normal text-muted",children:["Token will be linked to @",L.login,"."]}):null]}):null,i.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 disabled:cursor-not-allowed disabled:opacity-60",type:"submit",disabled:v||!m.trim()||!!(r!=null&&r.is_admin&&!b),children:[i.jsx(Lr,{className:"h-4 w-4","aria-hidden":!0}),v?"Creating...":"Create token"]})]})}),i.jsx(ce,{title:"Active tokens",children:i.jsx(hx,{tokens:_,loading:t,now:l,ownerOptions:s,canManageOwners:!!(r!=null&&r.is_admin),revokingId:S,updatingOwnerId:k,onUpdateOwner:async(E,$)=>{z(E),P("");try{await u(E,$)}catch(B){P(B instanceof Error?B.message:String(B))}finally{z(null)}},onRevoke:async E=>{if(window.confirm("Revoke this MCP token?")){C(E),P("");try{await d(E)}catch($){P($ instanceof Error?$.message:String($))}finally{C(null)}}}})})]})}function dx({dashboardUrl:e,endpointUrl:t,dashboardUrlSource:n}){const r=n==="configured"?"Configured public URL":n==="forwarded"?"Forwarded public URL":"Needs public URL",s=n==="request",a=s?"Set GITHUB_AGENT_BRIDGE_DASHBOARD_PUBLIC_URL or forward X-Forwarded-* headers":e,o=s?"Public dashboard URL required before connecting remote agents":t,c=`{ + "mcpServers": { + "github-agent-bridge": { + "url": "${s?"https://bridge.example.com/api/mcp":t}", + "headers": { + "Authorization": "Bearer \${GITHUB_AGENT_BRIDGE_MCP_TOKEN}" + } + } + } +}`;return i.jsxs(ce,{title:"Connect an agent",children:[s?i.jsx(we,{tone:"warning",text:"Set GITHUB_AGENT_BRIDGE_DASHBOARD_PUBLIC_URL, or forward X-Forwarded-* headers from the proxy, before connecting remote agents."}):null,i.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]",children:[i.jsxs("div",{className:"grid min-w-0 gap-3",children:[i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm font-semibold",children:[i.jsx(Xt,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Public dashboard URL",i.jsx("span",{className:"rounded-sm border border-border bg-slate-50 px-1.5 py-0.5 font-mono text-[11px] font-normal text-muted",children:r})]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Share this page URL with bridge admins only after it resolves to the external dashboard origin."}),i.jsx("pre",{className:"mt-3 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs text-slate-100",children:a})]}),i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Xt,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"HTTP MCP endpoint"]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Remote agents connect directly with a bearer token; no local `gab` binary is required on the agent host."}),i.jsx("pre",{className:"mt-3 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs text-slate-100",children:o})]})]}),i.jsxs("div",{className:"grid min-w-0 gap-3",children:[i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Lr,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Agent config"]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Create a token below, then store the one-time secret as `GITHUB_AGENT_BRIDGE_MCP_TOKEN` for the agent."}),i.jsx("pre",{className:"mt-3 max-h-64 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs leading-relaxed text-slate-100",children:c})]}),i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Vi,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Agent prompt"]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Ask the agent to use the read-only bridge knowledge server before acting on repository work."}),i.jsx("pre",{className:"mt-3 max-h-40 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs leading-relaxed text-slate-100",children:"Use the github-agent-bridge MCP server for repository knowledge. Query list_repositories and list_knowledge before making repository decisions."})]})]})]})]})}function Bl({icon:e,title:t,subtitle:n,action:r}){return i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("h2",{className:"flex items-center gap-2 text-base font-semibold",children:[e,t]}),i.jsx("p",{className:"text-xs text-muted",children:n})]}),r]})}function hx({tokens:e,loading:t,now:n,ownerOptions:r,canManageOwners:s,revokingId:a,updatingOwnerId:o,onUpdateOwner:l,onRevoke:c}){return t&&e.length===0?i.jsx(J,{text:"Loading MCP tokens..."}):e.length===0?i.jsx(J,{text:"No active MCP tokens."}):i.jsxs(i.Fragment,{children:[i.jsx("div",{className:"grid gap-2 md:hidden",children:e.map(u=>i.jsxs("article",{className:"grid min-w-0 gap-3 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h3",{className:"break-words text-sm font-semibold [overflow-wrap:anywhere]",children:u.name}),i.jsx("div",{className:"mt-1 break-all font-mono text-xs text-muted",children:u.id}),s?i.jsx(lo,{token:u,ownerOptions:r,disabled:o===u.id,onUpdateOwner:l}):u.user_login?i.jsxs("div",{className:"mt-1 text-xs text-muted",children:["Owner: @",u.user_login]}):null]}),i.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[i.jsx(V,{label:"Created",value:i.jsx(Pe,{value:u.created_at,relative:!0,now:n})}),i.jsx(V,{label:"Last used",value:u.last_used_at?i.jsx(Pe,{value:u.last_used_at,relative:!0,now:n}):"never"})]}),i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-red-200 px-3 text-sm font-semibold text-red-700 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:a===u.id,onClick:()=>c(u.id),children:[i.jsx(Si,{className:"h-4 w-4","aria-hidden":!0}),a===u.id?"Revoking...":"Revoke"]})]},u.id))}),i.jsx("div",{className:"hidden overflow-auto rounded-md border border-border md:block",children:i.jsxs("table",{className:"min-w-full border-collapse text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"border-b border-border bg-slate-50 text-left text-xs text-muted",children:[i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Name"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Owner"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Created"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Last used"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"ID"}),i.jsx("th",{className:"px-3 py-2 text-right font-semibold",children:"Actions"})]})}),i.jsx("tbody",{children:e.map(u=>i.jsxs("tr",{className:"border-b border-border last:border-b-0",children:[i.jsx("td",{className:"px-3 py-3 font-semibold",children:u.name}),i.jsx("td",{className:"px-3 py-3 text-xs text-muted",children:s?i.jsx(lo,{token:u,ownerOptions:r,disabled:o===u.id,onUpdateOwner:l}):u.user_login?`@${u.user_login}`:"unassigned"}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs",children:i.jsx(Pe,{value:u.created_at,relative:!0,now:n})}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs",children:u.last_used_at?i.jsx(Pe,{value:u.last_used_at,relative:!0,now:n}):"never"}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs text-muted",children:u.id}),i.jsx("td",{className:"px-3 py-3 text-right",children:i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-red-200 px-3 text-sm font-semibold text-red-700 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:a===u.id,onClick:()=>c(u.id),children:[i.jsx(Si,{className:"h-4 w-4","aria-hidden":!0}),a===u.id?"Revoking...":"Revoke"]})})]},u.id))})]})})]})}function lo({token:e,ownerOptions:t,disabled:n,onUpdateOwner:r}){const s=e.user_login??"";return i.jsx(Ul,{ariaLabel:`Owner for ${e.name}`,value:s,ownerOptions:t,disabled:n||t.length===0,emptyLabel:"Select owner",size:"compact",onChange:a=>{!a||a===e.user_login||r(e.id,a)}})}function Ul({value:e,ownerOptions:t,disabled:n,onChange:r,ariaLabel:s,selectedSuffix:a,emptyLabel:o,size:l="default"}){const c=t.find(d=>d.login===e),u=c?`@${c.login}${(a==null?void 0:a(c))??""}`:o;return i.jsxs("div",{className:W("relative flex min-w-0 items-center gap-2 rounded-md border border-border bg-panel text-foreground focus-within:border-primary focus-within:ring-1 focus-within:ring-primary",n?"opacity-60":"",l==="compact"?"h-8 w-44 max-w-full px-2":"h-9 w-full px-2.5"),children:[i.jsx("span",{className:W("pointer-events-none flex shrink-0 items-center justify-center",l==="compact"?"h-5 w-5":"h-6 w-6"),children:c!=null&&c.avatar_url?i.jsx("img",{className:"h-full w-full rounded-full bg-slate-100",src:Ze(c.avatar_url),alt:"",referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:W("text-muted",l==="compact"?"h-4 w-4":"h-5 w-5"),"aria-hidden":!0})}),i.jsx("span",{className:W("pointer-events-none min-w-0 flex-1 truncate font-mono",c?"text-foreground":"text-muted",l==="compact"?"text-xs":"text-sm"),children:u}),i.jsxs("select",{className:"absolute inset-0 h-full w-full cursor-pointer opacity-0 disabled:cursor-not-allowed","aria-label":s,value:e,disabled:n,onChange:d=>r(d.target.value),children:[t.length===0||!e?i.jsx("option",{value:"",children:o}):null,t.map(d=>i.jsxs("option",{value:d.login,children:["@",d.login,(a==null?void 0:a(d))??""]},d.login))]}),i.jsx(jn,{className:W("pointer-events-none shrink-0 text-muted",l==="compact"?"h-3.5 w-3.5":"h-4 w-4"),"aria-hidden":!0})]})}function Xn({urls:e,compact:t=!1}){const n=t?e.slice(0,2):e,r=e.length-n.length;return i.jsxs("div",{className:"flex min-w-0 max-w-full flex-wrap gap-1.5",children:[n.map(s=>i.jsxs("a",{className:W("inline-flex max-w-full items-center gap-1 rounded-md border border-border font-semibold text-primary hover:bg-white hover:underline",t?"h-7 px-2 text-xs":"min-h-7 px-2 py-1 text-xs"),href:Ze(s),"aria-label":s,rel:"noreferrer",target:"_blank",children:[i.jsx(Xt,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),i.jsx("span",{className:"truncate",children:t?px(s):s})]},s)),r>0?i.jsxs("span",{className:"inline-flex h-7 items-center rounded-md border border-border px-2 font-mono text-xs text-muted",children:["+",r]}):null]})}function px(e){try{const t=new URL(e);return t.pathname.replace(/^\//,"")+t.hash}catch{return e}}function $l({scope:e,type:t,confidence:n,status:r,timestamp:s,now:a}){return i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2 text-xs text-muted",children:[i.jsx("span",{className:"truncate font-mono font-semibold text-foreground",children:zl(e)}),i.jsx("span",{className:"rounded-sm border border-border px-1.5 py-0.5 font-mono",children:t}),i.jsxs("span",{className:"rounded-sm border border-border px-1.5 py-0.5 font-mono",children:[Math.round(n*100),"%"]}),i.jsx("span",{className:"rounded-sm border border-border px-1.5 py-0.5 font-mono",children:r}),i.jsx("span",{className:"font-mono",children:i.jsx(Pe,{value:s,relative:!0,now:a})})]})}function mx({user:e,loading:t}){const n=e!=null&&e.login?`@${e.login}`:t?"Loading profile...":"GitHub OAuth",r=e!=null&&e.is_admin?"admin":"read-only",s=e!=null&&e.avatar_url?i.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"}):i.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-slate-700 bg-slate-900",children:i.jsx(Wn,{className:"h-5 w-5","aria-hidden":!0})}),a=e!=null&&e.html_url?i.jsx("a",{className:"truncate font-semibold text-white hover:underline",href:Ze(e.html_url),rel:"noreferrer",target:"_blank",children:n}):i.jsx("div",{className:"truncate font-semibold text-white",children:n});return i.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:[i.jsx(Vo,{className:"hidden h-4 w-4 shrink-0 sm:block","aria-hidden":!0}),i.jsxs("div",{className:"hidden min-w-0 text-right sm:block",children:[a,i.jsxs("div",{className:"text-xs text-slate-400",children:["Signed in · ",r]})]}),s]})}function fx({config:e,loading:t,onEnable:n,onDisable:r}){const[s,a]=A.useState(!1),[o,l]=A.useState(""),c=!!(e!=null&&e.status.enabled),u=typeof navigator<"u"&&typeof window<"u"&&Tr(),d=t||s||!(e!=null&&e.configured)||!u,h=u?e!=null&&e.configured?c?"Disable notifications":"Enable notifications":"Notifications not configured":"Notifications unavailable";return i.jsx("div",{className:"relative",children:i.jsx("button",{className:W("inline-flex h-9 w-9 items-center justify-center rounded-md border text-sm font-semibold",c?"border-emerald-400 bg-emerald-50 text-emerald-700":"border-slate-700 bg-slate-900 text-slate-200",d&&"cursor-not-allowed opacity-60"),type:"button","aria-label":h,title:o||h,disabled:d,onClick:async()=>{a(!0),l("");try{c?await r():await n()}catch(m){l(m instanceof Error?m.message:String(m))}finally{a(!1)}},children:i.jsx(Ho,{className:W("h-4 w-4",s&&"animate-live-pulse"),"aria-hidden":!0})})})}function xx({notification:e,onDismiss:t,onNavigate:n}){if(!e)return null;const r=e.title||"GitHub Agent Bridge",s=e.body||e.summary||"Bridge job finished",a=e.url||e.job_url||(e.job_id?En(e.job_id):"/"),o=a.startsWith("/");return i.jsx("aside",{className:"fixed right-3 top-20 z-50 w-[min(calc(100vw-1.5rem),28rem)] rounded-md border border-emerald-300 bg-white shadow-xl shadow-slate-950/15","aria-live":"assertive","aria-label":"Bridge notification",children:i.jsxs("div",{className:"flex items-start gap-3 p-3",children:[i.jsx("div",{className:"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-emerald-50 text-emerald-700",children:i.jsx(Ho,{className:"h-4 w-4","aria-hidden":!0})}),i.jsxs("div",{className:"min-w-0 flex-1",children:[i.jsxs("div",{className:"flex items-start justify-between gap-2",children:[i.jsx("h2",{className:"min-w-0 break-words text-sm font-semibold text-foreground",children:r}),i.jsx("button",{className:"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted hover:bg-slate-100 hover:text-foreground",type:"button","aria-label":"Dismiss notification",onClick:t,children:i.jsx(Yt,{className:"h-4 w-4","aria-hidden":!0})})]}),i.jsx("p",{className:"mt-1 min-w-0 break-words text-sm text-muted",children:s}),e.detail?i.jsx("p",{className:"mt-1 line-clamp-2 min-w-0 break-words text-xs text-muted",children:e.detail}):null,i.jsxs("button",{className:"mt-3 inline-flex h-8 items-center gap-1.5 rounded-md border border-border px-2.5 text-xs font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:()=>{t(),o?n(a):window.open(Ze(a),"_blank","noopener,noreferrer")},children:[i.jsx(Xt,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Open"]})]})]})})}function gx({count:e,limit:t,loading:n,onRefresh:r}){return i.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:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h2",{className:"text-base font-semibold",children:"Jobs"}),i.jsx("p",{className:"text-xs text-muted",children:n?"Refreshing latest jobs...":`Showing ${e} of the latest ${t} requested jobs`})]}),i.jsx(Ye,{onClick:r,compactOnMobile:!0})]})}function ce({title:e,action:t,children:n,className:r,flushHeader:s=!1}){return i.jsxs("section",{className:W("min-w-0 rounded-lg border border-border bg-panel p-4 shadow-sm",r),children:[i.jsxs("div",{className:W("flex flex-wrap items-center justify-between gap-3",!s&&"mb-4"),children:[i.jsx("h2",{className:"text-sm font-semibold",children:e}),t]}),n]})}function Se({title:e,value:t,icon:n}){return i.jsxs("div",{className:"rounded-lg border border-border bg-panel p-3 shadow-sm md:p-4",children:[i.jsxs("div",{className:"flex items-center justify-between text-muted",children:[i.jsx("span",{className:"text-sm font-medium",children:e}),n]}),i.jsx("strong",{className:"mt-3 block text-2xl leading-none md:mt-4 md:text-3xl",children:t})]})}function bx({filters:e,actorOptions:t,onChange:n}){const[r,s]=A.useState(e);A.useEffect(()=>s(e),[e]);const a=Bf(e),o=oo(e)||oo(r),l=()=>{s(Oi),n(Oi)};return i.jsxs("details",{className:"my-3 rounded-md border border-border bg-slate-50/70",children:[i.jsxs("summary",{className:"grid cursor-pointer list-none grid-cols-[minmax(0,1fr)_auto] items-center gap-3 px-3 py-2 text-sm font-semibold marker:hidden",children:[i.jsxs("span",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsxs("span",{className:"inline-flex shrink-0 items-center gap-2",children:[i.jsx(iu,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Filters"]}),a.length>0?i.jsx("span",{className:"flex min-w-0 flex-wrap items-center gap-1.5","aria-label":"Applied filters",children:a.map(c=>i.jsxs("span",{className:"inline-flex max-w-full items-center gap-1 rounded-full border border-blue-200 bg-blue-50 px-2 py-0.5 text-xs font-semibold text-blue-700",children:[i.jsx("span",{className:"text-blue-700/70",children:c.label}),i.jsx("span",{className:"max-w-40 truncate font-mono",children:c.value.trim()})]},c.key))}):null]}),i.jsxs("span",{className:"inline-flex shrink-0 items-center gap-2",children:[o?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-border bg-white px-2.5 text-xs font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:c=>{c.preventDefault(),c.stopPropagation(),l()},children:[i.jsx(Gn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Clear filters"]}):null,i.jsx(jn,{className:"h-4 w-4 text-muted","aria-hidden":!0})]})]}),i.jsxs("form",{className:"grid gap-3 border-t border-border bg-white p-3 md:grid-cols-3 xl:grid-cols-9",onSubmit:c=>{c.preventDefault(),n(r)},children:[i.jsx(Xe,{label:"Status",children:i.jsxs("select",{className:"control",value:r.status,onChange:c=>s({...r,status:c.target.value}),children:[i.jsx("option",{value:"",children:"All"}),i.jsx("option",{value:"pending",children:"pending"}),i.jsx("option",{value:"running",children:"running"}),i.jsx("option",{value:"blocked",children:"blocked"}),i.jsx("option",{value:"done",children:"done"}),i.jsx("option",{value:"denied",children:"denied"}),i.jsx("option",{value:"waiting_approval",children:"waiting_approval"})]})}),i.jsx(Xe,{label:"Repository",children:i.jsx("input",{className:"control",value:r.repo,placeholder:"owner/repo",onChange:c=>s({...r,repo:c.target.value})})}),i.jsx(Xe,{label:"Thread",children:i.jsx("input",{className:"control",value:r.thread,inputMode:"numeric",placeholder:"issue or PR",onChange:c=>s({...r,thread:c.target.value})})}),i.jsx(Xe,{label:"Action",children:i.jsx("input",{className:"control",value:r.action,placeholder:"reply_comment",onChange:c=>s({...r,action:c.target.value})})}),i.jsx(Xe,{label:"Actor",className:"xl:col-span-2",children:i.jsx(yx,{value:r.actor,options:t,onChange:c=>s({...r,actor:c})})}),i.jsx(Xe,{label:"Intent",children:i.jsxs("select",{className:"control",value:r.intent,onChange:c=>s({...r,intent:c.target.value}),children:[i.jsx("option",{value:"",children:"All"}),i.jsx("option",{value:"review_only",children:"review_only"}),i.jsx("option",{value:"work_allowed",children:"work_allowed"})]})}),i.jsxs("div",{className:"grid grid-cols-2 gap-2 self-end xl:col-span-2",children:[i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-white",type:"button",disabled:!o,onClick:l,children:[i.jsx(Gn,{className:"h-4 w-4","aria-hidden":!0}),"Clear"]}),i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-semibold text-white",type:"submit",children:[i.jsx(lu,{className:"h-4 w-4","aria-hidden":!0}),"Apply"]})]})]})]})}function yx({value:e,options:t,onChange:n}){const[r,s]=A.useState(!1),a=e.trim().replace(/^@/,"").toLowerCase(),o=t.filter(c=>!a||c.login.toLowerCase().includes(a)).slice(0,8),l=t.find(c=>c.login.toLowerCase()===a);return i.jsxs("div",{className:"relative min-w-0",children:[i.jsxs("div",{className:"control flex items-center gap-2 px-2",children:[l?i.jsx("img",{className:"h-5 w-5 shrink-0 rounded-full bg-slate-100",src:Ze(l.avatar_url??""),alt:`${l.login} avatar`,referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:"h-4 w-4 shrink-0 text-muted","aria-hidden":!0}),i.jsx("input",{className:"min-w-0 flex-1 bg-transparent font-mono text-sm outline-none",value:e,placeholder:"@login",onChange:c=>{n(c.target.value),s(!0)},onFocus:()=>s(!0),onBlur:()=>window.setTimeout(()=>s(!1),100)}),e?i.jsx("button",{className:"rounded-sm p-1 text-muted hover:bg-slate-100",type:"button","aria-label":"Clear actor filter",onClick:()=>n(""),children:i.jsx(Yt,{className:"h-3.5 w-3.5","aria-hidden":!0})}):null]}),r&&o.length>0?i.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:o.map(c=>i.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:()=>{n(c.login),s(!1)},children:[c.avatar_url?i.jsx("img",{className:"h-6 w-6 shrink-0 rounded-full bg-slate-100",src:Ze(c.avatar_url),alt:`${c.login} avatar`,referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:"h-5 w-5 shrink-0 text-muted","aria-hidden":!0}),i.jsxs("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-foreground",children:["@",c.login]}),i.jsx("span",{className:"shrink-0 rounded-full bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold text-muted",children:c.job_count})]},c.login))}):null]})}function Xe({label:e,children:t,className:n}){return i.jsxs("label",{className:W("grid min-w-0 gap-1 text-xs font-semibold text-muted",n),children:[e,t]})}function wx({jobs:e,loading:t,loadingMore:n=!1,hasMore:r=!1,onLoadMore:s,onViewJob:a,now:o,user:l,onRetry:c,onDismiss:u,onCancel:d}){const[h,m]=A.useState(null),[p,b]=A.useState(null),[w,v]=A.useState(null),y=A.useRef(!1),S=A.useRef(n),C=!!(l!=null&&l.is_admin&&c),k=!!(l!=null&&l.is_admin&&u);A.useEffect(()=>{S.current&&!n&&(y.current=!1),S.current=n},[n]);const z=A.useCallback(()=>{y.current||(y.current=!0,s==null||s())},[s]),j=A.useCallback(async P=>{if(c){m(P);try{await c(P)}finally{m(null)}}},[c]),q=A.useCallback(async P=>{if(u){b(P);try{await u(P)}finally{b(null)}}},[u]),D=A.useCallback(async(P,_)=>{if(d){v(P);try{await d(P,_)}finally{v(null)}}},[d]);return t&&e.length===0?i.jsx(J,{text:"Loading jobs..."}):e.length===0?i.jsx(J,{text:"No jobs match the current filters."}):i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"grid gap-2 md:hidden",children:[e.map(P=>i.jsx(kx,{job:P,onViewJob:a,now:o,canRetry:C&&qn(P.status),retrying:h===P.id,onRetry:j,canDismiss:k&&qn(P.status),dismissing:p===P.id,onDismiss:q,canCancel:!!(d&&Fi(P,l)),cancelling:w===P.id,onCancel:D},P.id)),i.jsx(jx,{hasMore:r,loading:n,onLoadMore:z})]}),i.jsx(zi,{noun:"jobs",hasMore:r,loading:n,onLoadMore:z,className:"hidden md:block",children:i.jsxs("table",{className:"min-w-[1080px] table-fixed border-collapse text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"sticky top-0 z-10 border-b border-border bg-panel text-left text-xs text-muted",children:[i.jsx("th",{className:"w-[42%] px-3 py-2 font-semibold",children:"Job"}),i.jsx("th",{className:"w-32 px-3 py-2 font-semibold",children:"Status"}),i.jsx("th",{className:"w-40 px-3 py-2 font-semibold",children:"Action"}),i.jsx("th",{className:"w-36 px-3 py-2 font-semibold",children:"Actor"}),i.jsx("th",{className:"w-36 px-3 py-2 font-semibold",children:"Timing"}),i.jsx("th",{className:"w-28 px-3 py-2 font-semibold",children:"Updated"}),i.jsx("th",{className:"w-24 px-3 py-2 text-right font-semibold",children:"Actions"})]})}),i.jsx("tbody",{children:e.map(P=>i.jsx(vx,{job:P,now:o,onViewJob:a,canRetry:C&&qn(P.status),retrying:h===P.id,onRetry:j,canDismiss:k&&qn(P.status),dismissing:p===P.id,onDismiss:q,canCancel:!!(d&&Fi(P,l)),cancelling:w===P.id,onCancel:D},P.id))})]})})]})}function vx({job:e,now:t,onViewJob:n,canRetry:r,retrying:s,onRetry:a,canDismiss:o,dismissing:l,onDismiss:c,canCancel:u,cancelling:d,onCancel:h}){return i.jsxs("tr",{className:"cursor-pointer border-b border-border align-top hover:bg-slate-50",onClick:()=>n(e.id),children:[i.jsx("td",{className:"min-w-0 px-3 py-3",children:i.jsxs("div",{className:"flex min-w-0 items-start gap-2",children:[i.jsxs("span",{className:"mt-0.5 shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),i.jsxs("div",{className:"min-w-0 space-y-1",children:[i.jsx("div",{className:"line-clamp-2 text-sm font-semibold leading-snug text-foreground [overflow-wrap:anywhere]",title:e.subject,children:e.subject}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[i.jsx("span",{className:"min-w-0 max-w-full truncate font-mono",children:e.repo??e.work_key}),i.jsxs("span",{className:"shrink-0",children:["thread ",e.thread??"n/a"]})]})]})]})}),i.jsx("td",{className:"px-3 py-3",children:i.jsx(hs,{status:e.status})}),i.jsxs("td",{className:"px-3 py-3",children:[i.jsx("div",{className:"min-w-0 truncate text-sm text-foreground",title:e.action,children:e.action}),i.jsx("div",{className:"mt-1",children:i.jsx(ds,{intent:e.intent,actionMode:e.action_mode,display:"intent",compact:!0})})]}),i.jsx("td",{className:"px-3 py-3",children:i.jsx(Pn,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})}),i.jsxs("td",{className:"px-3 py-3 text-xs text-muted",children:[i.jsxs("div",{className:"flex items-center justify-between gap-2",children:[i.jsx("span",{children:"wait"}),i.jsx("span",{className:"font-mono text-foreground",children:Ke(us(e,t))})]}),i.jsxs("div",{className:"mt-1 flex items-center justify-between gap-2",children:[i.jsx("span",{children:"run"}),i.jsx("span",{className:"font-mono text-foreground",children:Ke(cs(e,t))})]}),i.jsxs("div",{className:"mt-1 flex items-center justify-between gap-2",children:[i.jsx("span",{children:"tries"}),i.jsx("span",{className:"font-mono text-foreground",children:e.attempts})]})]}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs",children:i.jsx(Pe,{value:e.updated_at,compact:!0,relative:!0,now:t})}),i.jsx("td",{className:"px-3 py-3 text-right",children:i.jsxs("div",{className:"inline-flex items-center gap-1",children:[i.jsx(Hl,{jobId:e.id,canRetry:r,retrying:s,onRetry:a,compact:!0}),i.jsx(Kl,{jobId:e.id,canDismiss:o,dismissing:l,onDismiss:c,compact:!0}),i.jsx(Ql,{jobId:e.id,canCancel:u,cancelling:d,onCancel:h,compact:!0})]})})]})}function jx({hasMore:e,loading:t,onLoadMore:n}){return!e&&!t?null:i.jsxs("button",{className:"inline-flex min-h-10 w-full items-center justify-center gap-2 rounded-md border border-border px-3 py-2 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60 md:hidden",type:"button",disabled:t||!e,onClick:()=>n==null?void 0:n(),children:[i.jsx(jn,{className:"h-4 w-4","aria-hidden":!0}),t?"Loading more jobs...":"Load more jobs"]})}function kx({job:e,onViewJob:t,now:n,canRetry:r,retrying:s,onRetry:a,canDismiss:o,dismissing:l,onDismiss:c,canCancel:u,cancelling:d,onCancel:h}){return i.jsxs("article",{className:"rounded-md border border-border bg-white shadow-[0_1px_0_rgba(15,23,42,0.03)]",children:[i.jsxs("button",{className:"grid w-full gap-2 p-3 text-left hover:bg-slate-50",type:"button",onClick:()=>t(e.id),children:[i.jsxs("div",{className:"flex items-start justify-between gap-2",children:[i.jsxs("div",{className:"min-w-0 space-y-1",children:[i.jsxs("div",{className:"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-2",children:[i.jsxs("span",{className:"shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),i.jsx("span",{className:"truncate font-mono text-sm",children:e.repo??e.work_key})]}),i.jsx("div",{className:"line-clamp-2 text-sm leading-snug text-foreground",children:e.subject}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[i.jsxs("span",{children:["thread ",e.thread??"n/a"," · ",e.action]}),i.jsx(ds,{intent:e.intent,actionMode:e.action_mode,compact:!0,display:"intent"}),i.jsx(Pn,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})]})]}),i.jsx(hs,{status:e.status})]}),i.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[i.jsx(V,{label:"Wait",value:Ke(us(e,n))}),i.jsx(V,{label:"Runtime",value:Ke(cs(e,n))}),i.jsx(V,{label:"Updated",value:i.jsx(Pe,{value:e.updated_at,compact:!0,relative:!0,now:n})})]})]}),r||o||u?i.jsxs("div",{className:"flex flex-wrap gap-2 border-t border-border px-3 py-2",children:[i.jsx(Hl,{jobId:e.id,canRetry:r,retrying:s,onRetry:a}),i.jsx(Kl,{jobId:e.id,canDismiss:o,dismissing:l,onDismiss:c}),i.jsx(Ql,{jobId:e.id,canCancel:u,cancelling:d,onCancel:h})]}):null]})}function Hl({jobId:e,canRetry:t,retrying:n,onRetry:r,compact:s=!1}){if(!t)return null;const a=n?"Retrying...":"Retry";return i.jsxs("button",{className:W("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 disabled:cursor-not-allowed disabled:opacity-60",s?"w-8 px-0":"px-3"),type:"button",disabled:n,"aria-label":`Retry job #${e}`,title:`Retry job #${e}`,onClick:async o=>{o.stopPropagation(),window.confirm(`Retry job #${e}?`)&&await r(e)},children:[i.jsx(Gn,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:W(s&&"sr-only"),children:a})]})}function Kl({jobId:e,canDismiss:t,dismissing:n,onDismiss:r,compact:s=!1}){if(!t)return null;const a=n?"Dismissing...":"Dismiss";return i.jsxs("button",{className:W("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 disabled:cursor-not-allowed disabled:opacity-60",s?"w-8 px-0":"px-3"),type:"button",disabled:n,"aria-label":`Dismiss job #${e}`,title:`Dismiss job #${e}`,onClick:async o=>{o.stopPropagation(),window.confirm(`Dismiss job #${e}?`)&&await r(e)},children:[i.jsx(kn,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:W(s&&"sr-only"),children:a})]})}function Ql({jobId:e,canCancel:t,cancelling:n,onCancel:r,compact:s=!1}){if(!t)return null;const a=n?"Cancelling...":"Cancel";return i.jsxs("button",{className:W("inline-flex h-8 items-center justify-center gap-2 rounded-md border border-red-200 bg-red-50 text-sm font-semibold text-red-700 hover:bg-red-100 disabled:cursor-not-allowed disabled:opacity-60",s?"w-8 px-0":"px-3"),type:"button",disabled:n,"aria-label":`Cancel job #${e}`,title:`Cancel job #${e}`,onClick:async o=>{o.stopPropagation();const l=window.prompt(`Cancel job #${e}? Optional reason:`);l!==null&&await r(e,l)},children:[i.jsx(Yt,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:W(s&&"sr-only"),children:a})]})}function Pn({actor:e,avatarUrl:t,framed:n=!1}){const r=t?i.jsx("img",{className:"h-4 w-4 shrink-0 rounded-full bg-slate-100",src:Ze(t),alt:e?`${e} avatar`:"",referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),s=i.jsxs(i.Fragment,{children:[r,i.jsx("span",{className:"min-w-0 truncate",children:e?`@${e}`:"unknown actor"})]});return n?i.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:s}):i.jsx("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 font-mono text-xs text-muted",children:s})}function Nx(e){return(e==null?void 0:e.model)??"OpenClaw default"}function Sx(e){return(e==null?void 0:e.thinking)??"OpenClaw default"}function Cx(e){return e?e.configured?"configured":e.summary:"n/a"}function _x(e,t){const n=t||(e==="work_allowed"?"fix_allowed":"review_only");return n==="fix_allowed"||!t&&e==="work_allowed"?{mode:n,intentLabel:"work_allowed",title:"Work allowed"}:{mode:n,intentLabel:"review_only",title:"Review only"}}function ds({intent:e,actionMode:t,compact:n=!1,display:r="mode"}){const s=_x(e,t),a=s.intentLabel==="work_allowed"?uu:Qo,o=r==="intent"?s.intentLabel:s.mode;return i.jsxs("span",{className:W("inline-flex min-h-6 max-w-full items-center gap-1.5 rounded-md border px-2 text-xs font-semibold",s.intentLabel==="work_allowed"?"border-blue-200 bg-blue-50 text-blue-700":"border-violet-200 bg-violet-50 text-violet-700",n&&"min-h-5 px-1.5 text-[11px]"),title:`${s.title}: ${s.mode}`,"aria-label":`${s.title}: ${o}`,children:[i.jsx(a,{className:W("h-3.5 w-3.5 shrink-0",n&&"h-3 w-3"),"aria-hidden":!0}),i.jsx("span",{className:"truncate font-mono",children:o})]})}function Ex({job:e,session:t,sessionEvents:n,transcript:r,now:s,compact:a=!1}){var p;const o=En(e.id),l=n??[],c=r??[],u=wf(l),d=vf(c),h=cs(e,s),m=us(e,s);return i.jsxs("div",{className:"grid min-w-0 gap-4",children:[i.jsxs("div",{className:"sticky top-0 z-20 -mx-3 -mt-3 grid gap-2 border-b border-border bg-panel/95 px-3 py-2 shadow-sm backdrop-blur sm:-mx-4 sm:-mt-4 sm:px-4","aria-label":"Sticky job header",children:[i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsx(hs,{status:e.status}),i.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border bg-white px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:o,children:[i.jsx(Nn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.id]}),i.jsx(Pn,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url,framed:!0}),i.jsx("span",{className:"min-w-0 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:e.work_key})]}),i.jsxs("div",{className:"grid min-w-0 gap-2 lg:grid-cols-[minmax(0,1fr)_minmax(280px,auto)] lg:items-start",children:[i.jsx("p",{className:"min-w-0 break-words text-sm text-muted [overflow-wrap:anywhere]",children:e.subject}),i.jsxs("div",{className:"grid min-w-0 gap-1",children:[i.jsx("h3",{className:"text-xs font-semibold text-muted",children:"GitHub links"}),e.github_urls.length>0?i.jsx(Xn,{urls:e.github_urls,compact:!0}):i.jsx("p",{className:"text-xs text-muted",children:"No links recorded."})]})]})]}),i.jsxs("div",{className:W("grid gap-2 text-sm sm:gap-3",a?"grid-cols-1":"grid-cols-3"),children:[i.jsx(V,{label:"Queue wait",value:Ke(m)}),i.jsx(V,{label:e.status==="running"?"Running for":"Runtime",value:Ke(h)}),i.jsx(V,{label:"Coalesced",value:String(e.coalesced_count)})]}),e.queue_state==="serialized_by_work_key"?i.jsxs("p",{className:"rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900",children:["Serialized behind running job #",e.blocked_by_job_id," for this work key."]}):null,i.jsxs("div",{className:W("grid gap-2 text-sm sm:gap-3",a?"grid-cols-1":"grid-cols-3"),children:[i.jsx(V,{label:"Model",value:Nx(e.model_route)}),i.jsx(V,{label:"Reasoning",value:Sx(e.model_route)}),i.jsx(V,{label:"Route",value:Cx(e.model_route)})]}),i.jsx(Px,{job:e,compact:a}),i.jsxs("div",{className:W("grid gap-2 text-sm sm:gap-3",a?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[i.jsx(V,{label:"Created",value:i.jsx(Pe,{value:e.created_at,compact:!0,relative:!0,now:s})}),i.jsx(V,{label:"Started",value:e.started_at?i.jsx(Pe,{value:e.started_at,compact:!0,relative:!0,now:s}):"n/a"}),i.jsx(V,{label:"Updated",value:i.jsx(Pe,{value:e.updated_at,compact:!0,relative:!0,now:s})}),i.jsx(V,{label:"Finished",value:e.finished_at?i.jsx(Pe,{value:e.finished_at,compact:!0,relative:!0,now:s}):"n/a"})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Timeline"}),i.jsx("div",{className:"grid min-w-0 gap-3",children:(e.worklog??[]).length>0?(p=e.worklog)==null?void 0:p.map(b=>i.jsxs("div",{className:"min-w-0 border-l-2 border-primary pl-3",children:[i.jsx("div",{className:"text-sm font-semibold",children:b.phase}),i.jsx("div",{className:"font-mono text-xs text-muted",children:i.jsx(Pe,{value:b.ts,relative:!0,now:s})}),i.jsx("div",{className:"break-words text-sm [overflow-wrap:anywhere]",children:b.summary}),b.detail?i.jsx("div",{className:"mt-1 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:b.detail}):null]},b.id)):i.jsx(J,{text:"No worklog entries."})})]}),i.jsxs("div",{children:[i.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Wo,{className:"h-4 w-4","aria-hidden":!0}),"OpenClaw session"]}),t?i.jsxs("div",{className:"grid gap-3",children:[i.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[i.jsx(V,{label:"Session ID",value:t.id}),i.jsx(V,{label:"Source",value:t.source})]}),i.jsx("p",{className:"break-words text-xs text-muted [overflow-wrap:anywhere]",children:t.detail})]}):i.jsx(J,{text:"Session correlation is loading."})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Agent activity"}),i.jsx("div",{className:"grid max-h-[460px] min-w-0 gap-2 overflow-auto pr-1",children:u.length>0?u.map((b,w)=>i.jsx(Ix,{event:b,defaultOpen:so(b.eventType,e.status==="running",w,u.length),now:s},b.id)):i.jsx(J,{text:e.status==="running"?"Waiting for live agent output...":"No agent activity has been recorded for this session."})})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Session transcript"}),i.jsx("div",{className:"grid max-h-[620px] min-w-0 gap-2 overflow-auto pr-1",children:d.length>0?d.map((b,w)=>i.jsx(Rx,{entry:b,defaultOpen:so(b.kind,e.status==="running",w,d.length),now:s},b.id)):i.jsx(J,{text:e.status==="running"?"Waiting for live transcript entries...":"No OpenClaw transcript entries are available for this session."})})]})]})}function Px({job:e,compact:t=!1}){const n=e.intent_classifier??null,r=(n==null?void 0:n.llm)??{},s=(n==null?void 0:n.parser)??{},a=typeof r.confidence=="number"?`${Math.round(r.confidence*100)}%`:"n/a";return i.jsxs("div",{className:"grid gap-2",children:[i.jsx("h3",{className:"text-sm font-semibold",children:"Action mode"}),i.jsxs("div",{className:W("grid gap-2 text-sm sm:gap-3",t?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[i.jsx(V,{label:"Mode",value:i.jsx(ds,{intent:e.intent,actionMode:e.action_mode})}),i.jsx(V,{label:"Intent",value:e.intent}),i.jsx(V,{label:"Addressed",value:n?co(r.addressed_to_agent):"n/a"}),i.jsx(V,{label:"Write",value:n?r.write_permission??"none":e.intent==="work_allowed"?"allowed":"none"})]}),n?i.jsxs("div",{className:"grid gap-2 rounded-md border border-border bg-panel p-3 text-xs",children:[i.jsxs("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-4",children:[i.jsx(tt,{label:"Classifier",value:n.enabled?"enabled":"disabled"}),i.jsx(tt,{label:"Applied",value:co(r.applied)}),i.jsx(tt,{label:"Confidence",value:a}),i.jsx(tt,{label:"Parser",value:`${s.action??"n/a"} / ${s.work_intent??"n/a"}`})]}),i.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[i.jsx(tt,{label:"LLM",value:`${r.action??"n/a"} / ${r.work_intent??"n/a"}`}),i.jsx(tt,{label:"Scope",value:r.scope||"n/a"})]}),r.main_request?i.jsx(tt,{label:"Main request",value:r.main_request}):null,r.subordinate_reason?i.jsx(tt,{label:"Subordinate reason",value:r.subordinate_reason}):null,r.reason?i.jsx(tt,{label:"Reason",value:r.reason}):null,n.error?i.jsx(tt,{label:"Error",value:n.error,tone:"danger"}):null]}):i.jsx("p",{className:"text-xs text-muted",children:"No intent classifier metadata recorded for this job."})]})}function co(e){return e===!0?"yes":e===!1?"no":"n/a"}function tt({label:e,value:t,tone:n="neutral"}){return i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),i.jsx("div",{className:W("mt-0.5 min-w-0 break-words font-mono text-xs [overflow-wrap:anywhere]",n==="danger"?"text-red-700":"text-foreground"),children:t})]})}function Rx({entry:e,defaultOpen:t,now:n}){return i.jsx(Vl,{badge:e.badge,meta:i.jsx(Pe,{value:e.meta,relative:!0,now:n}),count:e.count,summary:e.summary,defaultOpen:t,children:i.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 Ix({event:e,defaultOpen:t,now:n}){return i.jsx(Vl,{badge:e.badge,meta:i.jsx(Pe,{value:e.meta,relative:!0,now:n}),count:e.count,summary:e.summary,defaultOpen:t,children:e.detail?i.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 Vl({badge:e,meta:t,count:n,summary:r,defaultOpen:s,children:a}){const[o,l]=A.useState(!!s);return i.jsxs("details",{className:"group min-w-0 rounded border border-border bg-slate-50/60",open:o,onToggle:c=>l(c.currentTarget.open),children:[i.jsxs("summary",{className:"grid cursor-pointer list-none gap-1 px-2 py-1.5 marker:hidden hover:bg-white",children:[i.jsxs("div",{className:"grid min-w-0 gap-1 sm:flex sm:items-center sm:justify-between sm:gap-2",children:[i.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[i.jsx(jn,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),i.jsx("span",{className:"truncate font-mono text-[11px] font-semibold text-muted",children:e}),n&&n>1?i.jsx("span",{className:"rounded-sm border border-border px-1 font-mono text-[10px] text-muted",children:n}):null]}),i.jsx("span",{className:"min-w-0 truncate pl-5 font-mono text-[11px] text-muted sm:shrink-0 sm:pl-0",children:t})]}),i.jsx("div",{className:"min-w-0 break-words pl-5 text-xs text-foreground [overflow-wrap:anywhere] sm:truncate",children:r})]}),i.jsx("div",{className:"min-w-0 border-t border-border bg-white px-2 py-2",children:a})]})}function uo({label:e,values:t}){const n=[{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 i.jsx("div",{className:"h-56",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(qr,{data:n,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"name"}),i.jsx(ar,{tickFormatter:Ke}),i.jsx(or,{formatter:r=>[Ke(Number(r)),e]}),i.jsx(Wt,{dataKey:"seconds",fill:"#0969da",radius:[4,4,0,0]})]})})})}function Tx({values:e,loading:t,totalJobs:n}){const r=Object.entries(e??{}).map(([s,a])=>({day:s,count:a}));return t&&r.length===0?i.jsx(J,{text:"Loading job history..."}):r.length===0?i.jsx(J,{text:n>0?"Job history has no valid creation dates.":"No job history available."}):i.jsx("div",{className:"h-56",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(qr,{data:r,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"day",minTickGap:16}),i.jsx(ar,{allowDecimals:!1}),i.jsx(or,{formatter:s=>[Number(s),"jobs"]}),i.jsx(Wt,{dataKey:"count",fill:"#16a34a",radius:[4,4,0,0]})]})})})}function Ax({usage:e,loading:t,totalJobs:n}){const[r,s]=A.useState("day"),a=(e==null?void 0:e[r])??[],o=a.map(u=>({...u,label:Lx(u.bucket,r)})),l=a.reduce((u,d)=>u+d.seconds,0),c=a.reduce((u,d)=>u+(d.runs??d.jobs),0);return t&&o.length===0?i.jsx(J,{text:"Loading runtime usage..."}):o.length===0?i.jsx(J,{text:n>0?"No jobs have recorded runtime yet.":"No job history available."}):i.jsxs("div",{className:"grid gap-3",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted",children:[i.jsx(cu,{className:"h-4 w-4","aria-hidden":!0}),i.jsxs("span",{children:[Er(l)," consumed across ",c," run",c===1?"":"s"]})]}),i.jsx("div",{className:"inline-flex h-8 rounded-md border border-border bg-white p-0.5","aria-label":"Runtime grouping",children:["day","month"].map(u=>i.jsx("button",{className:W("rounded px-2.5 text-xs font-semibold capitalize",r===u?"bg-primary text-white":"text-muted hover:bg-slate-50"),type:"button",onClick:()=>s(u),children:u},u))})]}),i.jsx("div",{className:"h-64",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(qr,{data:o,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"label",minTickGap:16,tick:{fontSize:11}}),i.jsx(ar,{tickFormatter:u=>Er(Number(u))}),i.jsx(Co,{}),i.jsx(or,{formatter:(u,d)=>d==="Work"?[Er(Number(u)),"work"]:d==="Review"?[Er(Number(u)),"review"]:[Number(u),String(d)],labelFormatter:u=>String(u)}),i.jsx(Wt,{dataKey:"work_seconds",name:"Work",stackId:"runtime",fill:"#0969da",isAnimationActive:!1}),i.jsx(Wt,{dataKey:"review_seconds",name:"Review",stackId:"runtime",fill:"#8250df",radius:[4,4,0,0],isAnimationActive:!1})]})})})]})}function Lx(e,t){if(t==="month"){const[a,o]=e.split("-").map(Number);return!a||!o?e:new Intl.DateTimeFormat(void 0,{month:"short",year:"numeric"}).format(new Date(a,o-1,1))}const[n,r,s]=e.split("-").map(Number);return!n||!r||!s?e:new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric"}).format(new Date(n,r-1,s))}function Er(e){const t=Math.max(0,Math.round(e));if(t<60)return`${t}s`;const n=Math.round(t/60);if(n<60)return`${n}m`;const r=Math.floor(n/60),s=n%60;return s===0?`${r}h`:`${r}h ${s}m`}function ho(e){return Object.values(e).reduce((t,n)=>t+n,0)}function Mx({data:e,loading:t}){if(t&&!e)return i.jsx(J,{text:"Loading systemd units..."});if(!e)return i.jsx(J,{text:"No systemd snapshot available."});const n=e.units??[],r=n.filter(o=>o.active_state==="active").length,s=n.filter(o=>o.active_state==="failed"||o.result==="failed").length,a=n.filter(o=>o.kind==="timer").length;return i.jsxs("div",{className:"grid min-w-0 gap-3",children:[e.errors.length>0?i.jsx(we,{tone:"error",text:e.errors[0]}):null,n.length===0?i.jsx(J,{text:"No configured bridge units found."}):i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[i.jsx(Pr,{label:"Units",value:String(n.length)}),i.jsx(Pr,{label:"Active",value:String(r)}),i.jsx(Pr,{label:"Failed",value:String(s),tone:s>0?"bad":"neutral"}),i.jsx(Pr,{label:"Timers",value:String(a)})]}),i.jsxs("div",{className:"overflow-hidden rounded-md border border-border bg-white",children:[i.jsxs("div",{className:"hidden grid-cols-[minmax(0,1.35fr)_90px_120px_90px_minmax(0,1fr)] gap-3 border-b border-border bg-slate-50 px-3 py-2 text-[11px] font-semibold uppercase text-muted md:grid",children:[i.jsx("span",{children:"Unit"}),i.jsx("span",{children:"Status"}),i.jsx("span",{children:"State"}),i.jsx("span",{children:"PID"}),i.jsx("span",{children:"Schedule"})]}),i.jsx("div",{className:"divide-y divide-border",children:n.map(o=>i.jsx(Dx,{unit:o},o.unit))})]})]})]})}function Pr({label:e,value:t,tone:n="neutral"}){return i.jsxs("div",{className:W("min-w-0 rounded-md border bg-white px-3 py-2",n==="bad"?"border-red-200":"border-border"),children:[i.jsx("div",{className:W("font-mono text-lg font-semibold",n==="bad"?"text-red-700":"text-foreground"),children:t}),i.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Dx({unit:e}){const[t,n]=A.useState(!1),r=e.active_state==="active",s=e.active_state==="failed"||e.result==="failed",a=e.next_elapse||e.last_trigger||"n/a";return i.jsxs("details",{className:"group min-w-0",open:t,onToggle:o=>n(o.currentTarget.open),children:[i.jsxs("summary",{className:"grid min-w-0 cursor-pointer list-none grid-cols-2 gap-2 px-3 py-3 text-sm marker:hidden hover:bg-slate-50 md:grid-cols-[minmax(0,1.35fr)_90px_120px_90px_minmax(0,1fr)] md:items-center md:gap-3",children:[i.jsxs("div",{className:"col-span-2 min-w-0 md:col-span-1",children:[i.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[i.jsx(jn,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),i.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:e.unit})]}),i.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-1.5 pl-5 text-[11px] font-semibold uppercase text-muted",children:[i.jsx("span",{children:e.role}),i.jsx("span",{children:e.kind}),i.jsx("span",{children:e.load_state}),i.jsx("span",{children:t?"following log":"expand log"})]})]}),i.jsxs("div",{className:"flex flex-wrap items-center gap-2 md:block",children:[i.jsx("span",{className:"text-[11px] font-semibold uppercase text-muted md:hidden",children:"Status"}),i.jsx("span",{className:W("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",s?"border-red-300 bg-red-50 text-red-700":r?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-slate-50 text-slate-700"),children:e.active_state})]}),i.jsx(po,{label:"State",value:e.sub_state,detail:e.result||"unknown"}),i.jsx(po,{label:"PID",value:e.main_pid?String(e.main_pid):"n/a",detail:Ke(e.uptime_seconds)}),i.jsxs("div",{className:"col-span-2 min-w-0 md:col-span-1",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted md:hidden",children:"Schedule"}),i.jsx("div",{className:"truncate font-mono text-[11px] text-foreground",title:a,children:e.next_elapse?`next ${e.next_elapse}`:a})]})]}),i.jsx("div",{className:"border-t border-border bg-slate-50 px-3 pb-3 pt-2",children:i.jsx(Ox,{unit:e.unit,active:t})})]})}function po({label:e,value:t,detail:n}){return i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted md:hidden",children:e}),i.jsx("div",{className:"truncate font-mono text-[11px] text-foreground",children:t}),n?i.jsx("div",{className:"truncate font-mono text-[11px] text-muted",children:n}):null]})}function Ox({unit:e,active:t}){const[n,r]=A.useState([]),[s,a]=A.useState(""),o=A.useRef(null);return A.useEffect(()=>{if(!t){r([]),a("");return}r([]),a("");const l=new EventSource(`/api/systemd/journal/stream?unit=${encodeURIComponent(e)}`);return l.addEventListener("journal_line",c=>{const u=zr(c);u&&r(d=>[...d.slice(-199),u])}),l.addEventListener("journal_error",c=>{const u=zr(c);a((u==null?void 0:u.error)??"journal stream failed")}),l.onerror=()=>{},()=>l.close()},[t,e]),A.useEffect(()=>{const l=o.current;l&&(l.scrollTop=l.scrollHeight)},[n]),i.jsxs("div",{className:"grid min-w-0 gap-2",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:"Live journal"}),i.jsx("div",{className:"mt-0.5 truncate font-mono text-[11px] text-muted",children:n.length>0?`${n.length} lines streamed`:"waiting for journal output"})]}),i.jsx("div",{className:"font-mono text-[11px] text-muted",children:"journalctl -f"})]}),s?i.jsx(we,{tone:"error",text:s}):null,i.jsx("div",{ref:o,className:"h-72 overflow-auto rounded-md border border-slate-800 bg-slate-950 p-3 font-mono text-xs leading-relaxed text-slate-100",children:n.length>0?n.map((l,c)=>i.jsx("div",{className:"break-words [overflow-wrap:anywhere]",children:l.line},`${l.unit}-${c}`)):i.jsx("div",{className:"text-slate-400",children:"No journal lines received yet."})})]})}function Fx({data:e,loading:t}){var h,m,p,b,w,v;if(t&&!e)return i.jsx(J,{text:"Loading process activity..."});if(!e)return i.jsx(J,{text:"No process snapshot available."});const n=e.executor.children??[],r=n.flatMap(y=>Gl(y)),s=r.reduce((y,S)=>y+S.cpu_ticks,0),a=r.reduce((y,S)=>y+qx(S),0),o=e.executor.service==="active",l=r.slice(0,8).map(y=>({label:`pid ${y.pid}`,ticks:y.cpu_ticks})),c=(e.samples??[]).map(y=>({label:Hn(y.ts),ticks:y.cpu_ticks,io:y.io_bytes,active:y.active_since_last_sample?"active":"quiet"})),u=c.length>0?c:l,d=(h=e.samples)==null?void 0:h[e.samples.length-1];return i.jsxs("div",{className:"grid gap-4",children:[i.jsx("div",{className:"rounded-md border border-slate-200 bg-slate-50 p-3",children:i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i.jsx("span",{className:W("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",o?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-white text-slate-600"),children:o?"active":"idle"}),i.jsxs("span",{className:"font-mono text-xs text-muted",children:["service ",e.executor.service]})]}),i.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?i.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:e.running_jobs.slice(0,4).map(y=>i.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:[i.jsx("span",{className:"h-2 w-2 rounded-full bg-blue-600 animate-live-pulse","aria-hidden":!0}),"#",y.id," ",Ke(y.age_seconds)]},y.id))}):null,d?i.jsxs("p",{className:"mt-1 text-xs text-muted",children:["Last persisted sample ",Hn(d.ts)," · ",d.active_since_last_sample?"activity observed":`quiet ${Ke(d.idle_seconds)}`]}):null,i.jsx("p",{className:"mt-1 text-xs text-muted",children:e.detail})]}),i.jsxs("div",{className:"grid min-w-[190px] grid-cols-3 gap-2 text-center text-xs",children:[i.jsx(ci,{label:"PID",value:e.executor.pid?String(e.executor.pid):"n/a"}),i.jsx(ci,{label:"Children",value:String(r.length)}),i.jsx(ci,{label:"CPU ticks",value:String(s)})]})]})}),i.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[i.jsx(Rr,{label:"Live process",value:((m=e.signals)==null?void 0:m.live_process.state)??(r.length>0?"live":"no_child_process"),detail:`${((p=e.signals)==null?void 0:p.live_process.child_count)??r.length} children`}),i.jsx(Rr,{label:"Process activity",value:((b=e.signals)==null?void 0:b.process_activity.state)??(d!=null&&d.active_since_last_sample?"active":"quiet"),detail:d?`sample ${Hn(d.ts)}`:"no sample"}),i.jsx(Rr,{label:"Semantic progress",value:(w=e.signals)!=null&&w.semantic_progress.length?"recent":"none",detail:mo(e.running_jobs,"semantic_progress")}),i.jsx(Rr,{label:"Visible progress",value:(v=e.signals)!=null&&v.visible_progress.length?"streaming":"none",detail:mo(e.running_jobs,"visible_progress")})]}),e.alerts.length>0?i.jsx(we,{tone:"error",text:e.alerts[0]}):null,i.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[i.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[i.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[i.jsxs("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(ga,{className:"h-4 w-4","aria-hidden":!0}),c.length>0?"CPU history":"CPU ticks"]}),i.jsxs("span",{className:"font-mono text-xs text-muted",children:[Jl(a)," I/O"]})]}),u.length>0?i.jsx("div",{className:"h-40",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(uc,{data:u,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"label",tick:!1}),i.jsx(ar,{allowDecimals:!1,tick:{fontSize:11}}),i.jsx(or,{formatter:y=>[Number(y),"cpu ticks"]}),i.jsx(dc,{type:"monotone",dataKey:"ticks",stroke:"#0f766e",strokeWidth:2,dot:{r:3},activeDot:{r:5},isAnimationActive:!1})]})})}):i.jsx(J,{text:"No executor CPU samples available."})]}),i.jsxs("div",{className:"min-w-0",children:[i.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[i.jsx(ga,{className:"h-4 w-4","aria-hidden":!0}),"Executor children"]}),n.length>0?i.jsx("div",{className:"grid gap-2",children:n.map(y=>i.jsx(Wl,{process:y},y.pid))}):i.jsx(J,{text:"No child process detected for the executor."})]})]})]})}function zx({alerts:e,loading:t,now:n}){if(t&&!e)return i.jsx(J,{text:"Loading monitor alerts..."});const r=e??[];return r.length===0?i.jsx(J,{text:"No active monitor alerts."}):i.jsx("div",{className:"grid gap-2",children:r.slice(0,5).map(s=>i.jsxs("div",{className:"rounded-md border border-red-200 bg-red-50 p-2.5",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-semibold text-red-700",children:[i.jsx(Br,{className:"h-3.5 w-3.5","aria-hidden":!0}),i.jsx("span",{children:s.severity}),i.jsx("span",{className:"font-normal text-red-600",children:Dl(s.last_seen,n)}),s.observations>1?i.jsxs("span",{className:"rounded-full border border-red-200 bg-white px-1.5",children:[s.observations,"x"]}):null]}),i.jsx("p",{className:"mt-1 break-words text-sm font-medium text-red-950 [overflow-wrap:anywhere]",children:s.message})]},s.fingerprint))})}function Wl({process:e}){var r,s;const t=((r=e.io_bytes)==null?void 0:r.read_bytes)??0,n=((s=e.io_bytes)==null?void 0:s.write_bytes)??0;return i.jsxs("div",{className:"rounded-md border border-border bg-white p-2.5",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[i.jsxs("span",{className:"font-mono",children:["pid ",e.pid]}),i.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["state ",e.state]}),i.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["cpu ",e.cpu_ticks]}),i.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["I/O ",Jl(t+n)]})]}),i.jsx("div",{className:"mt-2 break-words font-mono text-xs text-muted",children:e.cmd||"unknown command"}),e.children&&e.children.length>0?i.jsx("div",{className:"mt-3 border-l-2 border-border pl-3",children:e.children.map(a=>i.jsx(Wl,{process:a},a.pid))}):null]})}function ci({label:e,value:t}){return i.jsxs("div",{className:"rounded-md border border-border bg-white px-2 py-2",children:[i.jsx("div",{className:"font-mono text-sm font-semibold text-foreground",children:t}),i.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Rr({label:e,value:t,detail:n}){return i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-2.5",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),i.jsx("div",{className:"mt-1 truncate text-sm font-semibold text-foreground",children:t}),i.jsx("div",{className:"mt-1 truncate font-mono text-[11px] text-muted",children:n})]})}function mo(e,t){const n=e.find(s=>s[t]),r=n==null?void 0:n[t];return!n||!r?"no running heartbeat":`#${n.id} ${r.phase} ${Ke(r.age_seconds??null)}`}function Gl(e){return[e,...(e.children??[]).flatMap(t=>Gl(t))]}function qx(e){var t,n;return(((t=e.io_bytes)==null?void 0:t.read_bytes)??0)+(((n=e.io_bytes)==null?void 0:n.write_bytes)??0)}function Jl(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function V({label:e,value:t}){return i.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[i.jsx("div",{className:"text-xs font-semibold text-muted",children:e}),i.jsx("div",{className:"mt-1 min-w-0 break-words text-sm [overflow-wrap:anywhere]",children:t})]})}function hs({status:e}){const t=jf(e),n=e==="running"||e==="pending";return i.jsxs("span",{className:W("inline-flex min-h-6 items-center gap-1.5 rounded-full border px-2 text-xs font-semibold",t.badge),children:[i.jsx("span",{className:W("h-2.5 w-2.5 rounded-full",t.dot,n&&"animate-live-pulse"),"aria-hidden":!0}),e]})}function J({text:e}){return i.jsx("div",{className:"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted",children:e})}function we({tone:e,text:t}){return i.jsx("div",{className:W("rounded-md border p-3 text-sm",e==="error"&&"border-red-300 bg-red-50 text-red-700",e==="warning"&&"border-amber-300 bg-amber-50 text-amber-800"),children:t})}function Ye({onClick:e,compactOnMobile:t=!1}){return i.jsxs("button",{className:W("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:[i.jsx(cr,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:W(t&&"hidden sm:inline"),children:"Refresh"})]})}const fo=document.getElementById("root");fo&&xc.createRoot(fo).render(i.jsx(A.StrictMode,{children:i.jsx(Hc,{client:df,children:i.jsx(Uf,{})})})); diff --git a/src/github_agent_bridge/dashboard_static/assets/index-BDe9F9HC.css b/src/github_agent_bridge/dashboard_static/assets/index-BDe9F9HC.css deleted file mode 100644 index 3af1230..0000000 --- a/src/github_agent_bridge/dashboard_static/assets/index-BDe9F9HC.css +++ /dev/null @@ -1 +0,0 @@ -*,: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}:root{color-scheme:light;--color-border: 214 20% 88%;--color-background: 210 20% 98%;--color-foreground: 216 28% 14%;--color-muted: 215 16% 47%;--color-panel: 0 0% 100%;--color-primary: 212 92% 42%}@media(prefers-color-scheme:dark){:root{color-scheme:dark;--color-border: 217 24% 25%;--color-background: 222 33% 8%;--color-foreground: 214 30% 92%;--color-muted: 215 18% 68%;--color-panel: 222 31% 13%;--color-primary: 212 92% 58%}}*{box-sizing:border-box}body{margin:0;min-width:320px;overflow-x:clip;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0}#root{overflow-x:clip}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.animate-live-pulse{animation:live-pulse 1.25s ease-in-out infinite}.control{height:36px;width:100%;border-radius:6px;border:1px solid hsl(var(--color-border));background:hsl(var(--color-panel));padding:0 10px;color:hsl(var(--color-foreground));font:inherit}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-0{left:0}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-20{top:5rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mt-3{margin-top:-.75rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.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}.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{height:.75rem}.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-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-40{max-height:10rem}.max-h-56{max-height:14rem}.max-h-64{max-height:16rem}.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-10{min-height:2.5rem}.min-h-5{min-height:1.25rem}.min-h-6{min-height:1.5rem}.min-h-7{min-height:1.75rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[42\%\]{width:42%}.w-\[min\(calc\(100vw-1\.5rem\)\,28rem\)\]{width:min(calc(100vw - 1.5rem),28rem)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-5{min-width:1.25rem}.min-w-\[1080px\]{min-width:1080px}.min-w-\[180px\]{min-width:180px}.min-w-\[190px\]{min-width:190px}.min-w-\[720px\]{min-width:720px}.min-w-\[920px\]{min-width:920px}.min-w-\[980px\]{min-width:980px}.min-w-full{min-width:100%}.max-w-40{max-width:10rem}.max-w-\[1440px\]{max-width:1440px}.max-w-\[14rem\]{max-width:14rem}.max-w-full{max-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.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\,1\.35fr\)_90px_120px_90px_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1.35fr) 90px 120px 90px minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--color-border))}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x: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-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.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{border-color:hsl(var(--color-border))}.border-border\/70{border-color:hsl(var(--color-border) / .7)}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-emerald-400{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1))}.border-primary{border-color:hsl(var(--color-primary))}.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))}.border-violet-200{--tw-border-opacity: 1;border-color:rgb(221 214 254 / var(--tw-border-opacity, 1))}.border-white\/40{border-color:#fff6}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-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-amber-800{--tw-bg-opacity: 1;background-color:rgb(146 64 14 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--color-background))}.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-emerald-950{--tw-bg-opacity: 1;background-color:rgb(2 44 34 / var(--tw-bg-opacity, 1))}.bg-panel{background-color:hsl(var(--color-panel))}.bg-panel\/95{background-color:hsl(var(--color-panel) / .95)}.bg-primary{background-color:hsl(var(--color-primary))}.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-violet-50{--tw-bg-opacity: 1;background-color:rgb(245 243 255 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/15{background-color:#ffffff26}.bg-white\/70{background-color:#ffffffb3}.bg-white\/80{background-color:#fffc}.p-0\.5{padding:.125rem}.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-2\.5{padding-left:.625rem;padding-right:.625rem}.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{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-3{padding-bottom:.75rem}.pl-0\.5{padding-left:.125rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-5{padding-left:1.25rem}.pr-1{padding-right:.25rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.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-\[0\.85em\]{font-size:.85em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.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}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-amber-950{--tw-text-opacity: 1;color:rgb(69 26 3 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-700\/70{color:#1d4ed8b3}.text-emerald-50{--tw-text-opacity: 1;color:rgb(236 253 245 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-emerald-800{--tw-text-opacity: 1;color:rgb(6 95 70 / var(--tw-text-opacity, 1))}.text-emerald-900{--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.text-emerald-950{--tw-text-opacity: 1;color:rgb(2 44 34 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--color-foreground))}.text-muted{color:hsl(var(--color-muted))}.text-primary{color:hsl(var(--color-primary))}.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-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px 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-\[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)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px 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-slate-950\/15{--tw-shadow-color: rgb(2 6 23 / .15);--tw-shadow: var(--tw-shadow-colored)}.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)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@media(prefers-color-scheme:dark){.bg-white,.bg-white\/70,.bg-white\/80,.hover\:bg-white:hover{background-color:hsl(var(--color-panel))}.bg-slate-50,.bg-slate-50\/60,.bg-slate-50\/70,.bg-slate-100,.hover\:bg-slate-50:hover,.hover\:bg-slate-100:hover{background-color:#1f2637}.bg-blue-50{background-color:#152847}.bg-amber-50,.bg-amber-100,.hover\:bg-amber-100:hover{background-color:#46310b}.bg-red-50,.hover\:bg-red-50:hover{background-color:#441818}.bg-emerald-50,.hover\:bg-emerald-100:hover{background-color:#163b2b}.border-slate-200,.border-slate-300,.border-slate-700,.border-slate-800{border-color:hsl(var(--color-border))}.border-amber-200,.border-amber-300{border-color:#956b23}.border-blue-200,.border-blue-300{border-color:#2757a5}.border-red-200,.border-red-300{border-color:#a72f2f}.border-emerald-300{border-color:#30976a}.text-slate-600,.text-slate-700,.text-slate-800,.text-slate-900,.hover\:text-slate-900:hover{color:hsl(var(--color-foreground))}.text-slate-300,.text-slate-400,.text-slate-500,.hover\:text-slate-500:hover{color:hsl(var(--color-muted))}.text-blue-700{color:#92c2fc}.text-amber-700,.text-amber-800,.text-amber-900,.text-amber-950{color:#fde7af}.text-red-600,.text-red-700,.text-red-950{color:#fbacac}.text-emerald-700,.text-emerald-800,.text-emerald-900,.text-emerald-950{color:#a3f5cd}}.\[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}.first\:mt-0:first-child{margin-top:0}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:border-primary:focus-within{border-color:hsl(var(--color-primary))}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-primary:focus-within{--tw-ring-color: hsl(var(--color-primary))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-900:hover{--tw-bg-opacity: 1;background-color:rgb(120 53 15 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-100:hover{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.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\:text-foreground:hover{color:hsl(var(--color-foreground))}.hover\:underline:hover{text-decoration-line:underline}@media(prefers-color-scheme:dark){.hover\:bg-white:hover{background-color:hsl(var(--color-panel))}.hover\:bg-slate-50:hover,.hover\:bg-slate-100:hover{background-color:#1f2637}.hover\:bg-amber-100:hover{background-color:#46310b}.hover\:bg-red-50:hover{background-color:#441818}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:hover\:bg-white:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media(prefers-color-scheme:dark){.disabled\:hover\:bg-white:hover:disabled{background-color:hsl(var(--color-panel))}}.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\:-mx-4{margin-left:-1rem;margin-right:-1rem}.sm\:-mt-4{margin-top:-1rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:w-auto{width:auto}.sm\:flex-none{flex:none}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-1\.5{gap:.375rem}.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}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media(min-width:768px){.md\:col-span-1{grid-column:span 1 / span 1}.md\:mt-4{margin-top:1rem}.md\:block{display:block}.md\:grid{display:grid}.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\:grid-cols-\[minmax\(0\,1\.35fr\)_90px_120px_90px_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1.35fr) 90px 120px 90px minmax(0,1fr)}.md\:grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.md\:grid-cols-\[minmax\(0\,1fr\)_220px\]{grid-template-columns:minmax(0,1fr) 220px}.md\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.md\:grid-cols-\[minmax\(0\,1fr\)_minmax\(12rem\,16rem\)_auto\]{grid-template-columns:minmax(0,1fr) minmax(12rem,16rem) auto}.md\:items-center{align-items:center}.md\:gap-3{gap:.75rem}.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\:min-w-\[420px\]{min-width:420px}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,0\.9fr\)_minmax\(0\,1\.1fr\)\]{grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(280px\,auto\)\]{grid-template-columns:minmax(0,1fr) minmax(280px,auto)}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}}@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-9{grid-template-columns:repeat(9,minmax(0,1fr))}}.\[\&\>span\]\:truncate>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0} diff --git a/src/github_agent_bridge/dashboard_static/assets/index-CPK-aQfA.css b/src/github_agent_bridge/dashboard_static/assets/index-CPK-aQfA.css new file mode 100644 index 0000000..0976684 --- /dev/null +++ b/src/github_agent_bridge/dashboard_static/assets/index-CPK-aQfA.css @@ -0,0 +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}:root{color-scheme:light;--color-border: 214 20% 88%;--color-background: 210 20% 98%;--color-foreground: 216 28% 14%;--color-muted: 215 16% 47%;--color-panel: 0 0% 100%;--color-primary: 212 92% 42%}@media(prefers-color-scheme:dark){:root{color-scheme:dark;--color-border: 217 24% 25%;--color-background: 222 33% 8%;--color-foreground: 214 30% 92%;--color-muted: 215 18% 68%;--color-panel: 222 31% 13%;--color-primary: 212 92% 58%}}*{box-sizing:border-box}body{margin:0;min-width:320px;overflow-x:clip;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0}#root{overflow-x:clip}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.animate-live-pulse{animation:live-pulse 1.25s ease-in-out infinite}.control{height:36px;width:100%;border-radius:6px;border:1px solid hsl(var(--color-border));background:hsl(var(--color-panel));padding:0 10px;color:hsl(var(--color-foreground));font:inherit}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-0{left:0}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-20{top:5rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mt-3{margin-top:-.75rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.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}.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{height:.75rem}.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-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-40{max-height:10rem}.max-h-56{max-height:14rem}.max-h-64{max-height:16rem}.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-10{min-height:2.5rem}.min-h-5{min-height:1.25rem}.min-h-6{min-height:1.5rem}.min-h-7{min-height:1.75rem}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[42\%\]{width:42%}.w-\[min\(calc\(100vw-1\.5rem\)\,28rem\)\]{width:min(calc(100vw - 1.5rem),28rem)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-5{min-width:1.25rem}.min-w-\[1080px\]{min-width:1080px}.min-w-\[180px\]{min-width:180px}.min-w-\[190px\]{min-width:190px}.min-w-\[720px\]{min-width:720px}.min-w-\[920px\]{min-width:920px}.min-w-\[980px\]{min-width:980px}.min-w-full{min-width:100%}.max-w-40{max-width:10rem}.max-w-\[1440px\]{max-width:1440px}.max-w-\[14rem\]{max-width:14rem}.max-w-full{max-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.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\,1\.35fr\)_90px_120px_90px_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1.35fr) 90px 120px 90px minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--color-border))}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x: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-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.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{border-color:hsl(var(--color-border))}.border-border\/70{border-color:hsl(var(--color-border) / .7)}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-emerald-400{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1))}.border-primary{border-color:hsl(var(--color-primary))}.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))}.border-violet-200{--tw-border-opacity: 1;border-color:rgb(221 214 254 / var(--tw-border-opacity, 1))}.border-white\/40{border-color:#fff6}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-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-amber-800{--tw-bg-opacity: 1;background-color:rgb(146 64 14 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--color-background))}.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-emerald-950{--tw-bg-opacity: 1;background-color:rgb(2 44 34 / var(--tw-bg-opacity, 1))}.bg-panel{background-color:hsl(var(--color-panel))}.bg-panel\/95{background-color:hsl(var(--color-panel) / .95)}.bg-primary{background-color:hsl(var(--color-primary))}.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-violet-50{--tw-bg-opacity: 1;background-color:rgb(245 243 255 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/15{background-color:#ffffff26}.bg-white\/70{background-color:#ffffffb3}.bg-white\/80{background-color:#fffc}.p-0\.5{padding:.125rem}.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-2\.5{padding-left:.625rem;padding-right:.625rem}.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{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-3{padding-bottom:.75rem}.pl-0\.5{padding-left:.125rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-5{padding-left:1.25rem}.pr-1{padding-right:.25rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.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-\[0\.85em\]{font-size:.85em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.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}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-amber-950{--tw-text-opacity: 1;color:rgb(69 26 3 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-700\/70{color:#1d4ed8b3}.text-emerald-50{--tw-text-opacity: 1;color:rgb(236 253 245 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-emerald-800{--tw-text-opacity: 1;color:rgb(6 95 70 / var(--tw-text-opacity, 1))}.text-emerald-900{--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.text-emerald-950{--tw-text-opacity: 1;color:rgb(2 44 34 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--color-foreground))}.text-muted{color:hsl(var(--color-muted))}.text-primary{color:hsl(var(--color-primary))}.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-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px 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-\[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)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px 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-slate-950\/15{--tw-shadow-color: rgb(2 6 23 / .15);--tw-shadow: var(--tw-shadow-colored)}.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)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@media(prefers-color-scheme:dark){.bg-white,.bg-white\/70,.bg-white\/80,.hover\:bg-white:hover{background-color:hsl(var(--color-panel))}.bg-slate-50,.bg-slate-50\/60,.bg-slate-50\/70,.bg-slate-100,.hover\:bg-slate-50:hover,.hover\:bg-slate-100:hover{background-color:#1f2637}.bg-blue-50{background-color:#152847}.bg-amber-50,.bg-amber-100,.hover\:bg-amber-100:hover{background-color:#46310b}.bg-red-50,.hover\:bg-red-50:hover{background-color:#441818}.bg-emerald-50,.hover\:bg-emerald-100:hover{background-color:#163b2b}.border-slate-200,.border-slate-300,.border-slate-700,.border-slate-800{border-color:hsl(var(--color-border))}.border-amber-200,.border-amber-300{border-color:#956b23}.border-blue-200,.border-blue-300{border-color:#2757a5}.border-red-200,.border-red-300{border-color:#a72f2f}.border-emerald-300{border-color:#30976a}.text-slate-600,.text-slate-700,.text-slate-800,.text-slate-900,.hover\:text-slate-900:hover{color:hsl(var(--color-foreground))}.text-slate-300,.text-slate-400,.text-slate-500,.hover\:text-slate-500:hover{color:hsl(var(--color-muted))}.text-blue-700{color:#92c2fc}.text-amber-700,.text-amber-800,.text-amber-900,.text-amber-950{color:#fde7af}.text-red-600,.text-red-700,.text-red-950{color:#fbacac}.text-emerald-700,.text-emerald-800,.text-emerald-900,.text-emerald-950{color:#a3f5cd}}.\[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}.first\:mt-0:first-child{margin-top:0}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:border-primary:focus-within{border-color:hsl(var(--color-primary))}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-primary:focus-within{--tw-ring-color: hsl(var(--color-primary))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-900:hover{--tw-bg-opacity: 1;background-color:rgb(120 53 15 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-100:hover{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.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\:text-foreground:hover{color:hsl(var(--color-foreground))}.hover\:underline:hover{text-decoration-line:underline}@media(prefers-color-scheme:dark){.hover\:bg-white:hover{background-color:hsl(var(--color-panel))}.hover\:bg-slate-50:hover,.hover\:bg-slate-100:hover{background-color:#1f2637}.hover\:bg-amber-100:hover{background-color:#46310b}.hover\:bg-red-50:hover{background-color:#441818}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:hover\:bg-white:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media(prefers-color-scheme:dark){.disabled\:hover\:bg-white:hover:disabled{background-color:hsl(var(--color-panel))}}.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\:-mx-4{margin-left:-1rem;margin-right:-1rem}.sm\:-mt-4{margin-top:-1rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:w-auto{width:auto}.sm\:flex-none{flex:none}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-1\.5{gap:.375rem}.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}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media(min-width:768px){.md\:col-span-1{grid-column:span 1 / span 1}.md\:mt-4{margin-top:1rem}.md\:block{display:block}.md\:grid{display:grid}.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\:grid-cols-\[minmax\(0\,1\.35fr\)_90px_120px_90px_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1.35fr) 90px 120px 90px minmax(0,1fr)}.md\:grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.md\:grid-cols-\[minmax\(0\,1fr\)_220px\]{grid-template-columns:minmax(0,1fr) 220px}.md\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.md\:grid-cols-\[minmax\(0\,1fr\)_minmax\(12rem\,16rem\)_auto\]{grid-template-columns:minmax(0,1fr) minmax(12rem,16rem) auto}.md\:items-center{align-items:center}.md\:gap-3{gap:.75rem}.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\:min-w-\[420px\]{min-width:420px}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,0\.9fr\)_minmax\(0\,1\.1fr\)\]{grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(280px\,auto\)\]{grid-template-columns:minmax(0,1fr) minmax(280px,auto)}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}}@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-9{grid-template-columns:repeat(9,minmax(0,1fr))}}.\[\&\>span\]\:truncate>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0} diff --git a/src/github_agent_bridge/dashboard_static/assets/index-DzCW97RR.js b/src/github_agent_bridge/dashboard_static/assets/index-DzCW97RR.js deleted file mode 100644 index 5273251..0000000 --- a/src/github_agent_bridge/dashboard_static/assets/index-DzCW97RR.js +++ /dev/null @@ -1,187 +0,0 @@ -var ea=e=>{throw TypeError(e)};var $r=(e,t,n)=>t.has(e)||ea("Cannot "+n);var g=(e,t,n)=>($r(e,t,"read from private field"),n?n.call(e):t.get(e)),U=(e,t,n)=>t.has(e)?ea("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),D=(e,t,n,r)=>($r(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),Y=(e,t,n)=>($r(e,t,"access private method"),n);var yr=(e,t,n,r)=>({set _(s){D(e,t,s,n)},get _(){return g(e,t,r)}});import{f as iu,h as su,g as zi,r as ke,R as T,d as rr,a as Fr,C as ir,X as sr,Y as ar,T as or,L as ko,B as Vt,e as au,c as ou,b as lu}from"./charts-SqBiqy9C.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const a of s)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(s){const a={};return s.integrity&&(a.integrity=s.integrity),s.referrerPolicy&&(a.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?a.credentials="include":s.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(s){if(s.ep)return;s.ep=!0;const a=n(s);fetch(s.href,a)}})();var Hr={exports:{}},Rn={};/** - * @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 ta;function uu(){if(ta)return Rn;ta=1;var e=iu(),t=Symbol.for("react.element"),n=Symbol.for("react.fragment"),r=Object.prototype.hasOwnProperty,s=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function o(l,u,c){var d,h={},m=null,p=null;c!==void 0&&(m=""+c),u.key!==void 0&&(m=""+u.key),u.ref!==void 0&&(p=u.ref);for(d in u)r.call(u,d)&&!a.hasOwnProperty(d)&&(h[d]=u[d]);if(l&&l.defaultProps)for(d in u=l.defaultProps,u)h[d]===void 0&&(h[d]=u[d]);return{$$typeof:t,type:l,key:m,ref:p,props:h,_owner:s.current}}return Rn.Fragment=n,Rn.jsx=o,Rn.jsxs=o,Rn}var na;function cu(){return na||(na=1,Hr.exports=uu()),Hr.exports}var i=cu(),wr={},ra;function du(){if(ra)return wr;ra=1;var e=su();return wr.createRoot=e.createRoot,wr.hydrateRoot=e.hydrateRoot,wr}var hu=du();const pu=zi(hu);var lr=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(){}},Ft,kt,sn,po,mu=(po=class extends lr{constructor(){super();U(this,Ft);U(this,kt);U(this,sn);D(this,sn,t=>{if(typeof window<"u"&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){g(this,kt)||this.setEventListener(g(this,sn))}onUnsubscribe(){var t;this.hasListeners()||((t=g(this,kt))==null||t.call(this),D(this,kt,void 0))}setEventListener(t){var n;D(this,sn,t),(n=g(this,kt))==null||n.call(this),D(this,kt,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){g(this,Ft)!==t&&(D(this,Ft,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(n=>{n(t)})}isFocused(){var t;return typeof g(this,Ft)=="boolean"?g(this,Ft):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Ft=new WeakMap,kt=new WeakMap,sn=new WeakMap,po),qi=new mu,fu={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},Nt,Fi,mo,xu=(mo=class{constructor(){U(this,Nt,fu);U(this,Fi,!1)}setTimeoutProvider(e){D(this,Nt,e)}setTimeout(e,t){return g(this,Nt).setTimeout(e,t)}clearTimeout(e){g(this,Nt).clearTimeout(e)}setInterval(e,t){return g(this,Nt).setInterval(e,t)}clearInterval(e){g(this,Nt).clearInterval(e)}},Nt=new WeakMap,Fi=new WeakMap,mo),Dt=new xu;function gu(e){setTimeout(e,0)}var bu=typeof window>"u"||"Deno"in globalThis;function Le(){}function yu(e,t){return typeof e=="function"?e(t):e}function li(e){return typeof e=="number"&&e>=0&&e!==1/0}function No(e,t){return Math.max(e+(t||0)-Date.now(),0)}function It(e,t){return typeof e=="function"?e(t):e}function Be(e,t){return typeof e=="function"?e(t):e}function ia(e,t){const{type:n="all",exact:r,fetchStatus:s,predicate:a,queryKey:o,stale:l}=e;if(o){if(r){if(t.queryHash!==Bi(o,t.options))return!1}else if(!Qn(t.queryKey,o))return!1}if(n!=="all"){const u=t.isActive();if(n==="active"&&!u||n==="inactive"&&u)return!1}return!(typeof l=="boolean"&&t.isStale()!==l||s&&s!==t.state.fetchStatus||a&&!a(t))}function sa(e,t){const{exact:n,status:r,predicate:s,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(Kn(t.options.mutationKey)!==Kn(a))return!1}else if(!Qn(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||s&&!s(t))}function Bi(e,t){return((t==null?void 0:t.queryKeyHashFn)||Kn)(e)}function Kn(e){return JSON.stringify(e,(t,n)=>ci(n)?Object.keys(n).sort().reduce((r,s)=>(r[s]=n[s],r),{}):n)}function Qn(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(n=>Qn(e[n],t[n])):!1}var wu=Object.prototype.hasOwnProperty;function So(e,t,n=0){if(e===t)return e;if(n>500)return t;const r=aa(e)&&aa(t);if(!r&&!(ci(e)&&ci(t)))return t;const a=(r?e:Object.keys(e)).length,o=r?t:Object.keys(t),l=o.length,u=r?new Array(l):{};let c=0;for(let d=0;d{Dt.setTimeout(t,e)})}function di(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?So(e,t):t}function ju(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function ku(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var Ui=Symbol();function Co(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===Ui?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function _o(e,t){return typeof e=="function"?e(...t):!!e}function Nu(e,t,n){let r=!1,s;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(s??(s=t()),r||(r=!0,s.aborted?n():s.addEventListener("abort",n,{once:!0})),s)}),e}var Vn=(()=>{let e=()=>bu;return{isServer(){return e()},setIsServer(t){e=t}}})();function hi(){let e,t;const n=new Promise((s,a)=>{e=s,t=a});n.status="pending",n.catch(()=>{});function r(s){Object.assign(n,s),delete n.resolve,delete n.reject}return n.resolve=s=>{r({status:"fulfilled",value:s}),e(s)},n.reject=s=>{r({status:"rejected",reason:s}),t(s)},n}var Su=gu;function Cu(){let e=[],t=0,n=l=>{l()},r=l=>{l()},s=Su;const a=l=>{t?e.push(l):s(()=>{n(l)})},o=()=>{const l=e;e=[],l.length&&s(()=>{r(()=>{l.forEach(u=>{n(u)})})})};return{batch:l=>{let u;t++;try{u=l()}finally{t--,t||o()}return u},batchCalls:l=>(...u)=>{a(()=>{l(...u)})},schedule:a,setNotifyFunction:l=>{n=l},setBatchNotifyFunction:l=>{r=l},setScheduler:l=>{s=l}}}var je=Cu(),an,St,on,fo,_u=(fo=class extends lr{constructor(){super();U(this,an,!0);U(this,St);U(this,on);D(this,on,t=>{if(typeof window<"u"&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){g(this,St)||this.setEventListener(g(this,on))}onUnsubscribe(){var t;this.hasListeners()||((t=g(this,St))==null||t.call(this),D(this,St,void 0))}setEventListener(t){var n;D(this,on,t),(n=g(this,St))==null||n.call(this),D(this,St,t(this.setOnline.bind(this)))}setOnline(t){g(this,an)!==t&&(D(this,an,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return g(this,an)}},an=new WeakMap,St=new WeakMap,on=new WeakMap,fo),Ir=new _u;function Eu(e){return Math.min(1e3*2**e,3e4)}function Eo(e){return(e??"online")==="online"?Ir.isOnline():!0}var pi=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function Po(e){let t=!1,n=0,r;const s=hi(),a=()=>s.status!=="pending",o=w=>{var j;if(!a()){const b=new pi(w);m(b),(j=e.onCancel)==null||j.call(e,b)}},l=()=>{t=!0},u=()=>{t=!1},c=()=>qi.isFocused()&&(e.networkMode==="always"||Ir.isOnline())&&e.canRun(),d=()=>Eo(e.networkMode)&&e.canRun(),h=w=>{a()||(r==null||r(),s.resolve(w))},m=w=>{a()||(r==null||r(),s.reject(w))},p=()=>new Promise(w=>{var j;r=b=>{(a()||c())&&w(b)},(j=e.onPause)==null||j.call(e)}).then(()=>{var w;r=void 0,a()||(w=e.onContinue)==null||w.call(e)}),y=()=>{if(a())return;let w;const j=n===0?e.initialPromise:void 0;try{w=j??e.fn()}catch(b){w=Promise.reject(b)}Promise.resolve(w).then(h).catch(b=>{var k;if(a())return;const S=e.retry??(Vn.isServer()?0:3),_=e.retryDelay??Eu,N=typeof _=="function"?_(n,b):_,q=S===!0||typeof S=="number"&&nc()?void 0:p()).then(()=>{t?m(b):y()})})};return{promise:s,status:()=>s.status,cancel:o,continue:()=>(r==null||r(),s),cancelRetry:l,continueRetry:u,canStart:d,start:()=>(d()?y():p().then(y),s)}}var zt,xo,Ro=(xo=class{constructor(){U(this,zt)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),li(this.gcTime)&&D(this,zt,Dt.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Vn.isServer()?1/0:300*1e3))}clearGcTimeout(){g(this,zt)!==void 0&&(Dt.clearTimeout(g(this,zt)),D(this,zt,void 0))}},zt=new WeakMap,xo);function Pu(e){return{onFetch:(t,n)=>{var d,h,m,p,y;const r=t.options,s=(m=(h=(d=t.fetchOptions)==null?void 0:d.meta)==null?void 0:h.fetchMore)==null?void 0:m.direction,a=((p=t.state.data)==null?void 0:p.pages)||[],o=((y=t.state.data)==null?void 0:y.pageParams)||[];let l={pages:[],pageParams:[]},u=0;const c=async()=>{let w=!1;const j=_=>{Nu(_,()=>t.signal,()=>w=!0)},b=Co(t.options,t.fetchOptions),S=async(_,N,q)=>{if(w)return Promise.reject(t.signal.reason);if(N==null&&_.pages.length)return Promise.resolve(_);const B=(()=>{const L={client:t.client,queryKey:t.queryKey,pageParam:N,direction:q?"backward":"forward",meta:t.options.meta};return j(L),L})(),M=await b(B),{maxPages:v}=t.options,F=q?ku:ju;return{pages:F(_.pages,M,v),pageParams:F(_.pageParams,N,v)}};if(s&&a.length){const _=s==="backward",N=_?Io:mi,q={pages:a,pageParams:o},k=N(r,q);l=await S(q,k,_)}else{const _=e??a.length;do{const N=u===0?o[0]??r.initialPageParam:mi(r,l);if(u>0&&N==null)break;l=await S(l,N),u++}while(u<_)}return l};t.options.persister?t.fetchFn=()=>{var w,j;return(j=(w=t.options).persister)==null?void 0:j.call(w,c,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=c}}}function mi(e,{pages:t,pageParams:n}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Io(e,{pages:t,pageParams:n}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n):void 0}function Ru(e,t){return t?mi(e,t)!=null:!1}function Iu(e,t){return!t||!e.getPreviousPageParam?!1:Io(e,t)!=null}var ln,qt,un,He,Bt,ve,Yn,Ut,qe,To,mt,go,Tu=(go=class extends Ro{constructor(t){super();U(this,qe);U(this,ln);U(this,qt);U(this,un);U(this,He);U(this,Bt);U(this,ve);U(this,Yn);U(this,Ut);D(this,Ut,!1),D(this,Yn,t.defaultOptions),this.setOptions(t.options),this.observers=[],D(this,Bt,t.client),D(this,He,g(this,Bt).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,D(this,qt,ua(this.options)),this.state=t.state??g(this,qt),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return g(this,ln)}get promise(){var t;return(t=g(this,ve))==null?void 0:t.promise}setOptions(t){if(this.options={...g(this,Yn),...t},t!=null&&t._type&&D(this,ln,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const n=ua(this.options);n.data!==void 0&&(this.setState(la(n.data,n.dataUpdatedAt)),D(this,qt,n))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&g(this,He).remove(this)}setData(t,n){const r=di(this.state.data,t,this.options);return Y(this,qe,mt).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t){Y(this,qe,mt).call(this,{type:"setState",state:t})}cancel(t){var r,s;const n=(r=g(this,ve))==null?void 0:r.promise;return(s=g(this,ve))==null||s.cancel(t),n?n.then(Le).catch(Le):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return g(this,qt)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>Be(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Ui||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>It(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:!No(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=g(this,ve))==null||n.continue()}onOnline(){var n;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=g(this,ve))==null||n.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),g(this,He).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(n=>n!==t),this.observers.length||(g(this,ve)&&(g(this,Ut)||Y(this,qe,To).call(this)?g(this,ve).cancel({revert:!0}):g(this,ve).cancelRetry()),this.scheduleGc()),g(this,He).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||Y(this,qe,mt).call(this,{type:"invalidate"})}async fetch(t,n){var c,d,h,m,p,y,w,j,b,S,_;if(this.state.fetchStatus!=="idle"&&((c=g(this,ve))==null?void 0:c.status())!=="rejected"){if(this.state.data!==void 0&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if(g(this,ve))return g(this,ve).continueRetry(),g(this,ve).promise}if(t&&this.setOptions(t),!this.options.queryFn){const N=this.observers.find(q=>q.options.queryFn);N&&this.setOptions(N.options)}const r=new AbortController,s=N=>{Object.defineProperty(N,"signal",{enumerable:!0,get:()=>(D(this,Ut,!0),r.signal)})},a=()=>{const N=Co(this.options,n),k=(()=>{const B={client:g(this,Bt),queryKey:this.queryKey,meta:this.meta};return s(B),B})();return D(this,Ut,!1),this.options.persister?this.options.persister(N,k,this):N(k)},l=(()=>{const N={fetchOptions:n,options:this.options,queryKey:this.queryKey,client:g(this,Bt),state:this.state,fetchFn:a};return s(N),N})(),u=g(this,ln)==="infinite"?Pu(this.options.pages):this.options.behavior;u==null||u.onFetch(l,this),D(this,un,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=l.fetchOptions)==null?void 0:d.meta))&&Y(this,qe,mt).call(this,{type:"fetch",meta:(h=l.fetchOptions)==null?void 0:h.meta}),D(this,ve,Po({initialPromise:n==null?void 0:n.initialPromise,fn:l.fetchFn,onCancel:N=>{N instanceof pi&&N.revert&&this.setState({...g(this,un),fetchStatus:"idle"}),r.abort()},onFail:(N,q)=>{Y(this,qe,mt).call(this,{type:"failed",failureCount:N,error:q})},onPause:()=>{Y(this,qe,mt).call(this,{type:"pause"})},onContinue:()=>{Y(this,qe,mt).call(this,{type:"continue"})},retry:l.options.retry,retryDelay:l.options.retryDelay,networkMode:l.options.networkMode,canRun:()=>!0}));try{const N=await g(this,ve).start();if(N===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(N),(p=(m=g(this,He).config).onSuccess)==null||p.call(m,N,this),(w=(y=g(this,He).config).onSettled)==null||w.call(y,N,this.state.error,this),N}catch(N){if(N instanceof pi){if(N.silent)return g(this,ve).promise;if(N.revert){if(this.state.data===void 0)throw N;return this.state.data}}throw Y(this,qe,mt).call(this,{type:"error",error:N}),(b=(j=g(this,He).config).onError)==null||b.call(j,N,this),(_=(S=g(this,He).config).onSettled)==null||_.call(S,this.state.data,N,this),N}finally{this.scheduleGc()}}},ln=new WeakMap,qt=new WeakMap,un=new WeakMap,He=new WeakMap,Bt=new WeakMap,ve=new WeakMap,Yn=new WeakMap,Ut=new WeakMap,qe=new WeakSet,To=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},mt=function(t){const n=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,...Ao(r.data,this.options),fetchMeta:t.meta??null};case"success":const s={...r,...la(t.data,t.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return D(this,un,t.manual?s:void 0),s;case"error":const a=t.error;return{...r,error:a,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:a,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),je.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),g(this,He).notify({query:this,type:"updated",action:t})})},go);function Ao(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Eo(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function la(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function ua(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Ae,te,Zn,Re,$t,cn,ft,Ct,er,dn,hn,Ht,Kt,_t,pn,re,Fn,fi,xi,gi,bi,yi,wi,vi,Mo,bo,Lo=(bo=class extends lr{constructor(t,n){super();U(this,re);U(this,Ae);U(this,te);U(this,Zn);U(this,Re);U(this,$t);U(this,cn);U(this,ft);U(this,Ct);U(this,er);U(this,dn);U(this,hn);U(this,Ht);U(this,Kt);U(this,_t);U(this,pn,new Set);this.options=n,D(this,Ae,t),D(this,Ct,null),D(this,ft,hi()),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(g(this,te).addObserver(this),ca(g(this,te),this.options)?Y(this,re,Fn).call(this):this.updateResult(),Y(this,re,bi).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return ji(g(this,te),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return ji(g(this,te),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Y(this,re,yi).call(this),Y(this,re,wi).call(this),g(this,te).removeObserver(this)}setOptions(t){const n=this.options,r=g(this,te);if(this.options=g(this,Ae).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof Be(this.options.enabled,g(this,te))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");Y(this,re,vi).call(this),g(this,te).setOptions(this.options),n._defaulted&&!ui(this.options,n)&&g(this,Ae).getQueryCache().notify({type:"observerOptionsUpdated",query:g(this,te),observer:this});const s=this.hasListeners();s&&da(g(this,te),r,this.options,n)&&Y(this,re,Fn).call(this),this.updateResult(),s&&(g(this,te)!==r||Be(this.options.enabled,g(this,te))!==Be(n.enabled,g(this,te))||It(this.options.staleTime,g(this,te))!==It(n.staleTime,g(this,te)))&&Y(this,re,fi).call(this);const a=Y(this,re,xi).call(this);s&&(g(this,te)!==r||Be(this.options.enabled,g(this,te))!==Be(n.enabled,g(this,te))||a!==g(this,_t))&&Y(this,re,gi).call(this,a)}getOptimisticResult(t){const n=g(this,Ae).getQueryCache().build(g(this,Ae),t),r=this.createResult(n,t);return Lu(this,r)&&(D(this,Re,r),D(this,cn,this.options),D(this,$t,g(this,te).state)),r}getCurrentResult(){return g(this,Re)}trackResult(t,n){return new Proxy(t,{get:(r,s)=>(this.trackProp(s),n==null||n(s),s==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&g(this,ft).status==="pending"&&g(this,ft).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(r,s))})}trackProp(t){g(this,pn).add(t)}getCurrentQuery(){return g(this,te)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const n=g(this,Ae).defaultQueryOptions(t),r=g(this,Ae).getQueryCache().build(g(this,Ae),n);return r.fetch().then(()=>this.createResult(r,n))}fetch(t){return Y(this,re,Fn).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),g(this,Re)))}createResult(t,n){var v;const r=g(this,te),s=this.options,a=g(this,Re),o=g(this,$t),l=g(this,cn),c=t!==r?t.state:g(this,Zn),{state:d}=t;let h={...d},m=!1,p;if(n._optimisticResults){const F=this.hasListeners(),L=!F&&ca(t,n),P=F&&da(t,r,n,s);(L||P)&&(h={...h,...Ao(d.data,t.options)}),n._optimisticResults==="isRestoring"&&(h.fetchStatus="idle")}let{error:y,errorUpdatedAt:w,status:j}=h;p=h.data;let b=!1;if(n.placeholderData!==void 0&&p===void 0&&j==="pending"){let F;a!=null&&a.isPlaceholderData&&n.placeholderData===(l==null?void 0:l.placeholderData)?(F=a.data,b=!0):F=typeof n.placeholderData=="function"?n.placeholderData((v=g(this,hn))==null?void 0:v.state.data,g(this,hn)):n.placeholderData,F!==void 0&&(j="success",p=di(a==null?void 0:a.data,F,n),m=!0)}if(n.select&&p!==void 0&&!b)if(a&&p===(o==null?void 0:o.data)&&n.select===g(this,er))p=g(this,dn);else try{D(this,er,n.select),p=n.select(p),p=di(a==null?void 0:a.data,p,n),D(this,dn,p),D(this,Ct,null)}catch(F){D(this,Ct,F)}g(this,Ct)&&(y=g(this,Ct),p=g(this,dn),w=Date.now(),j="error");const S=h.fetchStatus==="fetching",_=j==="pending",N=j==="error",q=_&&S,k=p!==void 0,M={status:j,fetchStatus:h.fetchStatus,isPending:_,isSuccess:j==="success",isError:N,isInitialLoading:q,isLoading:q,data:p,dataUpdatedAt:h.dataUpdatedAt,error:y,errorUpdatedAt:w,failureCount:h.fetchFailureCount,failureReason:h.fetchFailureReason,errorUpdateCount:h.errorUpdateCount,isFetched:t.isFetched(),isFetchedAfterMount:h.dataUpdateCount>c.dataUpdateCount||h.errorUpdateCount>c.errorUpdateCount,isFetching:S,isRefetching:S&&!_,isLoadingError:N&&!k,isPaused:h.fetchStatus==="paused",isPlaceholderData:m,isRefetchError:N&&k,isStale:$i(t,n),refetch:this.refetch,promise:g(this,ft),isEnabled:Be(n.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const F=M.data!==void 0,L=M.status==="error"&&!F,P=E=>{L?E.reject(M.error):F&&E.resolve(M.data)},G=()=>{const E=D(this,ft,M.promise=hi());P(E)},z=g(this,ft);switch(z.status){case"pending":t.queryHash===r.queryHash&&P(z);break;case"fulfilled":(L||M.data!==z.value)&&G();break;case"rejected":(!L||M.error!==z.reason)&&G();break}}return M}updateResult(){const t=g(this,Re),n=this.createResult(g(this,te),this.options);if(D(this,$t,g(this,te).state),D(this,cn,this.options),g(this,$t).data!==void 0&&D(this,hn,g(this,te)),ui(n,t))return;D(this,Re,n);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:s}=this.options,a=typeof s=="function"?s():s;if(a==="all"||!a&&!g(this,pn).size)return!0;const o=new Set(a??g(this,pn));return this.options.throwOnError&&o.add("error"),Object.keys(g(this,Re)).some(l=>{const u=l;return g(this,Re)[u]!==t[u]&&o.has(u)})};Y(this,re,Mo).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Y(this,re,bi).call(this)}},Ae=new WeakMap,te=new WeakMap,Zn=new WeakMap,Re=new WeakMap,$t=new WeakMap,cn=new WeakMap,ft=new WeakMap,Ct=new WeakMap,er=new WeakMap,dn=new WeakMap,hn=new WeakMap,Ht=new WeakMap,Kt=new WeakMap,_t=new WeakMap,pn=new WeakMap,re=new WeakSet,Fn=function(t){Y(this,re,vi).call(this);let n=g(this,te).fetch(this.options,t);return t!=null&&t.throwOnError||(n=n.catch(Le)),n},fi=function(){Y(this,re,yi).call(this);const t=It(this.options.staleTime,g(this,te));if(Vn.isServer()||g(this,Re).isStale||!li(t))return;const r=No(g(this,Re).dataUpdatedAt,t)+1;D(this,Ht,Dt.setTimeout(()=>{g(this,Re).isStale||this.updateResult()},r))},xi=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(g(this,te)):this.options.refetchInterval)??!1},gi=function(t){Y(this,re,wi).call(this),D(this,_t,t),!(Vn.isServer()||Be(this.options.enabled,g(this,te))===!1||!li(g(this,_t))||g(this,_t)===0)&&D(this,Kt,Dt.setInterval(()=>{(this.options.refetchIntervalInBackground||qi.isFocused())&&Y(this,re,Fn).call(this)},g(this,_t)))},bi=function(){Y(this,re,fi).call(this),Y(this,re,gi).call(this,Y(this,re,xi).call(this))},yi=function(){g(this,Ht)!==void 0&&(Dt.clearTimeout(g(this,Ht)),D(this,Ht,void 0))},wi=function(){g(this,Kt)!==void 0&&(Dt.clearInterval(g(this,Kt)),D(this,Kt,void 0))},vi=function(){const t=g(this,Ae).getQueryCache().build(g(this,Ae),this.options);if(t===g(this,te))return;const n=g(this,te);D(this,te,t),D(this,Zn,t.state),this.hasListeners()&&(n==null||n.removeObserver(this),t.addObserver(this))},Mo=function(t){je.batch(()=>{t.listeners&&this.listeners.forEach(n=>{n(g(this,Re))}),g(this,Ae).getQueryCache().notify({query:g(this,te),type:"observerResultsUpdated"})})},bo);function Au(e,t){return Be(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&Be(t.retryOnMount,e)===!1)}function ca(e,t){return Au(e,t)||e.state.data!==void 0&&ji(e,t,t.refetchOnMount)}function ji(e,t,n){if(Be(t.enabled,e)!==!1&&It(t.staleTime,e)!=="static"){const r=typeof n=="function"?n(e):n;return r==="always"||r!==!1&&$i(e,t)}return!1}function da(e,t,n,r){return(e!==t||Be(r.enabled,e)===!1)&&(!n.suspense||e.state.status!=="error")&&$i(e,n)}function $i(e,t){return Be(t.enabled,e)!==!1&&e.isStaleByTime(It(t.staleTime,e))}function Lu(e,t){return!ui(e.getCurrentResult(),t)}var Mu=class extends Lo{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type="infinite",super.setOptions(e)}getOptimisticResult(e){return e._type="infinite",super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:"forward"}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:"backward"}}})}createResult(e,t){var y,w;const{state:n}=e,r=super.createResult(e,t),{isFetching:s,isRefetching:a,isError:o,isRefetchError:l}=r,u=(w=(y=n.fetchMeta)==null?void 0:y.fetchMore)==null?void 0:w.direction,c=o&&u==="forward",d=s&&u==="forward",h=o&&u==="backward",m=s&&u==="backward";return{...r,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:Ru(t,n.data),hasPreviousPage:Iu(t,n.data),isFetchNextPageError:c,isFetchingNextPage:d,isFetchPreviousPageError:h,isFetchingPreviousPage:m,isRefetchError:l&&!c&&!h,isRefetching:a&&!d&&!m}}},tr,it,Ce,Qt,st,jt,yo,Ou=(yo=class extends Ro{constructor(t){super();U(this,st);U(this,tr);U(this,it);U(this,Ce);U(this,Qt);D(this,tr,t.client),this.mutationId=t.mutationId,D(this,Ce,t.mutationCache),D(this,it,[]),this.state=t.state||Du(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){g(this,it).includes(t)||(g(this,it).push(t),this.clearGcTimeout(),g(this,Ce).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){D(this,it,g(this,it).filter(n=>n!==t)),this.scheduleGc(),g(this,Ce).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){g(this,it).length||(this.state.status==="pending"?this.scheduleGc():g(this,Ce).remove(this))}continue(){var t;return((t=g(this,Qt))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var o,l,u,c,d,h,m,p,y,w,j,b,S,_,N,q,k,B;const n=()=>{Y(this,st,jt).call(this,{type:"continue"})},r={client:g(this,tr),meta:this.options.meta,mutationKey:this.options.mutationKey};D(this,Qt,Po({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(new Error("No mutationFn found")),onFail:(M,v)=>{Y(this,st,jt).call(this,{type:"failed",failureCount:M,error:v})},onPause:()=>{Y(this,st,jt).call(this,{type:"pause"})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>g(this,Ce).canRun(this)}));const s=this.state.status==="pending",a=!g(this,Qt).canStart();try{if(s)n();else{Y(this,st,jt).call(this,{type:"pending",variables:t,isPaused:a}),g(this,Ce).config.onMutate&&await g(this,Ce).config.onMutate(t,this,r);const v=await((l=(o=this.options).onMutate)==null?void 0:l.call(o,t,r));v!==this.state.context&&Y(this,st,jt).call(this,{type:"pending",context:v,variables:t,isPaused:a})}const M=await g(this,Qt).start();return await((c=(u=g(this,Ce).config).onSuccess)==null?void 0:c.call(u,M,t,this.state.context,this,r)),await((h=(d=this.options).onSuccess)==null?void 0:h.call(d,M,t,this.state.context,r)),await((p=(m=g(this,Ce).config).onSettled)==null?void 0:p.call(m,M,null,this.state.variables,this.state.context,this,r)),await((w=(y=this.options).onSettled)==null?void 0:w.call(y,M,null,t,this.state.context,r)),Y(this,st,jt).call(this,{type:"success",data:M}),M}catch(M){try{await((b=(j=g(this,Ce).config).onError)==null?void 0:b.call(j,M,t,this.state.context,this,r))}catch(v){Promise.reject(v)}try{await((_=(S=this.options).onError)==null?void 0:_.call(S,M,t,this.state.context,r))}catch(v){Promise.reject(v)}try{await((q=(N=g(this,Ce).config).onSettled)==null?void 0:q.call(N,void 0,M,this.state.variables,this.state.context,this,r))}catch(v){Promise.reject(v)}try{await((B=(k=this.options).onSettled)==null?void 0:B.call(k,void 0,M,t,this.state.context,r))}catch(v){Promise.reject(v)}throw Y(this,st,jt).call(this,{type:"error",error:M}),M}finally{g(this,Ce).runNext(this)}}},tr=new WeakMap,it=new WeakMap,Ce=new WeakMap,Qt=new WeakMap,st=new WeakSet,jt=function(t){const n=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=n(this.state),je.batch(()=>{g(this,it).forEach(r=>{r.onMutationUpdate(t)}),g(this,Ce).notify({mutation:this,type:"updated",action:t})})},yo);function Du(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var xt,Xe,nr,wo,Fu=(wo=class extends lr{constructor(t={}){super();U(this,xt);U(this,Xe);U(this,nr);this.config=t,D(this,xt,new Set),D(this,Xe,new Map),D(this,nr,0)}build(t,n,r){const s=new Ou({client:t,mutationCache:this,mutationId:++yr(this,nr)._,options:t.defaultMutationOptions(n),state:r});return this.add(s),s}add(t){g(this,xt).add(t);const n=vr(t);if(typeof n=="string"){const r=g(this,Xe).get(n);r?r.push(t):g(this,Xe).set(n,[t])}this.notify({type:"added",mutation:t})}remove(t){if(g(this,xt).delete(t)){const n=vr(t);if(typeof n=="string"){const r=g(this,Xe).get(n);if(r)if(r.length>1){const s=r.indexOf(t);s!==-1&&r.splice(s,1)}else r[0]===t&&g(this,Xe).delete(n)}}this.notify({type:"removed",mutation:t})}canRun(t){const n=vr(t);if(typeof n=="string"){const r=g(this,Xe).get(n),s=r==null?void 0:r.find(a=>a.state.status==="pending");return!s||s===t}else return!0}runNext(t){var r;const n=vr(t);if(typeof n=="string"){const s=(r=g(this,Xe).get(n))==null?void 0:r.find(a=>a!==t&&a.state.isPaused);return(s==null?void 0:s.continue())??Promise.resolve()}else return Promise.resolve()}clear(){je.batch(()=>{g(this,xt).forEach(t=>{this.notify({type:"removed",mutation:t})}),g(this,xt).clear(),g(this,Xe).clear()})}getAll(){return Array.from(g(this,xt))}find(t){const n={exact:!0,...t};return this.getAll().find(r=>sa(n,r))}findAll(t={}){return this.getAll().filter(n=>sa(t,n))}notify(t){je.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){const t=this.getAll().filter(n=>n.state.isPaused);return je.batch(()=>Promise.all(t.map(n=>n.continue().catch(Le))))}},xt=new WeakMap,Xe=new WeakMap,nr=new WeakMap,wo);function vr(e){var t;return(t=e.options.scope)==null?void 0:t.id}var at,vo,zu=(vo=class extends lr{constructor(t={}){super();U(this,at);this.config=t,D(this,at,new Map)}build(t,n,r){const s=n.queryKey,a=n.queryHash??Bi(s,n);let o=this.get(a);return o||(o=new Tu({client:t,queryKey:s,queryHash:a,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(s)}),this.add(o)),o}add(t){g(this,at).has(t.queryHash)||(g(this,at).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=g(this,at).get(t.queryHash);n&&(t.destroy(),n===t&&g(this,at).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){je.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return g(this,at).get(t)}getAll(){return[...g(this,at).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>ia(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>ia(t,r)):n}notify(t){je.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){je.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){je.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},at=new WeakMap,vo),xe,Et,Pt,mn,fn,Rt,xn,gn,jo,qu=(jo=class{constructor(e={}){U(this,xe);U(this,Et);U(this,Pt);U(this,mn);U(this,fn);U(this,Rt);U(this,xn);U(this,gn);D(this,xe,e.queryCache||new zu),D(this,Et,e.mutationCache||new Fu),D(this,Pt,e.defaultOptions||{}),D(this,mn,new Map),D(this,fn,new Map),D(this,Rt,0)}mount(){yr(this,Rt)._++,g(this,Rt)===1&&(D(this,xn,qi.subscribe(async e=>{e&&(await this.resumePausedMutations(),g(this,xe).onFocus())})),D(this,gn,Ir.subscribe(async e=>{e&&(await this.resumePausedMutations(),g(this,xe).onOnline())})))}unmount(){var e,t;yr(this,Rt)._--,g(this,Rt)===0&&((e=g(this,xn))==null||e.call(this),D(this,xn,void 0),(t=g(this,gn))==null||t.call(this),D(this,gn,void 0))}isFetching(e){return g(this,xe).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return g(this,Et).findAll({...e,status:"pending"}).length}getQueryData(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=g(this,xe).get(t.queryHash))==null?void 0:n.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),n=g(this,xe).build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(It(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return g(this,xe).findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=this.defaultQueryOptions({queryKey:e}),s=g(this,xe).get(r.queryHash),a=s==null?void 0:s.state.data,o=yu(t,a);if(o!==void 0)return g(this,xe).build(this,r).setData(o,{...n,manual:!0})}setQueriesData(e,t,n){return je.batch(()=>g(this,xe).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=g(this,xe).get(t.queryHash))==null?void 0:n.state}removeQueries(e){const t=g(this,xe);je.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=g(this,xe);return je.batch(()=>(n.findAll(e).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const n={revert:!0,...t},r=je.batch(()=>g(this,xe).findAll(e).map(s=>s.cancel(n)));return Promise.all(r).then(Le).catch(Le)}invalidateQueries(e,t={}){return je.batch(()=>(g(this,xe).findAll(e).forEach(n=>{n.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 n={...t,cancelRefetch:t.cancelRefetch??!0},r=je.batch(()=>g(this,xe).findAll(e).filter(s=>!s.isDisabled()&&!s.isStatic()).map(s=>{let a=s.fetch(void 0,n);return n.throwOnError||(a=a.catch(Le)),s.state.fetchStatus==="paused"?Promise.resolve():a}));return Promise.all(r).then(Le)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const n=g(this,xe).build(this,t);return n.isStaleByTime(It(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Le).catch(Le)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Le).catch(Le)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Ir.isOnline()?g(this,Et).resumePausedMutations():Promise.resolve()}getQueryCache(){return g(this,xe)}getMutationCache(){return g(this,Et)}getDefaultOptions(){return g(this,Pt)}setDefaultOptions(e){D(this,Pt,e)}setQueryDefaults(e,t){g(this,mn).set(Kn(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...g(this,mn).values()],n={};return t.forEach(r=>{Qn(e,r.queryKey)&&Object.assign(n,r.defaultOptions)}),n}setMutationDefaults(e,t){g(this,fn).set(Kn(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...g(this,fn).values()],n={};return t.forEach(r=>{Qn(e,r.mutationKey)&&Object.assign(n,r.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;const t={...g(this,Pt).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=Bi(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===Ui&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...g(this,Pt).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){g(this,xe).clear(),g(this,Et).clear()}},xe=new WeakMap,Et=new WeakMap,Pt=new WeakMap,mn=new WeakMap,fn=new WeakMap,Rt=new WeakMap,xn=new WeakMap,gn=new WeakMap,jo),Oo=ke.createContext(void 0),Do=e=>{const t=ke.useContext(Oo);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},Bu=({client:e,children:t})=>(ke.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),i.jsx(Oo.Provider,{value:e,children:t})),Fo=ke.createContext(!1),Uu=()=>ke.useContext(Fo);Fo.Provider;function $u(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var Hu=ke.createContext($u()),Ku=()=>ke.useContext(Hu),Qu=(e,t,n)=>{const r=n!=null&&n.state.error&&typeof e.throwOnError=="function"?_o(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},Vu=e=>{ke.useEffect(()=>{e.clearReset()},[e])},Wu=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:s})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(s&&e.data===void 0||_o(n,[e.error,r])),Gu=e=>{if(e.suspense){const n=s=>s==="static"?s:Math.max(s??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...s)=>n(r(...s)):n(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},Ju=(e,t)=>e.isLoading&&e.isFetching&&!t,Xu=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,ha=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function zo(e,t,n){var m,p,y,w;const r=Uu(),s=Ku(),a=Do(),o=a.defaultQueryOptions(e);(p=(m=a.getDefaultOptions().queries)==null?void 0:m._experimental_beforeQuery)==null||p.call(m,o);const l=a.getQueryCache().get(o.queryHash);o._optimisticResults=r?"isRestoring":"optimistic",Gu(o),Qu(o,s,l),Vu(s);const u=!a.getQueryCache().get(o.queryHash),[c]=ke.useState(()=>new t(a,o)),d=c.getOptimisticResult(o),h=!r&&e.subscribed!==!1;if(ke.useSyncExternalStore(ke.useCallback(j=>{const b=h?c.subscribe(je.batchCalls(j)):Le;return c.updateResult(),b},[c,h]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),ke.useEffect(()=>{c.setOptions(o)},[o,c]),Xu(o,d))throw ha(o,c,s);if(Wu({result:d,errorResetBoundary:s,throwOnError:o.throwOnError,query:l,suspense:o.suspense}))throw d.error;if((w=(y=a.getDefaultOptions().queries)==null?void 0:y._experimental_afterQuery)==null||w.call(y,o,d),o.experimental_prefetchInRender&&!Vn.isServer()&&Ju(d,r)){const j=u?ha(o,c,s):l==null?void 0:l.promise;j==null||j.catch(Le).finally(()=>{c.updateResult()})}return o.notifyOnChangeProps?d:c.trackResult(d)}function ge(e,t){return zo(e,Lo)}function pa(e,t){return zo(e,Mu)}/** - * @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 Yu=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),qo=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).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 Zu={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 ec=ke.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:s="",children:a,iconNode:o,...l},u)=>ke.createElement("svg",{ref:u,...Zu,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:qo("lucide",s),...l},[...o.map(([c,d])=>ke.createElement(c,d)),...Array.isArray(a)?a:[a]]));/** - * @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 le=(e,t)=>{const n=ke.forwardRef(({className:r,...s},a)=>ke.createElement(ec,{ref:a,iconNode:t,className:qo(`lucide-${Yu(e)}`,r),...s}));return n.displayName=`${e}`,n};/** - * @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 bn=le("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 Bo=le("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 Uo=le("Bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]);/** - * @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 Hi=le("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** - * @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 yn=le("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 wn=le("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 Wn=le("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 $o=le("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 ma=le("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 Gt=le("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 Ho=le("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @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 tc=le("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 nc=le("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** - * @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 Tr=le("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);/** - * @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 vn=le("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 rc=le("Pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/** - * @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 ur=le("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 Gn=le("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** - * @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 ic=le("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/** - * @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 sc=le("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 Ko=le("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 Qo=le("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 ac=le("TimerReset",[["path",{d:"M10 2h4",key:"n1abiw"}],["path",{d:"M12 14v-4",key:"1evpnu"}],["path",{d:"M4 13a8 8 0 0 1 8-7 8 8 0 1 1-5.3 14L4 17.6",key:"1ts96g"}],["path",{d:"M9 17H4v5",key:"8t5av"}]]);/** - * @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 ki=le("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @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 zr=le("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 oc=le("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** - * @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 Jt=le("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function lc(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const uc=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,cc=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,dc={};function fa(e,t){return(dc.jsx?cc:uc).test(e)}const hc=/[ \t\n\f\r]/g;function pc(e){return typeof e=="object"?e.type==="text"?xa(e.value):!1:xa(e)}function xa(e){return e.replace(hc,"")===""}class cr{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}cr.prototype.normal={};cr.prototype.property={};cr.prototype.space=void 0;function Vo(e,t){const n={},r={};for(const s of e)Object.assign(n,s.property),Object.assign(r,s.normal);return new cr(n,r,t)}function Ni(e){return e.toLowerCase()}class Oe{constructor(t,n){this.attribute=n,this.property=t}}Oe.prototype.attribute="";Oe.prototype.booleanish=!1;Oe.prototype.boolean=!1;Oe.prototype.commaOrSpaceSeparated=!1;Oe.prototype.commaSeparated=!1;Oe.prototype.defined=!1;Oe.prototype.mustUseProperty=!1;Oe.prototype.number=!1;Oe.prototype.overloadedBoolean=!1;Oe.prototype.property="";Oe.prototype.spaceSeparated=!1;Oe.prototype.space=void 0;let mc=0;const K=Xt(),ye=Xt(),Si=Xt(),R=Xt(),oe=Xt(),Wt=Xt(),ze=Xt();function Xt(){return 2**++mc}const Ci=Object.freeze(Object.defineProperty({__proto__:null,boolean:K,booleanish:ye,commaOrSpaceSeparated:ze,commaSeparated:Wt,number:R,overloadedBoolean:Si,spaceSeparated:oe},Symbol.toStringTag,{value:"Module"})),Kr=Object.keys(Ci);class Ki extends Oe{constructor(t,n,r,s){let a=-1;if(super(t,n),ga(this,"space",s),typeof r=="number")for(;++a4&&n.slice(0,4)==="data"&&yc.test(t)){if(t.charAt(4)==="-"){const a=t.slice(5).replace(ba,jc);r="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=t.slice(4);if(!ba.test(a)){let o=a.replace(bc,vc);o.charAt(0)!=="-"&&(o="-"+o),t="data"+o}}s=Ki}return new s(r,t)}function vc(e){return"-"+e.toLowerCase()}function jc(e){return e.charAt(1).toUpperCase()}const kc=Vo([Wo,fc,Xo,Yo,Zo],"html"),Qi=Vo([Wo,xc,Xo,Yo,Zo],"svg");function Nc(e){return e.join(" ").trim()}var en={},Qr,ya;function Sc(){if(ya)return Qr;ya=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,s=/^:\s*/,a=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,o=/^[;\s]*/,l=/^\s+|\s+$/g,u=` -`,c="/",d="*",h="",m="comment",p="declaration";function y(j,b){if(typeof j!="string")throw new TypeError("First argument must be a string");if(!j)return[];b=b||{};var S=1,_=1;function N(z){var E=z.match(t);E&&(S+=E.length);var O=z.lastIndexOf(u);_=~O?z.length-O:_+z.length}function q(){var z={line:S,column:_};return function(E){return E.position=new k(z),v(),E}}function k(z){this.start=z,this.end={line:S,column:_},this.source=b.source}k.prototype.content=j;function B(z){var E=new Error(b.source+":"+S+":"+_+": "+z);if(E.reason=z,E.filename=b.source,E.line=S,E.column=_,E.source=j,!b.silent)throw E}function M(z){var E=z.exec(j);if(E){var O=E[0];return N(O),j=j.slice(O.length),E}}function v(){M(n)}function F(z){var E;for(z=z||[];E=L();)E!==!1&&z.push(E);return z}function L(){var z=q();if(!(c!=j.charAt(0)||d!=j.charAt(1))){for(var E=2;h!=j.charAt(E)&&(d!=j.charAt(E)||c!=j.charAt(E+1));)++E;if(E+=2,h===j.charAt(E-1))return B("End of comment missing");var O=j.slice(2,E-2);return _+=2,N(O),j=j.slice(E),_+=2,z({type:m,comment:O})}}function P(){var z=q(),E=M(r);if(E){if(L(),!M(s))return B("property missing ':'");var O=M(a),Q=z({type:p,property:w(E[0].replace(e,h)),value:O?w(O[0].replace(e,h)):h});return M(o),Q}}function G(){var z=[];F(z);for(var E;E=P();)E!==!1&&(z.push(E),F(z));return z}return v(),G()}function w(j){return j?j.replace(l,h):h}return Qr=y,Qr}var wa;function Cc(){if(wa)return en;wa=1;var e=en&&en.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(en,"__esModule",{value:!0}),en.default=n;const t=e(Sc());function n(r,s){let a=null;if(!r||typeof r!="string")return a;const o=(0,t.default)(r),l=typeof s=="function";return o.forEach(u=>{if(u.type!=="declaration")return;const{property:c,value:d}=u;l?s(c,d,u):d&&(a=a||{},a[c]=d)}),a}return en}var In={},va;function _c(){if(va)return In;va=1,Object.defineProperty(In,"__esModule",{value:!0}),In.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,s=/^-(ms)-/,a=function(c){return!c||n.test(c)||e.test(c)},o=function(c,d){return d.toUpperCase()},l=function(c,d){return"".concat(d,"-")},u=function(c,d){return d===void 0&&(d={}),a(c)?c:(c=c.toLowerCase(),d.reactCompat?c=c.replace(s,l):c=c.replace(r,l),c.replace(t,o))};return In.camelCase=u,In}var Tn,ja;function Ec(){if(ja)return Tn;ja=1;var e=Tn&&Tn.__importDefault||function(s){return s&&s.__esModule?s:{default:s}},t=e(Cc()),n=_c();function r(s,a){var o={};return!s||typeof s!="string"||(0,t.default)(s,function(l,u){l&&u&&(o[(0,n.camelCase)(l,a)]=u)}),o}return r.default=r,Tn=r,Tn}var Pc=Ec();const Rc=zi(Pc),el=tl("end"),Vi=tl("start");function tl(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function Ic(e){const t=Vi(e),n=el(e);if(t&&n)return{start:t,end:n}}function Bn(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?ka(e.position):"start"in e||"end"in e?ka(e):"line"in e||"column"in e?_i(e):""}function _i(e){return Na(e&&e.line)+":"+Na(e&&e.column)}function ka(e){return _i(e&&e.start)+"-"+_i(e&&e.end)}function Na(e){return e&&typeof e=="number"?e:1}class Ee extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let s="",a={},o=!1;if(n&&("line"in n&&"column"in n?a={place:n}:"start"in n&&"end"in n?a={place:n}:"type"in n?a={ancestors:[n],place:n.position}:a={...n}),typeof t=="string"?s=t:!a.cause&&t&&(o=!0,s=t.message,a.cause=t),!a.ruleId&&!a.source&&typeof r=="string"){const u=r.indexOf(":");u===-1?a.ruleId=r:(a.source=r.slice(0,u),a.ruleId=r.slice(u+1))}if(!a.place&&a.ancestors&&a.ancestors){const u=a.ancestors[a.ancestors.length-1];u&&(a.place=u.position)}const l=a.place&&"start"in a.place?a.place.start:a.place;this.ancestors=a.ancestors||void 0,this.cause=a.cause||void 0,this.column=l?l.column:void 0,this.fatal=void 0,this.file="",this.message=s,this.line=l?l.line:void 0,this.name=Bn(a.place)||"1:1",this.place=a.place||void 0,this.reason=this.message,this.ruleId=a.ruleId||void 0,this.source=a.source||void 0,this.stack=o&&a.cause&&typeof a.cause.stack=="string"?a.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}Ee.prototype.file="";Ee.prototype.name="";Ee.prototype.reason="";Ee.prototype.message="";Ee.prototype.stack="";Ee.prototype.column=void 0;Ee.prototype.line=void 0;Ee.prototype.ancestors=void 0;Ee.prototype.cause=void 0;Ee.prototype.fatal=void 0;Ee.prototype.place=void 0;Ee.prototype.ruleId=void 0;Ee.prototype.source=void 0;const Wi={}.hasOwnProperty,Tc=new Map,Ac=/[A-Z]/g,Lc=new Set(["table","tbody","thead","tfoot","tr"]),Mc=new Set(["td","th"]),nl="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function Oc(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Hc(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=$c(n,t.jsx,t.jsxs)}const s={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Qi:kc,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},a=rl(s,e,void 0);return a&&typeof a!="string"?a:s.create(e,s.Fragment,{children:a||void 0},void 0)}function rl(e,t,n){if(t.type==="element")return Dc(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return Fc(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return qc(e,t,n);if(t.type==="mdxjsEsm")return zc(e,t);if(t.type==="root")return Bc(e,t,n);if(t.type==="text")return Uc(e,t)}function Dc(e,t,n){const r=e.schema;let s=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(s=Qi,e.schema=s),e.ancestors.push(t);const a=sl(e,t.tagName,!1),o=Kc(e,t);let l=Ji(e,t);return Lc.has(t.tagName)&&(l=l.filter(function(u){return typeof u=="string"?!pc(u):!0})),il(e,o,a,t),Gi(o,l),e.ancestors.pop(),e.schema=r,e.create(t,a,o,n)}function Fc(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}Jn(e,t.position)}function zc(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Jn(e,t.position)}function qc(e,t,n){const r=e.schema;let s=r;t.name==="svg"&&r.space==="html"&&(s=Qi,e.schema=s),e.ancestors.push(t);const a=t.name===null?e.Fragment:sl(e,t.name,!0),o=Qc(e,t),l=Ji(e,t);return il(e,o,a,t),Gi(o,l),e.ancestors.pop(),e.schema=r,e.create(t,a,o,n)}function Bc(e,t,n){const r={};return Gi(r,Ji(e,t)),e.create(t,e.Fragment,r,n)}function Uc(e,t){return t.value}function il(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function Gi(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function $c(e,t,n){return r;function r(s,a,o,l){const c=Array.isArray(o.children)?n:t;return l?c(a,o,l):c(a,o)}}function Hc(e,t){return n;function n(r,s,a,o){const l=Array.isArray(a.children),u=Vi(r);return t(s,a,o,l,{columnNumber:u?u.column-1:void 0,fileName:e,lineNumber:u?u.line:void 0},void 0)}}function Kc(e,t){const n={};let r,s;for(s in t.properties)if(s!=="children"&&Wi.call(t.properties,s)){const a=Vc(e,s,t.properties[s]);if(a){const[o,l]=a;e.tableCellAlignToStyle&&o==="align"&&typeof l=="string"&&Mc.has(t.tagName)?r=l:n[o]=l}}if(r){const a=n.style||(n.style={});a[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function Qc(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const a=r.data.estree.body[0];a.type;const o=a.expression;o.type;const l=o.properties[0];l.type,Object.assign(n,e.evaluater.evaluateExpression(l.argument))}else Jn(e,t.position);else{const s=r.name;let a;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const l=r.value.data.estree.body[0];l.type,a=e.evaluater.evaluateExpression(l.expression)}else Jn(e,t.position);else a=r.value===null?!0:r.value;n[s]=a}return n}function Ji(e,t){const n=[];let r=-1;const s=e.passKeys?new Map:Tc;for(;++rs?0:s+t:t=t>s?s:t,n=n>0?n:0,r.length<1e4)o=Array.from(r),o.unshift(t,n),e.splice(...o);else for(n&&e.splice(t,n);a0?(ut(e,e.length,0,t),e):t}const _a={}.hasOwnProperty;function td(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function nn(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const ot=Tt(/[A-Za-z]/),Ue=Tt(/[\dA-Za-z]/),id=Tt(/[#-'*+\--9=?A-Z^-~]/);function Ei(e){return e!==null&&(e<32||e===127)}const Pi=Tt(/\d/),sd=Tt(/[\dA-Fa-f]/),ad=Tt(/[!-/:-@[-`{-~]/);function $(e){return e!==null&&e<-2}function Me(e){return e!==null&&(e<0||e===32)}function ne(e){return e===-2||e===-1||e===32}const od=Tt(new RegExp("\\p{P}|\\p{S}","u")),ld=Tt(/\s/);function Tt(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function kn(e){const t=[];let n=-1,r=0,s=0;for(;++n55295&&a<57344){const l=e.charCodeAt(n+1);a<56320&&l>56319&&l<57344?(o=String.fromCharCode(a,l),s=1):o="�"}else o=String.fromCharCode(a);o&&(t.push(e.slice(r,n),encodeURIComponent(o)),r=n+s+1,o=""),s&&(n+=s,s=0)}return t.join("")+e.slice(r)}function ce(e,t,n,r){const s=r?r-1:Number.POSITIVE_INFINITY;let a=0;return o;function o(u){return ne(u)?(e.enter(n),l(u)):t(u)}function l(u){return ne(u)&&a++o))return;const B=t.events.length;let M=B,v,F;for(;M--;)if(t.events[M][0]==="exit"&&t.events[M][1].type==="chunkFlow"){if(v){F=t.events[M][1].end;break}v=!0}for(b(r),k=B;k_;){const q=n[N];t.containerState=q[1],q[0].exit.call(t,e)}n.length=_}function S(){s.write([null]),a=void 0,s=void 0,t.containerState._closeFlow=void 0}}function pd(e,t,n){return ce(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Pa(e){if(e===null||Me(e)||ld(e))return 1;if(od(e))return 2}function Yi(e,t,n){const r=[];let s=-1;for(;++s1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const h={...e[r][1].end},m={...e[n][1].start};Ra(h,-u),Ra(m,u),o={type:u>1?"strongSequence":"emphasisSequence",start:h,end:{...e[r][1].end}},l={type:u>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:m},a={type:u>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},s={type:u>1?"strong":"emphasis",start:{...o.start},end:{...l.end}},e[r][1].end={...o.start},e[n][1].start={...l.end},c=[],e[r][1].end.offset-e[r][1].start.offset&&(c=Ke(c,[["enter",e[r][1],t],["exit",e[r][1],t]])),c=Ke(c,[["enter",s,t],["enter",o,t],["exit",o,t],["enter",a,t]]),c=Ke(c,Yi(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),c=Ke(c,[["exit",a,t],["enter",l,t],["exit",l,t],["exit",s,t]]),e[n][1].end.offset-e[n][1].start.offset?(d=2,c=Ke(c,[["enter",e[n][1],t],["exit",e[n][1],t]])):d=0,ut(e,r-1,n-r+3,c),n=r+c.length-d-2;break}}for(n=-1;++n0&&ne(k)?ce(e,S,"linePrefix",a+1)(k):S(k)}function S(k){return k===null||$(k)?e.check(Ia,w,N)(k):(e.enter("codeFlowValue"),_(k))}function _(k){return k===null||$(k)?(e.exit("codeFlowValue"),S(k)):(e.consume(k),_)}function N(k){return e.exit("codeFenced"),t(k)}function q(k,B,M){let v=0;return F;function F(E){return k.enter("lineEnding"),k.consume(E),k.exit("lineEnding"),L}function L(E){return k.enter("codeFencedFence"),ne(E)?ce(k,P,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(E):P(E)}function P(E){return E===l?(k.enter("codeFencedFenceSequence"),G(E)):M(E)}function G(E){return E===l?(v++,k.consume(E),G):v>=o?(k.exit("codeFencedFenceSequence"),ne(E)?ce(k,z,"whitespace")(E):z(E)):M(E)}function z(E){return E===null||$(E)?(k.exit("codeFencedFence"),B(E)):M(E)}}}function Sd(e,t,n){const r=this;return s;function s(o){return o===null?n(o):(e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),a)}function a(o){return r.parser.lazy[r.now().line]?n(o):t(o)}}const Wr={name:"codeIndented",tokenize:_d},Cd={partial:!0,tokenize:Ed};function _d(e,t,n){const r=this;return s;function s(c){return e.enter("codeIndented"),ce(e,a,"linePrefix",5)(c)}function a(c){const d=r.events[r.events.length-1];return d&&d[1].type==="linePrefix"&&d[2].sliceSerialize(d[1],!0).length>=4?o(c):n(c)}function o(c){return c===null?u(c):$(c)?e.attempt(Cd,o,u)(c):(e.enter("codeFlowValue"),l(c))}function l(c){return c===null||$(c)?(e.exit("codeFlowValue"),o(c)):(e.consume(c),l)}function u(c){return e.exit("codeIndented"),t(c)}}function Ed(e,t,n){const r=this;return s;function s(o){return r.parser.lazy[r.now().line]?n(o):$(o)?(e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),s):ce(e,a,"linePrefix",5)(o)}function a(o){const l=r.events[r.events.length-1];return l&&l[1].type==="linePrefix"&&l[2].sliceSerialize(l[1],!0).length>=4?t(o):$(o)?s(o):n(o)}}const Pd={name:"codeText",previous:Id,resolve:Rd,tokenize:Td};function Rd(e){let t=e.length-4,n=3,r,s;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const s=n||0;this.setCursor(Math.trunc(t));const a=this.right.splice(this.right.length-s,Number.POSITIVE_INFINITY);return r&&An(this.left,r),a.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),An(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),An(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(o):e.interrupt(r.parser.constructs.flow,n,t)(o)}}function hl(e,t,n,r,s,a,o,l,u){const c=u||Number.POSITIVE_INFINITY;let d=0;return h;function h(b){return b===60?(e.enter(r),e.enter(s),e.enter(a),e.consume(b),e.exit(a),m):b===null||b===32||b===41||Ei(b)?n(b):(e.enter(r),e.enter(o),e.enter(l),e.enter("chunkString",{contentType:"string"}),w(b))}function m(b){return b===62?(e.enter(a),e.consume(b),e.exit(a),e.exit(s),e.exit(r),t):(e.enter(l),e.enter("chunkString",{contentType:"string"}),p(b))}function p(b){return b===62?(e.exit("chunkString"),e.exit(l),m(b)):b===null||b===60||$(b)?n(b):(e.consume(b),b===92?y:p)}function y(b){return b===60||b===62||b===92?(e.consume(b),p):p(b)}function w(b){return!d&&(b===null||b===41||Me(b))?(e.exit("chunkString"),e.exit(l),e.exit(o),e.exit(r),t(b)):d999||p===null||p===91||p===93&&!u||p===94&&!l&&"_hiddenFootnoteSupport"in o.parser.constructs?n(p):p===93?(e.exit(a),e.enter(s),e.consume(p),e.exit(s),e.exit(r),t):$(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),d):(e.enter("chunkString",{contentType:"string"}),h(p))}function h(p){return p===null||p===91||p===93||$(p)||l++>999?(e.exit("chunkString"),d(p)):(e.consume(p),u||(u=!ne(p)),p===92?m:h)}function m(p){return p===91||p===92||p===93?(e.consume(p),l++,h):h(p)}}function ml(e,t,n,r,s,a){let o;return l;function l(m){return m===34||m===39||m===40?(e.enter(r),e.enter(s),e.consume(m),e.exit(s),o=m===40?41:m,u):n(m)}function u(m){return m===o?(e.enter(s),e.consume(m),e.exit(s),e.exit(r),t):(e.enter(a),c(m))}function c(m){return m===o?(e.exit(a),u(o)):m===null?n(m):$(m)?(e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),ce(e,c,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),d(m))}function d(m){return m===o||m===null||$(m)?(e.exit("chunkString"),c(m)):(e.consume(m),m===92?h:d)}function h(m){return m===o||m===92?(e.consume(m),d):d(m)}}function Un(e,t){let n;return r;function r(s){return $(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),n=!0,r):ne(s)?ce(e,r,n?"linePrefix":"lineSuffix")(s):t(s)}}const qd={name:"definition",tokenize:Ud},Bd={partial:!0,tokenize:$d};function Ud(e,t,n){const r=this;let s;return a;function a(p){return e.enter("definition"),o(p)}function o(p){return pl.call(r,e,l,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(p)}function l(p){return s=nn(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),p===58?(e.enter("definitionMarker"),e.consume(p),e.exit("definitionMarker"),u):n(p)}function u(p){return Me(p)?Un(e,c)(p):c(p)}function c(p){return hl(e,d,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(p)}function d(p){return e.attempt(Bd,h,h)(p)}function h(p){return ne(p)?ce(e,m,"whitespace")(p):m(p)}function m(p){return p===null||$(p)?(e.exit("definition"),r.parser.defined.push(s),t(p)):n(p)}}function $d(e,t,n){return r;function r(l){return Me(l)?Un(e,s)(l):n(l)}function s(l){return ml(e,a,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(l)}function a(l){return ne(l)?ce(e,o,"whitespace")(l):o(l)}function o(l){return l===null||$(l)?t(l):n(l)}}const Hd={name:"hardBreakEscape",tokenize:Kd};function Kd(e,t,n){return r;function r(a){return e.enter("hardBreakEscape"),e.consume(a),s}function s(a){return $(a)?(e.exit("hardBreakEscape"),t(a)):n(a)}}const Qd={name:"headingAtx",resolve:Vd,tokenize:Wd};function Vd(e,t){let n=e.length-2,r=3,s,a;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(s={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},a={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},ut(e,r,n-r+1,[["enter",s,t],["enter",a,t],["exit",a,t],["exit",s,t]])),e}function Wd(e,t,n){let r=0;return s;function s(d){return e.enter("atxHeading"),a(d)}function a(d){return e.enter("atxHeadingSequence"),o(d)}function o(d){return d===35&&r++<6?(e.consume(d),o):d===null||Me(d)?(e.exit("atxHeadingSequence"),l(d)):n(d)}function l(d){return d===35?(e.enter("atxHeadingSequence"),u(d)):d===null||$(d)?(e.exit("atxHeading"),t(d)):ne(d)?ce(e,l,"whitespace")(d):(e.enter("atxHeadingText"),c(d))}function u(d){return d===35?(e.consume(d),u):(e.exit("atxHeadingSequence"),l(d))}function c(d){return d===null||d===35||Me(d)?(e.exit("atxHeadingText"),l(d)):(e.consume(d),c)}}const Gd=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Aa=["pre","script","style","textarea"],Jd={concrete:!0,name:"htmlFlow",resolveTo:Zd,tokenize:eh},Xd={partial:!0,tokenize:nh},Yd={partial:!0,tokenize:th};function Zd(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function eh(e,t,n){const r=this;let s,a,o,l,u;return c;function c(x){return d(x)}function d(x){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(x),h}function h(x){return x===33?(e.consume(x),m):x===47?(e.consume(x),a=!0,w):x===63?(e.consume(x),s=3,r.interrupt?t:f):ot(x)?(e.consume(x),o=String.fromCharCode(x),j):n(x)}function m(x){return x===45?(e.consume(x),s=2,p):x===91?(e.consume(x),s=5,l=0,y):ot(x)?(e.consume(x),s=4,r.interrupt?t:f):n(x)}function p(x){return x===45?(e.consume(x),r.interrupt?t:f):n(x)}function y(x){const De="CDATA[";return x===De.charCodeAt(l++)?(e.consume(x),l===De.length?r.interrupt?t:P:y):n(x)}function w(x){return ot(x)?(e.consume(x),o=String.fromCharCode(x),j):n(x)}function j(x){if(x===null||x===47||x===62||Me(x)){const De=x===47,we=o.toLowerCase();return!De&&!a&&Aa.includes(we)?(s=1,r.interrupt?t(x):P(x)):Gd.includes(o.toLowerCase())?(s=6,De?(e.consume(x),b):r.interrupt?t(x):P(x)):(s=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(x):a?S(x):_(x))}return x===45||Ue(x)?(e.consume(x),o+=String.fromCharCode(x),j):n(x)}function b(x){return x===62?(e.consume(x),r.interrupt?t:P):n(x)}function S(x){return ne(x)?(e.consume(x),S):F(x)}function _(x){return x===47?(e.consume(x),F):x===58||x===95||ot(x)?(e.consume(x),N):ne(x)?(e.consume(x),_):F(x)}function N(x){return x===45||x===46||x===58||x===95||Ue(x)?(e.consume(x),N):q(x)}function q(x){return x===61?(e.consume(x),k):ne(x)?(e.consume(x),q):_(x)}function k(x){return x===null||x===60||x===61||x===62||x===96?n(x):x===34||x===39?(e.consume(x),u=x,B):ne(x)?(e.consume(x),k):M(x)}function B(x){return x===u?(e.consume(x),u=null,v):x===null||$(x)?n(x):(e.consume(x),B)}function M(x){return x===null||x===34||x===39||x===47||x===60||x===61||x===62||x===96||Me(x)?q(x):(e.consume(x),M)}function v(x){return x===47||x===62||ne(x)?_(x):n(x)}function F(x){return x===62?(e.consume(x),L):n(x)}function L(x){return x===null||$(x)?P(x):ne(x)?(e.consume(x),L):n(x)}function P(x){return x===45&&s===2?(e.consume(x),O):x===60&&s===1?(e.consume(x),Q):x===62&&s===4?(e.consume(x),ue):x===63&&s===3?(e.consume(x),f):x===93&&s===5?(e.consume(x),se):$(x)&&(s===6||s===7)?(e.exit("htmlFlowData"),e.check(Xd,Se,G)(x)):x===null||$(x)?(e.exit("htmlFlowData"),G(x)):(e.consume(x),P)}function G(x){return e.check(Yd,z,Se)(x)}function z(x){return e.enter("lineEnding"),e.consume(x),e.exit("lineEnding"),E}function E(x){return x===null||$(x)?G(x):(e.enter("htmlFlowData"),P(x))}function O(x){return x===45?(e.consume(x),f):P(x)}function Q(x){return x===47?(e.consume(x),o="",he):P(x)}function he(x){if(x===62){const De=o.toLowerCase();return Aa.includes(De)?(e.consume(x),ue):P(x)}return ot(x)&&o.length<8?(e.consume(x),o+=String.fromCharCode(x),he):P(x)}function se(x){return x===93?(e.consume(x),f):P(x)}function f(x){return x===62?(e.consume(x),ue):x===45&&s===2?(e.consume(x),f):P(x)}function ue(x){return x===null||$(x)?(e.exit("htmlFlowData"),Se(x)):(e.consume(x),ue)}function Se(x){return e.exit("htmlFlow"),t(x)}}function th(e,t,n){const r=this;return s;function s(o){return $(o)?(e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),a):n(o)}function a(o){return r.parser.lazy[r.now().line]?n(o):t(o)}}function nh(e,t,n){return r;function r(s){return e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),e.attempt(qr,t,n)}}const rh={name:"htmlText",tokenize:ih};function ih(e,t,n){const r=this;let s,a,o;return l;function l(f){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(f),u}function u(f){return f===33?(e.consume(f),c):f===47?(e.consume(f),q):f===63?(e.consume(f),_):ot(f)?(e.consume(f),M):n(f)}function c(f){return f===45?(e.consume(f),d):f===91?(e.consume(f),a=0,y):ot(f)?(e.consume(f),S):n(f)}function d(f){return f===45?(e.consume(f),p):n(f)}function h(f){return f===null?n(f):f===45?(e.consume(f),m):$(f)?(o=h,Q(f)):(e.consume(f),h)}function m(f){return f===45?(e.consume(f),p):h(f)}function p(f){return f===62?O(f):f===45?m(f):h(f)}function y(f){const ue="CDATA[";return f===ue.charCodeAt(a++)?(e.consume(f),a===ue.length?w:y):n(f)}function w(f){return f===null?n(f):f===93?(e.consume(f),j):$(f)?(o=w,Q(f)):(e.consume(f),w)}function j(f){return f===93?(e.consume(f),b):w(f)}function b(f){return f===62?O(f):f===93?(e.consume(f),b):w(f)}function S(f){return f===null||f===62?O(f):$(f)?(o=S,Q(f)):(e.consume(f),S)}function _(f){return f===null?n(f):f===63?(e.consume(f),N):$(f)?(o=_,Q(f)):(e.consume(f),_)}function N(f){return f===62?O(f):_(f)}function q(f){return ot(f)?(e.consume(f),k):n(f)}function k(f){return f===45||Ue(f)?(e.consume(f),k):B(f)}function B(f){return $(f)?(o=B,Q(f)):ne(f)?(e.consume(f),B):O(f)}function M(f){return f===45||Ue(f)?(e.consume(f),M):f===47||f===62||Me(f)?v(f):n(f)}function v(f){return f===47?(e.consume(f),O):f===58||f===95||ot(f)?(e.consume(f),F):$(f)?(o=v,Q(f)):ne(f)?(e.consume(f),v):O(f)}function F(f){return f===45||f===46||f===58||f===95||Ue(f)?(e.consume(f),F):L(f)}function L(f){return f===61?(e.consume(f),P):$(f)?(o=L,Q(f)):ne(f)?(e.consume(f),L):v(f)}function P(f){return f===null||f===60||f===61||f===62||f===96?n(f):f===34||f===39?(e.consume(f),s=f,G):$(f)?(o=P,Q(f)):ne(f)?(e.consume(f),P):(e.consume(f),z)}function G(f){return f===s?(e.consume(f),s=void 0,E):f===null?n(f):$(f)?(o=G,Q(f)):(e.consume(f),G)}function z(f){return f===null||f===34||f===39||f===60||f===61||f===96?n(f):f===47||f===62||Me(f)?v(f):(e.consume(f),z)}function E(f){return f===47||f===62||Me(f)?v(f):n(f)}function O(f){return f===62?(e.consume(f),e.exit("htmlTextData"),e.exit("htmlText"),t):n(f)}function Q(f){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(f),e.exit("lineEnding"),he}function he(f){return ne(f)?ce(e,se,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(f):se(f)}function se(f){return e.enter("htmlTextData"),o(f)}}const Zi={name:"labelEnd",resolveAll:lh,resolveTo:uh,tokenize:ch},sh={tokenize:dh},ah={tokenize:hh},oh={tokenize:ph};function lh(e){let t=-1;const n=[];for(;++t=3&&(c===null||$(c))?(e.exit("thematicBreak"),t(c)):n(c)}function u(c){return c===s?(e.consume(c),r++,u):(e.exit("thematicBreakSequence"),ne(c)?ce(e,l,"whitespace")(c):l(c))}}const Te={continuation:{tokenize:kh},exit:Sh,name:"list",tokenize:jh},wh={partial:!0,tokenize:Ch},vh={partial:!0,tokenize:Nh};function jh(e,t,n){const r=this,s=r.events[r.events.length-1];let a=s&&s[1].type==="linePrefix"?s[2].sliceSerialize(s[1],!0).length:0,o=0;return l;function l(p){const y=r.containerState.type||(p===42||p===43||p===45?"listUnordered":"listOrdered");if(y==="listUnordered"?!r.containerState.marker||p===r.containerState.marker:Pi(p)){if(r.containerState.type||(r.containerState.type=y,e.enter(y,{_container:!0})),y==="listUnordered")return e.enter("listItemPrefix"),p===42||p===45?e.check(Pr,n,c)(p):c(p);if(!r.interrupt||p===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),u(p)}return n(p)}function u(p){return Pi(p)&&++o<10?(e.consume(p),u):(!r.interrupt||o<2)&&(r.containerState.marker?p===r.containerState.marker:p===41||p===46)?(e.exit("listItemValue"),c(p)):n(p)}function c(p){return e.enter("listItemMarker"),e.consume(p),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||p,e.check(qr,r.interrupt?n:d,e.attempt(wh,m,h))}function d(p){return r.containerState.initialBlankLine=!0,a++,m(p)}function h(p){return ne(p)?(e.enter("listItemPrefixWhitespace"),e.consume(p),e.exit("listItemPrefixWhitespace"),m):n(p)}function m(p){return r.containerState.size=a+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(p)}}function kh(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(qr,s,a);function s(l){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,ce(e,t,"listItemIndent",r.containerState.size+1)(l)}function a(l){return r.containerState.furtherBlankLines||!ne(l)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,o(l)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(vh,t,o)(l))}function o(l){return r.containerState._closeFlow=!0,r.interrupt=void 0,ce(e,e.attempt(Te,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(l)}}function Nh(e,t,n){const r=this;return ce(e,s,"listItemIndent",r.containerState.size+1);function s(a){const o=r.events[r.events.length-1];return o&&o[1].type==="listItemIndent"&&o[2].sliceSerialize(o[1],!0).length===r.containerState.size?t(a):n(a)}}function Sh(e){e.exit(this.containerState.type)}function Ch(e,t,n){const r=this;return ce(e,s,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function s(a){const o=r.events[r.events.length-1];return!ne(a)&&o&&o[1].type==="listItemPrefixWhitespace"?t(a):n(a)}}const La={name:"setextUnderline",resolveTo:_h,tokenize:Eh};function _h(e,t){let n=e.length,r,s,a;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(s=n)}else e[n][1].type==="content"&&e.splice(n,1),!a&&e[n][1].type==="definition"&&(a=n);const o={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[s][1].type="setextHeadingText",a?(e.splice(s,0,["enter",o,t]),e.splice(a+1,0,["exit",e[r][1],t]),e[r][1].end={...e[a][1].end}):e[r][1]=o,e.push(["exit",o,t]),e}function Eh(e,t,n){const r=this;let s;return a;function a(c){let d=r.events.length,h;for(;d--;)if(r.events[d][1].type!=="lineEnding"&&r.events[d][1].type!=="linePrefix"&&r.events[d][1].type!=="content"){h=r.events[d][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||h)?(e.enter("setextHeadingLine"),s=c,o(c)):n(c)}function o(c){return e.enter("setextHeadingLineSequence"),l(c)}function l(c){return c===s?(e.consume(c),l):(e.exit("setextHeadingLineSequence"),ne(c)?ce(e,u,"lineSuffix")(c):u(c))}function u(c){return c===null||$(c)?(e.exit("setextHeadingLine"),t(c)):n(c)}}const Ph={tokenize:Rh};function Rh(e){const t=this,n=e.attempt(qr,r,e.attempt(this.parser.constructs.flowInitial,s,ce(e,e.attempt(this.parser.constructs.flow,s,e.attempt(Md,s)),"linePrefix")));return n;function r(a){if(a===null){e.consume(a);return}return e.enter("lineEndingBlank"),e.consume(a),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function s(a){if(a===null){e.consume(a);return}return e.enter("lineEnding"),e.consume(a),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Ih={resolveAll:xl()},Th=fl("string"),Ah=fl("text");function fl(e){return{resolveAll:xl(e==="text"?Lh:void 0),tokenize:t};function t(n){const r=this,s=this.parser.constructs[e],a=n.attempt(s,o,l);return o;function o(d){return c(d)?a(d):l(d)}function l(d){if(d===null){n.consume(d);return}return n.enter("data"),n.consume(d),u}function u(d){return c(d)?(n.exit("data"),a(d)):(n.consume(d),u)}function c(d){if(d===null)return!0;const h=s[d];let m=-1;if(h)for(;++m-1){const l=o[0];typeof l=="string"?o[0]=l.slice(r):o.shift()}a>0&&o.push(e[s].slice(0,a))}return o}function Vh(e,t){let n=-1;const r=[];let s;for(;++n0){const Pe=H.tokenStack[H.tokenStack.length-1];(Pe[1]||Oa).call(H,void 0,Pe[0])}for(I.position={start:yt(C.length>0?C[0][1].start:{line:1,column:1,offset:0}),end:yt(C.length>0?C[C.length-2][1].end:{line:1,column:1,offset:0})},ie=-1;++ie0&&(r.className=["language-"+s[0]]);let a={type:"element",tagName:"code",properties:r,children:[{type:"text",value:n}]};return t.meta&&(a.data={meta:t.meta}),e.patch(t,a),a=e.applyData(t,a),a={type:"element",tagName:"pre",properties:{},children:[a]},e.patch(t,a),a}function op(e,t){const n={type:"element",tagName:"del",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function lp(e,t){const n={type:"element",tagName:"em",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function up(e,t){const n=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",r=String(t.identifier).toUpperCase(),s=kn(r.toLowerCase()),a=e.footnoteOrder.indexOf(r);let o,l=e.footnoteCounts.get(r);l===void 0?(l=0,e.footnoteOrder.push(r),o=e.footnoteOrder.length):o=a+1,l+=1,e.footnoteCounts.set(r,l);const u={type:"element",tagName:"a",properties:{href:"#"+n+"fn-"+s,id:n+"fnref-"+s+(l>1?"-"+l:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(o)}]};e.patch(t,u);const c={type:"element",tagName:"sup",properties:{},children:[u]};return e.patch(t,c),e.applyData(t,c)}function cp(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function dp(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function yl(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const s=e.all(t),a=s[0];a&&a.type==="text"?a.value="["+a.value:s.unshift({type:"text",value:"["});const o=s[s.length-1];return o&&o.type==="text"?o.value+=r:s.push({type:"text",value:r}),s}function hp(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return yl(e,t);const s={src:kn(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(s.title=r.title);const a={type:"element",tagName:"img",properties:s,children:[]};return e.patch(t,a),e.applyData(t,a)}function pp(e,t){const n={src:kn(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function mp(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function fp(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return yl(e,t);const s={href:kn(r.url||"")};r.title!==null&&r.title!==void 0&&(s.title=r.title);const a={type:"element",tagName:"a",properties:s,children:e.all(t)};return e.patch(t,a),e.applyData(t,a)}function xp(e,t){const n={href:kn(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function gp(e,t,n){const r=e.all(t),s=n?bp(n):wl(t),a={},o=[];if(typeof t.checked=="boolean"){const d=r[0];let h;d&&d.type==="element"&&d.tagName==="p"?h=d:(h={type:"element",tagName:"p",properties:{},children:[]},r.unshift(h)),h.children.length>0&&h.children.unshift({type:"text",value:" "}),h.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),a.className=["task-list-item"]}let l=-1;for(;++l1}function yp(e,t){const n={},r=e.all(t);let s=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++s0){const o={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},l=Vi(t.children[1]),u=el(t.children[t.children.length-1]);l&&u&&(o.position={start:l,end:u}),s.push(o)}const a={type:"element",tagName:"table",properties:{},children:e.wrap(s,!0)};return e.patch(t,a),e.applyData(t,a)}function Np(e,t,n){const r=n?n.children:void 0,a=(r?r.indexOf(t):1)===0?"th":"td",o=n&&n.type==="table"?n.align:void 0,l=o?o.length:t.children.length;let u=-1;const c=[];for(;++u0,!0),r[0]),s=r.index+r[0].length,r=n.exec(t);return a.push(za(t.slice(s),s>0,!1)),a.join("")}function za(e,t,n){let r=0,s=e.length;if(t){let a=e.codePointAt(r);for(;a===Da||a===Fa;)r++,a=e.codePointAt(r)}if(n){let a=e.codePointAt(s-1);for(;a===Da||a===Fa;)s--,a=e.codePointAt(s-1)}return s>r?e.slice(r,s):""}function _p(e,t){const n={type:"text",value:Cp(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function Ep(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const Pp={blockquote:ip,break:sp,code:ap,delete:op,emphasis:lp,footnoteReference:up,heading:cp,html:dp,imageReference:hp,image:pp,inlineCode:mp,linkReference:fp,link:xp,listItem:gp,list:yp,paragraph:wp,root:vp,strong:jp,table:kp,tableCell:Sp,tableRow:Np,text:_p,thematicBreak:Ep,toml:jr,yaml:jr,definition:jr,footnoteDefinition:jr};function jr(){}const vl=-1,Br=0,$n=1,Ar=2,es=3,ts=4,ns=5,rs=6,jl=7,kl=8,Rp=typeof self=="object"?self:globalThis,qa=(e,t)=>{switch(e){case"Function":case"SharedWorker":case"Worker":case"eval":case"setInterval":case"setTimeout":throw new TypeError("unable to deserialize "+e)}return new Rp[e](t)},Ip=(e,t)=>{const n=(s,a)=>(e.set(a,s),s),r=s=>{if(e.has(s))return e.get(s);const[a,o]=t[s];switch(a){case Br:case vl:return n(o,s);case $n:{const l=n([],s);for(const u of o)l.push(r(u));return l}case Ar:{const l=n({},s);for(const[u,c]of o)l[r(u)]=r(c);return l}case es:return n(new Date(o),s);case ts:{const{source:l,flags:u}=o;return n(new RegExp(l,u),s)}case ns:{const l=n(new Map,s);for(const[u,c]of o)l.set(r(u),r(c));return l}case rs:{const l=n(new Set,s);for(const u of o)l.add(r(u));return l}case jl:{const{name:l,message:u}=o;return n(qa(l,u),s)}case kl:return n(BigInt(o),s);case"BigInt":return n(Object(BigInt(o)),s);case"ArrayBuffer":return n(new Uint8Array(o).buffer,o);case"DataView":{const{buffer:l}=new Uint8Array(o);return n(new DataView(l),o)}}return n(qa(a,o),s)};return r},Ba=e=>Ip(new Map,e)(0),tn="",{toString:Tp}={},{keys:Ap}=Object,Ln=e=>{const t=typeof e;if(t!=="object"||!e)return[Br,t];const n=Tp.call(e).slice(8,-1);switch(n){case"Array":return[$n,tn];case"Object":return[Ar,tn];case"Date":return[es,tn];case"RegExp":return[ts,tn];case"Map":return[ns,tn];case"Set":return[rs,tn];case"DataView":return[$n,n]}return n.includes("Array")?[$n,n]:n.includes("Error")?[jl,n]:[Ar,n]},kr=([e,t])=>e===Br&&(t==="function"||t==="symbol"),Lp=(e,t,n,r)=>{const s=(o,l)=>{const u=r.push(o)-1;return n.set(l,u),u},a=o=>{if(n.has(o))return n.get(o);let[l,u]=Ln(o);switch(l){case Br:{let d=o;switch(u){case"bigint":l=kl,d=o.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);d=null;break;case"undefined":return s([vl],o)}return s([l,d],o)}case $n:{if(u){let m=o;return u==="DataView"?m=new Uint8Array(o.buffer):u==="ArrayBuffer"&&(m=new Uint8Array(o)),s([u,[...m]],o)}const d=[],h=s([l,d],o);for(const m of o)d.push(a(m));return h}case Ar:{if(u)switch(u){case"BigInt":return s([u,o.toString()],o);case"Boolean":case"Number":case"String":return s([u,o.valueOf()],o)}if(t&&"toJSON"in o)return a(o.toJSON());const d=[],h=s([l,d],o);for(const m of Ap(o))(e||!kr(Ln(o[m])))&&d.push([a(m),a(o[m])]);return h}case es:return s([l,o.toISOString()],o);case ts:{const{source:d,flags:h}=o;return s([l,{source:d,flags:h}],o)}case ns:{const d=[],h=s([l,d],o);for(const[m,p]of o)(e||!(kr(Ln(m))||kr(Ln(p))))&&d.push([a(m),a(p)]);return h}case rs:{const d=[],h=s([l,d],o);for(const m of o)(e||!kr(Ln(m)))&&d.push(a(m));return h}}const{message:c}=o;return s([l,{name:u,message:c}],o)};return a},Ua=(e,{json:t,lossy:n}={})=>{const r=[];return Lp(!(t||n),!!t,new Map,r)(e),r},Lr=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?Ba(Ua(e,t)):structuredClone(e):(e,t)=>Ba(Ua(e,t));function Mp(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function Op(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function Dp(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||Mp,r=e.options.footnoteBackLabel||Op,s=e.options.footnoteLabel||"Footnotes",a=e.options.footnoteLabelTagName||"h2",o=e.options.footnoteLabelProperties||{className:["sr-only"]},l=[];let u=-1;for(;++u0&&y.push({type:"text",value:" "});let S=typeof n=="string"?n:n(u,p);typeof S=="string"&&(S={type:"text",value:S}),y.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+m+(p>1?"-"+p:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(u,p),className:["data-footnote-backref"]},children:Array.isArray(S)?S:[S]})}const j=d[d.length-1];if(j&&j.type==="element"&&j.tagName==="p"){const S=j.children[j.children.length-1];S&&S.type==="text"?S.value+=" ":j.children.push({type:"text",value:" "}),j.children.push(...y)}else d.push(...y);const b={type:"element",tagName:"li",properties:{id:t+"fn-"+m},children:e.wrap(d,!0)};e.patch(c,b),l.push(b)}if(l.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:a,properties:{...Lr(o),id:"footnote-label"},children:[{type:"text",value:s}]},{type:"text",value:` -`},{type:"element",tagName:"ol",properties:{},children:e.wrap(l,!0)},{type:"text",value:` -`}]}}const Nl=(function(e){if(e==null)return Bp;if(typeof e=="function")return Ur(e);if(typeof e=="object")return Array.isArray(e)?Fp(e):zp(e);if(typeof e=="string")return qp(e);throw new Error("Expected function, string, or object as test")});function Fp(e){const t=[];let n=-1;for(;++n":""))+")"})}return m;function m(){let p=Sl,y,w,j;if((!t||a(u,c,d[d.length-1]||void 0))&&(p=Qp(n(u,d)),p[0]===$a))return p;if("children"in u&&u.children){const b=u;if(b.children&&p[0]!==Hp)for(w=(r?b.children.length:-1)+o,j=d.concat(b);w>-1&&w0&&n.push({type:"text",value:` -`}),n}function Ha(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function Ka(e,t){const n=Wp(e,t),r=n.one(e,void 0),s=Dp(n),a=Array.isArray(r)?{type:"root",children:r}:r||{type:"root",children:[]};return s&&a.children.push({type:"text",value:` -`},s),a}function Zp(e,t){return e&&"run"in e?async function(n,r){const s=Ka(n,{file:r,...t});await e.run(s,r)}:function(n,r){return Ka(n,{file:r,...e||t})}}function Qa(e){if(e)throw e}var Jr,Va;function em(){if(Va)return Jr;Va=1;var e=Object.prototype.hasOwnProperty,t=Object.prototype.toString,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=function(c){return typeof Array.isArray=="function"?Array.isArray(c):t.call(c)==="[object Array]"},a=function(c){if(!c||t.call(c)!=="[object Object]")return!1;var d=e.call(c,"constructor"),h=c.constructor&&c.constructor.prototype&&e.call(c.constructor.prototype,"isPrototypeOf");if(c.constructor&&!d&&!h)return!1;var m;for(m in c);return typeof m>"u"||e.call(c,m)},o=function(c,d){n&&d.name==="__proto__"?n(c,d.name,{enumerable:!0,configurable:!0,value:d.newValue,writable:!0}):c[d.name]=d.newValue},l=function(c,d){if(d==="__proto__")if(e.call(c,d)){if(r)return r(c,d).value}else return;return c[d]};return Jr=function u(){var c,d,h,m,p,y,w=arguments[0],j=1,b=arguments.length,S=!1;for(typeof w=="boolean"&&(S=w,w=arguments[1]||{},j=2),(w==null||typeof w!="object"&&typeof w!="function")&&(w={});jo.length;let u;l&&o.push(s);try{u=e.apply(this,o)}catch(c){const d=c;if(l&&n)throw d;return s(d)}l||(u&&u.then&&typeof u.then=="function"?u.then(a,s):u instanceof Error?s(u):a(u))}function s(o,...l){n||(n=!0,t(o,...l))}function a(o){s(null,o)}}const rt={basename:im,dirname:sm,extname:am,join:om,sep:"/"};function im(e,t){if(t!==void 0&&typeof t!="string")throw new TypeError('"ext" argument must be a string');dr(e);let n=0,r=-1,s=e.length,a;if(t===void 0||t.length===0||t.length>e.length){for(;s--;)if(e.codePointAt(s)===47){if(a){n=s+1;break}}else r<0&&(a=!0,r=s+1);return r<0?"":e.slice(n,r)}if(t===e)return"";let o=-1,l=t.length-1;for(;s--;)if(e.codePointAt(s)===47){if(a){n=s+1;break}}else o<0&&(a=!0,o=s+1),l>-1&&(e.codePointAt(s)===t.codePointAt(l--)?l<0&&(r=s):(l=-1,r=o));return n===r?r=o:r<0&&(r=e.length),e.slice(n,r)}function sm(e){if(dr(e),e.length===0)return".";let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||(r=!0);return t<0?e.codePointAt(0)===47?"/":".":t===1&&e.codePointAt(0)===47?"//":e.slice(0,t)}function am(e){dr(e);let t=e.length,n=-1,r=0,s=-1,a=0,o;for(;t--;){const l=e.codePointAt(t);if(l===47){if(o){r=t+1;break}continue}n<0&&(o=!0,n=t+1),l===46?s<0?s=t:a!==1&&(a=1):s>-1&&(a=-1)}return s<0||n<0||a===0||a===1&&s===n-1&&s===r+1?"":e.slice(s,n)}function om(...e){let t=-1,n;for(;++t0&&e.codePointAt(e.length-1)===47&&(n+="/"),t?"/"+n:n}function um(e,t){let n="",r=0,s=-1,a=0,o=-1,l,u;for(;++o<=e.length;){if(o2){if(u=n.lastIndexOf("/"),u!==n.length-1){u<0?(n="",r=0):(n=n.slice(0,u),r=n.length-1-n.lastIndexOf("/")),s=o,a=0;continue}}else if(n.length>0){n="",r=0,s=o,a=0;continue}}t&&(n=n.length>0?n+"/..":"..",r=2)}else n.length>0?n+="/"+e.slice(s+1,o):n=e.slice(s+1,o),r=o-s-1;s=o,a=0}else l===46&&a>-1?a++:a=-1}return n}function dr(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const cm={cwd:dm};function dm(){return"/"}function Ai(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function hm(e){if(typeof e=="string")e=new URL(e);else if(!Ai(e)){const t=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code="ERR_INVALID_ARG_TYPE",t}if(e.protocol!=="file:"){const t=new TypeError("The URL must be of scheme file");throw t.code="ERR_INVALID_URL_SCHEME",t}return pm(e)}function pm(e){if(e.hostname!==""){const r=new TypeError('File URL host must be "localhost" or empty on darwin');throw r.code="ERR_INVALID_FILE_URL_HOST",r}const t=e.pathname;let n=-1;for(;++n0){let[p,...y]=d;const w=r[m][1];Ti(w)&&Ti(p)&&(p=Xr(!0,w,p)),r[m]=[c,p,...y]}}}}const gm=new is().freeze();function ti(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function ni(e,t){if(typeof t!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function ri(e,t){if(t)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function Ga(e){if(!Ti(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function Ja(e,t,n){if(!n)throw new Error("`"+e+"` finished async. Use `"+t+"` instead")}function Nr(e){return bm(e)?e:new _l(e)}function bm(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function ym(e){return typeof e=="string"||wm(e)}function wm(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const vm="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",Xa=[],Ya={allowDangerousHtml:!0},jm=/^(https?|ircs?|mailto|xmpp)$/i,km=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"className",id:"remove-classname"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function Nm(e){const t=Sm(e),n=Cm(e);return _m(t.runSync(t.parse(n),n),e)}function Sm(e){const t=e.rehypePlugins||Xa,n=e.remarkPlugins||Xa,r=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...Ya}:Ya;return gm().use(rp).use(n).use(Zp,r).use(t)}function Cm(e){const t=e.children||"",n=new _l;return typeof t=="string"&&(n.value=t),n}function _m(e,t){const n=t.allowedElements,r=t.allowElement,s=t.components,a=t.disallowedElements,o=t.skipHtml,l=t.unwrapDisallowed,u=t.urlTransform||Em;for(const d of km)Object.hasOwn(t,d.from)&&(""+d.from+(d.to?"use `"+d.to+"` instead":"remove it")+vm+d.id,void 0);return Cl(e,c),Oc(e,{Fragment:i.Fragment,components:s,ignoreInvalidStyle:!0,jsx:i.jsx,jsxs:i.jsxs,passKeys:!0,passNode:!0});function c(d,h,m){if(d.type==="raw"&&m&&typeof h=="number")return o?m.children.splice(h,1):m.children[h]={type:"text",value:d.value},h;if(d.type==="element"){let p;for(p in Vr)if(Object.hasOwn(Vr,p)&&Object.hasOwn(d.properties,p)){const y=d.properties[p],w=Vr[p];(w===null||w.includes(d.tagName))&&(d.properties[p]=u(String(y||""),p,d))}}if(d.type==="element"){let p=n?!n.includes(d.tagName):a?a.includes(d.tagName):!1;if(!p&&r&&typeof h=="number"&&(p=!r(d,h,m)),p&&m&&typeof h=="number")return l&&d.children?m.children.splice(h,1,...d.children):m.children.splice(h,1),h}}}function Em(e){const t=e.indexOf(":"),n=e.indexOf("?"),r=e.indexOf("#"),s=e.indexOf("/");return t===-1||s!==-1&&t>s||n!==-1&&t>n||r!==-1&&t>r||jm.test(e.slice(0,t))?e:""}const ss="-",Pm=e=>{const t=Im(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:o=>{const l=o.split(ss);return l[0]===""&&l.length!==1&&l.shift(),El(l,t)||Rm(o)},getConflictingClassGroupIds:(o,l)=>{const u=n[o]||[];return l&&r[o]?[...u,...r[o]]:u}}},El=(e,t)=>{var o;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),s=r?El(e.slice(1),r):void 0;if(s)return s;if(t.validators.length===0)return;const a=e.join(ss);return(o=t.validators.find(({validator:l})=>l(a)))==null?void 0:o.classGroupId},Za=/^\[(.+)\]$/,Rm=e=>{if(Za.test(e)){const t=Za.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}},Im=e=>{const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return Am(Object.entries(e.classGroups),n).forEach(([a,o])=>{Li(o,r,a,t)}),r},Li=(e,t,n,r)=>{e.forEach(s=>{if(typeof s=="string"){const a=s===""?t:eo(t,s);a.classGroupId=n;return}if(typeof s=="function"){if(Tm(s)){Li(s(r),t,n,r);return}t.validators.push({validator:s,classGroupId:n});return}Object.entries(s).forEach(([a,o])=>{Li(o,eo(t,a),n,r)})})},eo=(e,t)=>{let n=e;return t.split(ss).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n},Tm=e=>e.isThemeGetter,Am=(e,t)=>t?e.map(([n,r])=>{const s=r.map(a=>typeof a=="string"?t+a:typeof a=="object"?Object.fromEntries(Object.entries(a).map(([o,l])=>[t+o,l])):a);return[n,s]}):e,Lm=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;const s=(a,o)=>{n.set(a,o),t++,t>e&&(t=0,r=n,n=new Map)};return{get(a){let o=n.get(a);if(o!==void 0)return o;if((o=r.get(a))!==void 0)return s(a,o),o},set(a,o){n.has(a)?n.set(a,o):s(a,o)}}},Pl="!",Mm=e=>{const{separator:t,experimentalParseClassName:n}=e,r=t.length===1,s=t[0],a=t.length,o=l=>{const u=[];let c=0,d=0,h;for(let j=0;jd?h-d:void 0;return{modifiers:u,hasImportantModifier:p,baseClassName:y,maybePostfixModifierPosition:w}};return n?l=>n({className:l,parseClassName:o}):o},Om=e=>{if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t},Dm=e=>({cache:Lm(e.cacheSize),parseClassName:Mm(e),...Pm(e)}),Fm=/\s+/,zm=(e,t)=>{const{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:s}=t,a=[],o=e.trim().split(Fm);let l="";for(let u=o.length-1;u>=0;u-=1){const c=o[u],{modifiers:d,hasImportantModifier:h,baseClassName:m,maybePostfixModifierPosition:p}=n(c);let y=!!p,w=r(y?m.substring(0,p):m);if(!w){if(!y){l=c+(l.length>0?" "+l:l);continue}if(w=r(m),!w){l=c+(l.length>0?" "+l:l);continue}y=!1}const j=Om(d).join(":"),b=h?j+Pl:j,S=b+w;if(a.includes(S))continue;a.push(S);const _=s(w,y);for(let N=0;N<_.length;++N){const q=_[N];a.push(b+q)}l=c+(l.length>0?" "+l:l)}return l};function qm(){let e=0,t,n,r="";for(;e{if(typeof e=="string")return e;let t,n="";for(let r=0;rh(d),e());return n=Dm(c),r=n.cache.get,s=n.cache.set,a=l,l(u)}function l(u){const c=r(u);if(c)return c;const d=zm(u,n);return s(u,d),d}return function(){return a(qm.apply(null,arguments))}}const de=e=>{const t=n=>n[e]||[];return t.isThemeGetter=!0,t},Il=/^\[(?:([a-z-]+):)?(.+)\]$/i,Um=/^\d+\/\d+$/,$m=new Set(["px","full","screen"]),Hm=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Km=/\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$/,Qm=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Vm=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Wm=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,pt=e=>rn(e)||$m.has(e)||Um.test(e),wt=e=>Nn(e,"length",nf),rn=e=>!!e&&!Number.isNaN(Number(e)),ii=e=>Nn(e,"number",rn),Mn=e=>!!e&&Number.isInteger(Number(e)),Gm=e=>e.endsWith("%")&&rn(e.slice(0,-1)),W=e=>Il.test(e),vt=e=>Hm.test(e),Jm=new Set(["length","size","percentage"]),Xm=e=>Nn(e,Jm,Tl),Ym=e=>Nn(e,"position",Tl),Zm=new Set(["image","url"]),ef=e=>Nn(e,Zm,sf),tf=e=>Nn(e,"",rf),On=()=>!0,Nn=(e,t,n)=>{const r=Il.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1},nf=e=>Km.test(e)&&!Qm.test(e),Tl=()=>!1,rf=e=>Vm.test(e),sf=e=>Wm.test(e),af=()=>{const e=de("colors"),t=de("spacing"),n=de("blur"),r=de("brightness"),s=de("borderColor"),a=de("borderRadius"),o=de("borderSpacing"),l=de("borderWidth"),u=de("contrast"),c=de("grayscale"),d=de("hueRotate"),h=de("invert"),m=de("gap"),p=de("gradientColorStops"),y=de("gradientColorStopPositions"),w=de("inset"),j=de("margin"),b=de("opacity"),S=de("padding"),_=de("saturate"),N=de("scale"),q=de("sepia"),k=de("skew"),B=de("space"),M=de("translate"),v=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],L=()=>["auto",W,t],P=()=>[W,t],G=()=>["",pt,wt],z=()=>["auto",rn,W],E=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],O=()=>["solid","dashed","dotted","double","none"],Q=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],he=()=>["start","end","center","between","around","evenly","stretch"],se=()=>["","0",W],f=()=>["auto","avoid","all","avoid-page","page","left","right","column"],ue=()=>[rn,W];return{cacheSize:500,separator:":",theme:{colors:[On],spacing:[pt,wt],blur:["none","",vt,W],brightness:ue(),borderColor:[e],borderRadius:["none","","full",vt,W],borderSpacing:P(),borderWidth:G(),contrast:ue(),grayscale:se(),hueRotate:ue(),invert:se(),gap:P(),gradientColorStops:[e],gradientColorStopPositions:[Gm,wt],inset:L(),margin:L(),opacity:ue(),padding:P(),saturate:ue(),scale:ue(),sepia:se(),skew:ue(),space:P(),translate:P()},classGroups:{aspect:[{aspect:["auto","square","video",W]}],container:["container"],columns:[{columns:[vt]}],"break-after":[{"break-after":f()}],"break-before":[{"break-before":f()}],"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:[...E(),W]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:v()}],"overscroll-x":[{"overscroll-x":v()}],"overscroll-y":[{"overscroll-y":v()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[w]}],"inset-x":[{"inset-x":[w]}],"inset-y":[{"inset-y":[w]}],start:[{start:[w]}],end:[{end:[w]}],top:[{top:[w]}],right:[{right:[w]}],bottom:[{bottom:[w]}],left:[{left:[w]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Mn,W]}],basis:[{basis:L()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",W]}],grow:[{grow:se()}],shrink:[{shrink:se()}],order:[{order:["first","last","none",Mn,W]}],"grid-cols":[{"grid-cols":[On]}],"col-start-end":[{col:["auto",{span:["full",Mn,W]},W]}],"col-start":[{"col-start":z()}],"col-end":[{"col-end":z()}],"grid-rows":[{"grid-rows":[On]}],"row-start-end":[{row:["auto",{span:[Mn,W]},W]}],"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",W]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",W]}],gap:[{gap:[m]}],"gap-x":[{"gap-x":[m]}],"gap-y":[{"gap-y":[m]}],"justify-content":[{justify:["normal",...he()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...he(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...he(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[S]}],px:[{px:[S]}],py:[{py:[S]}],ps:[{ps:[S]}],pe:[{pe:[S]}],pt:[{pt:[S]}],pr:[{pr:[S]}],pb:[{pb:[S]}],pl:[{pl:[S]}],m:[{m:[j]}],mx:[{mx:[j]}],my:[{my:[j]}],ms:[{ms:[j]}],me:[{me:[j]}],mt:[{mt:[j]}],mr:[{mr:[j]}],mb:[{mb:[j]}],ml:[{ml:[j]}],"space-x":[{"space-x":[B]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[B]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",W,t]}],"min-w":[{"min-w":[W,t,"min","max","fit"]}],"max-w":[{"max-w":[W,t,"none","full","min","max","fit","prose",{screen:[vt]},vt]}],h:[{h:[W,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[W,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[W,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[W,t,"auto","min","max","fit"]}],"font-size":[{text:["base",vt,wt]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ii]}],"font-family":[{font:[On]}],"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",W]}],"line-clamp":[{"line-clamp":["none",rn,ii]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",pt,W]}],"list-image":[{"list-image":["none",W]}],"list-style-type":[{list:["none","disc","decimal",W]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[b]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[b]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...O(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",pt,wt]}],"underline-offset":[{"underline-offset":["auto",pt,W]}],"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",W]}],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",W]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[b]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...E(),Ym]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Xm]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},ef]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[y]}],"gradient-via-pos":[{via:[y]}],"gradient-to-pos":[{to:[y]}],"gradient-from":[{from:[p]}],"gradient-via":[{via:[p]}],"gradient-to":[{to:[p]}],rounded:[{rounded:[a]}],"rounded-s":[{"rounded-s":[a]}],"rounded-e":[{"rounded-e":[a]}],"rounded-t":[{"rounded-t":[a]}],"rounded-r":[{"rounded-r":[a]}],"rounded-b":[{"rounded-b":[a]}],"rounded-l":[{"rounded-l":[a]}],"rounded-ss":[{"rounded-ss":[a]}],"rounded-se":[{"rounded-se":[a]}],"rounded-ee":[{"rounded-ee":[a]}],"rounded-es":[{"rounded-es":[a]}],"rounded-tl":[{"rounded-tl":[a]}],"rounded-tr":[{"rounded-tr":[a]}],"rounded-br":[{"rounded-br":[a]}],"rounded-bl":[{"rounded-bl":[a]}],"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":[b]}],"border-style":[{border:[...O(),"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":[b]}],"divide-style":[{divide:O()}],"border-color":[{border:[s]}],"border-color-x":[{"border-x":[s]}],"border-color-y":[{"border-y":[s]}],"border-color-s":[{"border-s":[s]}],"border-color-e":[{"border-e":[s]}],"border-color-t":[{"border-t":[s]}],"border-color-r":[{"border-r":[s]}],"border-color-b":[{"border-b":[s]}],"border-color-l":[{"border-l":[s]}],"divide-color":[{divide:[s]}],"outline-style":[{outline:["",...O()]}],"outline-offset":[{"outline-offset":[pt,W]}],"outline-w":[{outline:[pt,wt]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:G()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[b]}],"ring-offset-w":[{"ring-offset":[pt,wt]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",vt,tf]}],"shadow-color":[{shadow:[On]}],opacity:[{opacity:[b]}],"mix-blend":[{"mix-blend":[...Q(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":Q()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[u]}],"drop-shadow":[{"drop-shadow":["","none",vt,W]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[d]}],invert:[{invert:[h]}],saturate:[{saturate:[_]}],sepia:[{sepia:[q]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[u]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[d]}],"backdrop-invert":[{"backdrop-invert":[h]}],"backdrop-opacity":[{"backdrop-opacity":[b]}],"backdrop-saturate":[{"backdrop-saturate":[_]}],"backdrop-sepia":[{"backdrop-sepia":[q]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[o]}],"border-spacing-x":[{"border-spacing-x":[o]}],"border-spacing-y":[{"border-spacing-y":[o]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",W]}],duration:[{duration:ue()}],ease:[{ease:["linear","in","out","in-out",W]}],delay:[{delay:ue()}],animate:[{animate:["none","spin","ping","pulse","bounce",W]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[N]}],"scale-x":[{"scale-x":[N]}],"scale-y":[{"scale-y":[N]}],rotate:[{rotate:[Mn,W]}],"translate-x":[{"translate-x":[M]}],"translate-y":[{"translate-y":[M]}],"skew-x":[{"skew-x":[k]}],"skew-y":[{"skew-y":[k]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",W]}],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",W]}],"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",W]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[pt,wt,ii]}],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"]}}},of=Bm(af),Mi={status:"",repo:"",thread:"",action:"",intent:"",actor:""},lf=new qu({defaultOptions:{queries:{retry:1}}}),to=12,uf=12,cf=10080*60*1e3,df=1e3,Al=Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC";function V(...e){return of(au(e))}async function ee(e,t){const n=new Headers(t==null?void 0:t.headers);n.set("Accept","application/json");const r=await fetch(e,{...t,headers:n});if(!r.ok)throw new Error(`${r.status} ${r.statusText}`);return r.json()}function Qe(e){if(e==null)return"n/a";const t=Math.max(0,Math.floor(e));if(t<60)return`${t}s`;const n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}const hf=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}),pf=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});function hr(e){if(!e)return null;const t=new Date(e);return Number.isNaN(t.getTime())?null:t}function mf(e){const t=hr(e);return t?hf.format(t):e??""}function Hn(e){const t=hr(e);return t?pf.format(t):e??""}function Ll(e,t){const n=hr(e);if(!n)return e??"";const r=t-n.getTime(),s=Math.abs(r);if(s>cf)return Hn(e);const a=r>=0?"ago":"from now",o=Math.round(s/1e3);if(o<45)return r>=0?"just now":"soon";if(o<90)return`1m ${a}`;const l=Math.round(o/60);if(l<60)return`${l}m ${a}`;if(l<90)return`1h ${a}`;const u=Math.round(l/60);return u<24?`${u}h ${a}`:u<36?`1d ${a}`:`${Math.round(u/24)}d ${a}`}function Ie({value:e,compact:t=!1,relative:n=!1,now:r=Date.now()}){const s=hr(e);return s?i.jsx("time",{dateTime:s.toISOString(),title:`UTC: ${s.toISOString()}`,children:n?Ll(e,r):t?Hn(e):mf(e)}):i.jsx(i.Fragment,{children:e??""})}function Ml(e,t){const n=hr(e);return n?Math.max(0,Math.floor((t-n.getTime())/1e3)):null}function as(e,t){return e.status==="running"?Ml(e.started_at,t)??e.runtime_seconds:e.runtime_seconds}function os(e,t){return e.status==="pending"?Ml(e.created_at,t)??e.queue_wait_seconds:e.queue_wait_seconds}function ff(e){const[t,n]=T.useState(()=>Date.now());return T.useEffect(()=>{if(!e)return;n(Date.now());const r=window.setInterval(()=>n(Date.now()),df);return()=>window.clearInterval(r)},[e]),t}function xf(e){return(e??"").split(/\r?\n/).map(n=>n.trim()).find(Boolean)??""}function Mr(e,t,n=1){const r=xf(t),s=n>1?` (${n})`:"";return r?`${e}${s}: ${r}`:`${e}${s}`}function Or(e){return e==="openclaw_stdout"||e==="openclaw_stderr"}function Ol(e){return e.map(t=>t==null?void 0:t.trim()).filter(Boolean).join(` -`)}function gf(e){const t=[];for(const n of e){const r=t[t.length-1];if(r&&Or(n.event_type)&&r.eventType===n.event_type){r.count+=1,r.meta=n.ts,r.detail=Ol([r.detail,n.detail]),r.summary=Mr(n.summary,r.detail,r.count);continue}t.push({id:String(n.id),badge:n.event_type,meta:n.ts,summary:Or(n.event_type)?Mr(n.summary,n.detail):n.summary,detail:n.detail,eventType:n.event_type,count:1})}return t}function bf(e){const t=[];return e.forEach((n,r)=>{const s=t[t.length-1];if(s&&Or(n.kind)&&s.kind===n.kind){s.count+=1,s.meta=n.timestamp,s.text=Ol([s.text,n.text]),s.summary=Mr(`${n.role} · ${n.kind}`,s.text,s.count);return}t.push({id:`${n.timestamp??"entry"}-${r}`,badge:n.title,meta:n.timestamp,summary:Or(n.kind)?Mr(`${n.role} · ${n.kind}`,n.text):`${n.role} · ${n.kind}`,text:n.text,kind:n.kind,count:1})}),t}function no(e,t,n,r){return e==="openclaw_stdout"?!1:t||n>=r-2}function yf(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 wf(e,t){const n=new URLSearchParams;for(const[r,s]of Object.entries(e))s.trim()&&n.set(r,s.trim());return n.set("limit",String(t)),`/api/jobs?${n.toString()}`}function vf(e,t,n=50){const r=new URLSearchParams;return e.trim()&&r.set("repo",e.trim()),t.trim()&&r.set("status",t.trim()),r.set("limit",String(n)),`/api/knowledge?${r.toString()}`}function jf(e){return{timeseries:e==="overview",hooks:e==="hooks",deliveries:e==="deliveries"}}function kf(e,t,n="day"){return`/api/webhooks/github/timeseries?${new URLSearchParams({from:e,to:t,bucket:n}).toString()}`}function Nf(e=50,t){const n=new URLSearchParams({limit:String(e)});return t&&n.set("cursor",t),`/api/webhooks/github/hooks?${n.toString()}`}function Sf(e=50,t,n){const r=new URLSearchParams({limit:String(e)});t&&r.set("cursor",t);for(const[s,a]of Object.entries(n??{}))a!=null&&a.trim()&&r.set(s,a.trim());return`/api/webhooks/github/deliveries?${r.toString()}`}function Sr(e=new Date){return{from:new Date(e.getTime()-720*60*60*1e3).toISOString(),to:e.toISOString()}}function Cf(e=Al){return`/api/metrics/summary?timezone=${encodeURIComponent(e)}`}function Ze(e){try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:"#"}catch{return"#"}}function Rr(){return"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window}function _f(e){return!!(e&&typeof e=="object"&&"type"in e&&e.type==="github-agent-bridge:push")}function Ef(e){const t="=".repeat((4-e.length%4)%4),n=(e+t).replace(/-/g,"+").replace(/_/g,"/"),r=window.atob(n),s=new Uint8Array(r.length);for(let a=0;an.id===t.id)?e:[...e,t]}function Rf(e,t){const n=ro(t);return e.some(r=>ro(r)===n)?e:[...e,t]}function ro(e){return`${e.timestamp??""}:${e.role}:${e.kind}:${e.title}:${e.text}`}function If(e){return["claimed","dispatch_started","dispatch_finished","done","blocked","denied","waiting_approval"].includes(e)}function zn(e){return["blocked","denied","waiting_approval"].includes(e)}function Oi(e,t){return e.status!=="running"?!1:t!=null&&t.is_admin?!0:!!(t!=null&&t.login&&e.trigger_actor&&t.login.toLowerCase()===e.trigger_actor.toLowerCase())}function Tf(e=window.location.pathname){const t=e.match(/^\/jobs\/(\d+)\/?$/);return t?Number(t[1]):null}function Af(e=window.location.pathname){return/^\/knowledge\/?$/.test(e)}function Lf(e=window.location.pathname){return/^\/mcp\/?$/.test(e)}function Mf(e=window.location.pathname){return/^\/system\/?$/.test(e)}function Of(e=window.location.pathname){const t=e.match(/^\/webhooks\/hooks\/([^/]+)\/?$/);return t?decodeURIComponent(t[1]):null}function si(e=window.location.pathname){return/^\/webhooks(?:\/hooks\/[^/]+)?\/?$/.test(e)}function Dl(e){return e.startsWith("repo:")?e.slice(5):e}function io(e){return Object.values(e).some(t=>t.trim()!=="")}function Df(e){return[{key:"status",label:"Status",value:e.status},{key:"repo",label:"Repo",value:e.repo},{key:"thread",label:"Thread",value:e.thread},{key:"action",label:"Action",value:e.action},{key:"actor",label:"Actor",value:e.actor.trim()?`@${e.actor.trim().replace(/^@/,"")}`:""},{key:"intent",label:"Intent",value:e.intent}].filter(t=>t.value.trim()!=="")}function Ff(){var cs,ds,hs,ps,ms,fs,xs,gs,bs,ys,ws,vs,js,ks,Ns,Ss,Cs,_s,Es,Ps,Rs,Is,Ts,As,Ls,Ms,Os,Ds,Fs,zs,qs,Bs,Us,$s,Hs,Ks,Qs,Vs,Ws,Gs,Js,Xs,Ys;const e=Do(),[t,n]=T.useState(Mi),[r,s]=T.useState(to),a=T.useRef(!1),[o,l]=T.useState(""),[u,c]=T.useState("proposed"),[d,h]=T.useState("overview"),[m,p]=T.useState({hook_id:"",event_name:"",repository:"",result:""}),[y,w]=T.useState(()=>Sr()),[j,b]=T.useState(null),[S,_]=T.useState(""),[N,q]=T.useState(()=>window.location.pathname),[k,B]=T.useState(null),M=Tf(N),v=M!==null,F=Af(N),L=Lf(N),P=Mf(N),G=si(N),z=Of(N),E=!v&&!F&&!L&&!P&&!G,O=M,Q=ge({queryKey:["metrics",Al],queryFn:()=>ee(Cf()),enabled:E||P}),he=ge({queryKey:["dashboard-status"],queryFn:()=>ee("/api/status")}),se=ge({queryKey:["me"],queryFn:()=>ee("/api/me"),refetchInterval:!1}),f=G&&!!((ds=(cs=se.data)==null?void 0:cs.user)!=null&&ds.is_admin&&((hs=he.data)!=null&&hs.webhook_configured)),ue=jf(d),Se=ge({queryKey:["web-push-config"],queryFn:()=>ee("/api/web-push/config"),enabled:!!((ps=se.data)!=null&&ps.user)}),x=ge({queryKey:["about"],queryFn:()=>ee("/api/about")}),De=ge({queryKey:["job-actors"],queryFn:()=>ee("/api/jobs/actors"),enabled:E}),we=ge({queryKey:["jobs",t,r],queryFn:()=>ee(wf(t,r)),enabled:E,placeholderData:A=>A}),me=ge({queryKey:["processes"],queryFn:()=>ee("/api/processes"),enabled:P}),et=ge({queryKey:["systemd"],queryFn:()=>ee("/api/systemd"),enabled:P}),Fe=ge({queryKey:["alerts"],queryFn:()=>ee("/api/alerts"),enabled:P}),Ve=ge({queryKey:["webhook-summary"],queryFn:()=>ee("/api/webhooks/github/summary"),enabled:f}),tt=ge({queryKey:["webhook-timeseries",y.from,y.to,"day"],queryFn:()=>ee(kf(y.from,y.to)),enabled:f&&ue.timeseries}),At=ge({queryKey:["webhook-exceptions"],queryFn:()=>ee("/api/webhooks/github/exceptions"),enabled:f&&ue.timeseries}),ct=pa({queryKey:["webhook-hooks"],queryFn:({pageParam:A})=>ee(Nf(50,A)),initialPageParam:null,getNextPageParam:A=>A.next_cursor??void 0,enabled:f&&ue.hooks&&z===null}),dt=pa({queryKey:["webhook-deliveries",m],queryFn:({pageParam:A})=>ee(Sf(50,A,m)),initialPageParam:null,getNextPageParam:A=>A.next_cursor??void 0,enabled:f&&ue.deliveries&&z===null}),Yt=ge({queryKey:["webhook-hook",z],queryFn:()=>ee(`/api/webhooks/github/hooks/${encodeURIComponent(z??"")}`),enabled:f&&z!==null}),Lt=ge({queryKey:["knowledge",o,u],queryFn:()=>ee(vf(o,u)),enabled:F}),Mt=ge({queryKey:["mcp-tokens"],queryFn:()=>ee("/api/mcp/tokens"),enabled:L&&!!((ms=se.data)!=null&&ms.user)}),pr=ge({queryKey:["mcp-users"],queryFn:()=>ee("/api/mcp/users"),enabled:L&&!!((fs=se.data)!=null&&fs.user)}),Zt=ge({queryKey:["job",O],queryFn:()=>ee(`/api/jobs/${O}`),enabled:O!==null}),_n=ge({queryKey:["job-session",O],queryFn:()=>ee(`/api/jobs/${O}/session`),enabled:O!==null}),En=ge({queryKey:["job-session-events",O],queryFn:()=>ee(`/api/jobs/${O}/session/events`),enabled:O!==null}),mr=ge({queryKey:["job-session-transcript",O],queryFn:()=>ee(`/api/jobs/${O}/session/transcript`),enabled:O!==null}),fr=T.useCallback(async A=>{const ae=await ee(`/api/jobs/${A}/retry`,{method:"POST"});e.setQueryData(["job",A],{job:ae.job}),e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["metrics"]})},[e]),xr=T.useCallback(async A=>{const ae=await ee(`/api/jobs/${A}/dismiss`,{method:"POST"});e.setQueryData(["job",A],{job:ae.job}),e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["metrics"]})},[e]),gr=T.useCallback(async(A,ae)=>{const pe=await ee(`/api/jobs/${A}/cancel`,{method:"POST",body:JSON.stringify({reason:ae||""})});e.setQueryData(["job",A],{job:pe.job}),e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["metrics"]}),e.invalidateQueries({queryKey:["dashboard-status"]})},[e]),br=T.useCallback(async(A,ae)=>{await ee(`/api/knowledge/proposals/${encodeURIComponent(A)}/${ae}`,{method:"POST"}),e.invalidateQueries({queryKey:["knowledge"]}),e.invalidateQueries({queryKey:["dashboard-status"]})},[e]),C=T.useCallback(async A=>{await ee(`/api/knowledge/rules/${encodeURIComponent(A)}`,{method:"DELETE"}),e.invalidateQueries({queryKey:["knowledge"]})},[e]),I=T.useCallback(async(A,ae)=>{await ee(`/api/knowledge/rules/${encodeURIComponent(A)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({scope:ae})}),e.invalidateQueries({queryKey:["knowledge"]})},[e]),H=T.useCallback(async(A,ae)=>{const pe=await ee("/api/mcp/tokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:A,user_login:ae||void 0})});return e.invalidateQueries({queryKey:["mcp-tokens"]}),pe},[e]),X=T.useCallback(async(A,ae)=>{await ee(`/api/mcp/tokens/${encodeURIComponent(A)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({user_login:ae})}),e.invalidateQueries({queryKey:["mcp-tokens"]}),e.invalidateQueries({queryKey:["mcp-users"]})},[e]),ie=T.useCallback(async A=>{await ee(`/api/mcp/tokens/${encodeURIComponent(A)}`,{method:"DELETE"}),e.invalidateQueries({queryKey:["mcp-tokens"]})},[e]),Pe=T.useCallback(async A=>{const ae={refresh:"/api/autoupdate/refresh",apply:"/api/autoupdate/apply",complete:"/api/autoupdate/complete-pending"}[A];b(A),_("");try{await ee(ae,{method:"POST"}),e.invalidateQueries({queryKey:["dashboard-status"]})}catch(pe){e.invalidateQueries({queryKey:["dashboard-status"]}),_(pe instanceof Error?pe.message:String(pe))}finally{b(null)}},[e]),ht=T.useCallback(async()=>{var Zs;const A=(Zs=Se.data)==null?void 0:Zs.public_key;if(!A)throw new Error("web_push_not_configured");if(!Rr())throw new Error("web_push_not_supported");if(await window.Notification.requestPermission()!=="granted")throw new Error("notification_permission_denied");const pe=await navigator.serviceWorker.register("/service-worker.js"),ru=await pe.pushManager.getSubscription()??await pe.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Ef(A)});await ee("/api/web-push/subscriptions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ru.toJSON())}),e.invalidateQueries({queryKey:["web-push-config"]})},[e,(xs=Se.data)==null?void 0:xs.public_key]),We=T.useCallback(async()=>{if(!Rr())return;const ae=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!ae)return;const pe=ae.endpoint;await ae.unsubscribe(),await ee("/api/web-push/subscriptions",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({endpoint:pe})}),e.invalidateQueries({queryKey:["web-push-config"]})},[e]);T.useEffect(()=>{var A;!((A=Se.data)!=null&&A.status.enabled)||!Rr()||navigator.serviceWorker.register("/service-worker.js").catch(()=>{})},[(gs=Se.data)==null?void 0:gs.status.enabled]),T.useEffect(()=>{if(O===null)return;const A=new EventSource(`/api/jobs/${O}/session/stream`);return A.addEventListener("session_event",ae=>{const pe=Dr(ae);pe&&(e.setQueryData(["job-session-events",O],bt=>({events:Pf((bt==null?void 0:bt.events)??[],pe)})),If(pe.event_type)&&(e.invalidateQueries({queryKey:["job",O]}),e.invalidateQueries({queryKey:["jobs"]})))}),A.addEventListener("transcript_entry",ae=>{const pe=Dr(ae);!pe||pe.job_id!==O||e.setQueryData(["job-session-transcript",O],bt=>({entries:Rf((bt==null?void 0:bt.entries)??[],pe.entry)}))}),A.onerror=()=>{e.invalidateQueries({queryKey:["job",O]}),e.invalidateQueries({queryKey:["job-session-events",O]}),e.invalidateQueries({queryKey:["job-session-transcript",O]})},()=>A.close()},[O,e]),T.useEffect(()=>{const A=()=>{si(window.location.pathname)&&w(Sr()),q(window.location.pathname)};return window.addEventListener("popstate",A),()=>window.removeEventListener("popstate",A)},[]),T.useEffect(()=>{if(!("serviceWorker"in navigator))return;const A=ae=>{if(!_f(ae.data))return;const pe={...ae.data.payload,id:Date.now(),receivedAt:Date.now()};B(pe),pe.job_id&&(e.invalidateQueries({queryKey:["jobs"]}),e.invalidateQueries({queryKey:["job",pe.job_id]}),e.invalidateQueries({queryKey:["metrics"]}))};return navigator.serviceWorker.addEventListener("message",A),()=>navigator.serviceWorker.removeEventListener("message",A)},[e]),T.useEffect(()=>{if(!k)return;const A=window.setTimeout(()=>B(null),12e3);return()=>window.clearTimeout(A)},[k]);const Ot=T.useCallback(A=>{window.history.pushState({},"",Sn(A)),q(window.location.pathname)},[]),$e=T.useCallback(A=>{window.history.pushState({},"",A),si(A)&&w(Sr()),q(window.location.pathname)},[]),be=((bs=Q.data)==null?void 0:bs.metrics.status_counts)??{},Ge=((ys=we.data)==null?void 0:ys.jobs)??[],Je=T.useCallback(A=>{n(A),s(to),a.current=!1},[]);T.useEffect(()=>{we.isFetching||(a.current=!1)},[we.isFetching]);const Gl=T.useCallback(()=>{a.current||(a.current=!0,s(A=>A+uf))},[]),gt=O?((ws=Zt.data)==null?void 0:ws.job)??null:null,Jl=Ge.some(A=>A.status==="running"||A.status==="pending")||(gt==null?void 0:gt.status)==="running"||(gt==null?void 0:gt.status)==="pending"||!!((vs=me.data)!=null&&vs.running_jobs.length),Pn=ff(Jl),Xl=i.jsx(Yf,{selectedJobId:O,selectedJob:gt,loading:Zt.isLoading,error:Zt.error,session:(js=_n.data)==null?void 0:js.session,sessionEvents:(ks=En.data)==null?void 0:ks.events,transcript:(Ns=mr.data)==null?void 0:Ns.entries,now:Pn}),Yl=((Ss=ct.data)==null?void 0:Ss.pages.flatMap(A=>A.hooks))??[],Zl=((Cs=dt.data)==null?void 0:Cs.pages.flatMap(A=>A.deliveries))??[],eu=d==="overview"?tt.isLoading:d==="hooks"?ct.isLoading:dt.isLoading,tu=d==="overview"?tt.error:d==="hooks"?ct.error:dt.error,nu=()=>{Ve.refetch(),d==="overview"&&At.refetch(),d==="overview"&&w(Sr()),d==="hooks"&&ct.refetch(),d==="deliveries"&&dt.refetch()};return i.jsxs("div",{className:"min-h-screen bg-background text-foreground",children:[i.jsx("header",{className:"border-b border-slate-800 bg-slate-950 text-white",children:i.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:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h1",{className:"truncate text-xl font-semibold",children:"GitHub Agent Bridge"}),i.jsx(zf,{about:x.data})]}),i.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[i.jsx(cx,{config:Se.data,loading:Se.isLoading,onEnable:ht,onDisable:We}),i.jsx(ux,{user:(_s=se.data)==null?void 0:_s.user,loading:se.isLoading})]})]})}),i.jsxs("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:[i.jsx(Kf,{isDashboardRoute:E,isSystemRoute:P,isKnowledgeRoute:F,isMcpRoute:L,isWebhooksRoute:G,showWebhooks:!!((Ps=(Es=se.data)==null?void 0:Es.user)!=null&&Ps.is_admin&&((Rs=he.data)!=null&&Rs.webhook_configured)),knowledgeBadgeCount:((As=(Ts=(Is=he.data)==null?void 0:Is.metrics)==null?void 0:Ts.knowledge)==null?void 0:As.proposed)??0,onNavigate:$e}),i.jsx(dx,{notification:k,onDismiss:()=>B(null),onNavigate:$e}),M!==null?i.jsx(Xf,{jobId:M,detail:Xl,selectedJob:gt,user:(Ls=se.data)==null?void 0:Ls.user,onBackToDashboard:()=>$e("/"),onRetry:fr,onDismiss:xr,onCancel:gr,onRefresh:()=>{Zt.refetch(),_n.refetch(),En.refetch(),mr.refetch()}}):F?i.jsx(Zf,{data:Lt.data,loading:Lt.isLoading,error:Lt.error,repo:o,status:u,user:(Ms=se.data)==null?void 0:Ms.user,now:Pn,onRepoChange:l,onStatusChange:c,onApprove:A=>br(A,"approve"),onReject:A=>br(A,"reject"),onUpdateRuleScope:I,onDeleteRule:C,onRefresh:()=>Lt.refetch()}):L?i.jsx(sx,{tokens:(Os=Mt.data)==null?void 0:Os.tokens,loading:Mt.isLoading,error:Mt.error,user:(Ds=se.data)==null?void 0:Ds.user,ownerOptions:((Fs=pr.data)==null?void 0:Fs.users)??[],dashboardUrl:(zs=he.data)==null?void 0:zs.dashboard_url,dashboardUrlSource:(qs=he.data)==null?void 0:qs.dashboard_url_source,now:Pn,onCreate:H,onUpdateOwner:X,onRevoke:ie,onRefresh:()=>Mt.refetch()}):G?z?i.jsx(Gf,{data:Yt.data,loading:Yt.isLoading,error:Yt.error,onBack:()=>{h("hooks"),$e("/webhooks")},onRefresh:()=>Yt.refetch(),onViewHook:A=>$e(`/webhooks/hooks/${encodeURIComponent(A)}`)}):i.jsx(Qf,{summary:Ve.data,timeseries:(Bs=tt.data)==null?void 0:Bs.points,exceptions:(Us=At.data)==null?void 0:Us.exceptions,hooks:Yl,deliveries:Zl,section:d,summaryLoading:Ve.isLoading,sectionLoading:eu,loadingMore:d==="hooks"?ct.isFetchingNextPage:dt.isFetchingNextPage,hasMore:d==="hooks"?ct.hasNextPage:dt.hasNextPage,deliveryFilters:m,error:Ve.error??tu,onSectionChange:h,onLoadMore:()=>d==="hooks"?ct.fetchNextPage():dt.fetchNextPage(),onDeliveryFiltersChange:p,onViewHook:A=>$e(`/webhooks/hooks/${encodeURIComponent(A)}`),onRefresh:nu}):P?i.jsx(Jf,{processes:me.data,processesLoading:me.isLoading,processesError:me.error,systemd:et.data,systemdLoading:et.isLoading,systemdError:et.error,alerts:($s=Fe.data)==null?void 0:$s.alerts,alertsLoading:Fe.isLoading,alertsError:Fe.error,now:Pn,onRefreshProcesses:()=>me.refetch(),onRefreshSystemd:()=>et.refetch(),onRefreshAlerts:()=>Fe.refetch()}):i.jsxs(i.Fragment,{children:[Q.error?i.jsx(Ne,{tone:"error",text:Q.error.message}):null,he.error?i.jsx(Ne,{tone:"error",text:he.error.message}):null,i.jsx(qf,{state:(Hs=he.data)==null?void 0:Hs.autoupdate,isAdmin:!!((Qs=(Ks=se.data)==null?void 0:Ks.user)!=null&&Qs.is_admin),runningAction:j,actionError:S,onRefresh:()=>Pe("refresh"),onApply:()=>Pe("apply"),onCompletePending:()=>Pe("complete")}),i.jsxs("section",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Summary metrics",children:[i.jsx(_e,{title:"Pending",value:be.pending??0,icon:i.jsx($o,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Running",value:be.running??0,icon:i.jsx(bn,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Blocked",value:be.blocked??0,icon:i.jsx(zr,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Done",value:be.done??0,icon:i.jsx(wn,{className:"h-5 w-5"})})]}),i.jsxs("section",{className:"grid gap-3",children:[i.jsx(hx,{count:Ge.length,limit:r,loading:we.isLoading,onRefresh:()=>we.refetch()}),i.jsxs(fe,{title:"Recent jobs",flushHeader:!0,children:[i.jsx(px,{filters:t,actorOptions:((Vs=De.data)==null?void 0:Vs.actors)??[],onChange:Je}),we.error?i.jsx(Ne,{tone:"error",text:we.error.message}):null,i.jsx(fx,{jobs:Ge,loading:we.isLoading,loadingMore:we.isFetching&&!we.isLoading,hasMore:Ge.length>=r,onLoadMore:Gl,onViewJob:Ot,now:Pn,user:(Ws=se.data)==null?void 0:Ws.user,onRetry:fr,onDismiss:xr,onCancel:gr})]}),i.jsx(fe,{title:"Runtime usage",action:i.jsx(lt,{onClick:()=>Q.refetch()}),children:i.jsx(Ex,{usage:(Gs=Q.data)==null?void 0:Gs.metrics.runtime_usage,loading:Q.isLoading,totalJobs:lo(be)})})]}),i.jsxs("section",{className:"grid gap-4 xl:grid-cols-3",children:[i.jsx(fe,{title:"Runtime percentiles",children:i.jsx(oo,{label:"runtime",values:(Js=Q.data)==null?void 0:Js.metrics.runtime_seconds})}),i.jsx(fe,{title:"Jobs per day",children:i.jsx(_x,{values:(Xs=Q.data)==null?void 0:Xs.metrics.by_created_day,loading:Q.isLoading,totalJobs:lo(be)})}),i.jsx(fe,{title:"Queue wait percentiles",children:i.jsx(oo,{label:"queue wait",values:(Ys=Q.data)==null?void 0:Ys.metrics.queue_wait_seconds})})]})]})]})]})}function zf({about:e}){const t=e!=null&&e.version?`v${e.version}`:"version loading";return i.jsxs("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-slate-300",children:[i.jsx("span",{children:"Operational dashboard"}),i.jsx("span",{className:"font-mono text-xs text-slate-400",children:t}),e!=null&&e.repository_url?i.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-slate-200 hover:underline",href:Ze(e.repository_url),rel:"noreferrer",target:"_blank",children:[i.jsx(Gt,{className:"h-3.5 w-3.5","aria-hidden":!0}),"GitHub"]}):null]})}function qf({state:e,isAdmin:t,runningAction:n=null,actionError:r="",onRefresh:s,onApply:a,onCompletePending:o}){var j,b,S,_,N,q,k,B,M,v,F;if(!e)return null;const l=(b=(j=e==null?void 0:e.target)==null?void 0:j.tag_name)==null?void 0:b.trim();if(!t||!l||(e==null?void 0:e.decision)==="noop")return null;const u=Bf(e.decision),c=((S=e.queue)==null?void 0:S.active_total)??0,d=Uf((_=e.classification)==null?void 0:_.risk),h=$f((N=e.target)==null?void 0:N.body),m=((k=(q=e.classification)==null?void 0:q.migration_files)==null?void 0:k.length)??0,p=((M=(B=e.classification)==null?void 0:B.risky_files)==null?void 0:M.length)??0,y=!!(e.executor_reload_pending&&e.dashboard_applied_at&&o),w=!!(a&&m===0);return i.jsxs("section",{className:"rounded-md border border-amber-300 bg-amber-50 p-3 text-amber-950 shadow-sm","aria-label":"Update available",children:[i.jsxs("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i.jsx(zr,{className:"h-4 w-4 text-amber-700","aria-hidden":!0}),i.jsx("h2",{className:"text-sm font-semibold",children:"Update available"}),i.jsx("span",{className:"rounded-sm border border-amber-300 bg-white px-1.5 py-0.5 font-mono text-[11px] text-amber-800",children:l}),(v=e.target)!=null&&v.url?i.jsxs("a",{className:"inline-flex items-center gap-1 text-xs font-semibold text-amber-800 hover:underline",href:Ze(e.target.url),rel:"noreferrer",target:"_blank",children:[i.jsx(Gt,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Release"]}):null]}),i.jsxs("p",{className:"mt-1 text-sm text-amber-900",children:[u,e.installed_tag?i.jsxs("span",{className:"font-mono",children:[" from ",e.installed_tag]}):null]}),i.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[s?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-amber-300 bg-white px-2.5 text-xs font-semibold text-amber-900 hover:bg-amber-100 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:n!==null,onClick:s,children:[i.jsx(ur,{className:V("h-3.5 w-3.5",n==="refresh"&&"animate-spin"),"aria-hidden":!0}),n==="refresh"?"Checking...":"Check now"]}):null,w?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md bg-amber-800 px-2.5 text-xs font-semibold text-white hover:bg-amber-900 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:n!==null,onClick:()=>{window.confirm(`Apply ${l}? This can restart bridge services according to the recorded safe plan.`)&&(a==null||a())},children:[i.jsx(wn,{className:"h-3.5 w-3.5","aria-hidden":!0}),n==="apply"?"Applying...":"Apply update"]}):null,y?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-amber-300 bg-white px-2.5 text-xs font-semibold text-amber-900 hover:bg-amber-100 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:n!==null,onClick:o,children:[i.jsx(Gn,{className:"h-3.5 w-3.5","aria-hidden":!0}),n==="complete"?"Completing...":"Complete reload"]}):null]})]}),i.jsxs("div",{className:"grid gap-2 text-xs sm:grid-cols-3 lg:min-w-[420px]",children:[i.jsx(ai,{label:"Impact",value:d}),i.jsx(ai,{label:"Active jobs",value:String(c)}),i.jsx(ai,{label:"Admin only",value:"autoupdate"})]})]}),e.blocked_reason||e.executor_reload_pending||m>0||p>0?i.jsxs("div",{className:"mt-3 flex flex-wrap gap-2 text-xs",children:[e.executor_reload_pending?i.jsx("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1 font-semibold",children:"executor reload pending"}):null,e.blocked_reason?i.jsx("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1 font-mono",children:e.blocked_reason}):null,m>0?i.jsxs("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1",children:[m," migration file",m===1?"":"s"]}):null,p>0?i.jsxs("span",{className:"rounded-sm border border-amber-300 bg-white px-2 py-1",children:[p," executor/shared file",p===1?"":"s"]}):null]}):null,h?i.jsxs("div",{className:"mt-3 rounded-md border border-amber-200 bg-white/70 p-2.5",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-amber-800",children:"Changelog preview"}),i.jsx(Hf,{markdown:h})]}):null,(F=e.warnings)!=null&&F.length?i.jsx("div",{className:"mt-2 font-mono text-xs text-amber-800",children:e.warnings[0]}):null,r?i.jsxs("div",{className:"mt-2 rounded-sm border border-amber-300 bg-white px-2 py-1 font-mono text-xs text-amber-900",children:["Action failed: ",r]}):null]})}function ai({label:e,value:t}){return i.jsxs("div",{className:"min-w-0 rounded-md border border-amber-200 bg-white/80 px-2 py-1.5",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-amber-700",children:e}),i.jsx("div",{className:"mt-0.5 truncate font-mono text-xs text-amber-950",children:t})]})}function Bf(e){return{stage_dashboard_reload:"Dashboard reload can be staged now",stage_defer_executor_reload:"Dashboard reload can be staged; executor reload waits for the queue",stage_full_reload:"Full reload can be staged now",defer_migration:"Migration release is waiting for a quiet queue"}[e??""]??"Update plan recorded"}function Uf(e){return{dashboard_only:"dashboard only",executor_or_queue:"executor or queue",executor_or_shared:"executor or shared",migration_required:"migration",none:"none"}[e??""]??"unknown"}function $f(e){return(e??"").trim()}function Hf({markdown:e}){return i.jsx("div",{className:"mt-1 text-sm leading-relaxed text-amber-950",children:i.jsx(Nm,{allowedElements:["a","blockquote","code","em","h1","h2","h3","h4","li","ol","p","strong","ul"],components:{a:({href:t,children:n})=>i.jsx("a",{className:"font-semibold text-amber-800 underline underline-offset-2",href:Ze(t??""),rel:"noreferrer",target:"_blank",children:n}),blockquote:({children:t})=>i.jsx("blockquote",{className:"mt-2 border-l-2 border-amber-300 pl-2 text-amber-900",children:t}),code:({children:t})=>i.jsx("code",{className:"rounded-sm bg-amber-100 px-1 py-0.5 font-mono text-[0.85em] text-amber-950",children:t}),h1:({children:t})=>i.jsx("h3",{className:"mt-2 text-sm font-semibold text-amber-950 first:mt-0",children:t}),h2:({children:t})=>i.jsx("h3",{className:"mt-2 text-sm font-semibold text-amber-950 first:mt-0",children:t}),h3:({children:t})=>i.jsx("h3",{className:"mt-2 text-sm font-semibold text-amber-950 first:mt-0",children:t}),h4:({children:t})=>i.jsx("h4",{className:"mt-2 text-xs font-semibold uppercase text-amber-800 first:mt-0",children:t}),li:({children:t})=>i.jsx("li",{className:"break-words pl-0.5 [overflow-wrap:anywhere]",children:t}),ol:({children:t})=>i.jsx("ol",{className:"mt-1 list-decimal space-y-1 pl-5 first:mt-0",children:t}),p:({children:t})=>i.jsx("p",{className:"mt-1 break-words [overflow-wrap:anywhere] first:mt-0",children:t}),strong:({children:t})=>i.jsx("strong",{className:"font-semibold",children:t}),em:({children:t})=>i.jsx("em",{className:"italic",children:t}),ul:({children:t})=>i.jsx("ul",{className:"mt-1 list-disc space-y-1 pl-5 first:mt-0",children:t})},children:e})})}function Kf({isDashboardRoute:e,isSystemRoute:t=!1,isKnowledgeRoute:n,isMcpRoute:r=!1,isWebhooksRoute:s=!1,showWebhooks:a=!1,knowledgeBadgeCount:o=0,onNavigate:l}){return i.jsxs("nav",{className:"flex min-w-0 rounded-lg border border-border bg-panel p-1 shadow-sm","aria-label":"Dashboard sections",children:[i.jsxs(Dn,{href:"/",active:e,onNavigate:l,children:[i.jsx(Qo,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"Jobs"})]}),i.jsxs(Dn,{href:"/system",active:t,onNavigate:l,children:[i.jsx(nc,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"System"})]}),a?i.jsxs(Dn,{href:"/webhooks",active:s,onNavigate:l,children:[i.jsx(bn,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"Webhooks"})]}):null,i.jsxs(Dn,{href:"/knowledge",active:n,onNavigate:l,children:[i.jsx(Hi,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"Knowledge"}),o>0?i.jsx("span",{className:V("inline-flex h-5 min-w-5 items-center justify-center rounded-full border px-1 font-mono text-[11px] leading-none",n?"border-white/40 bg-white/15 text-white":"border-amber-200 bg-amber-100 text-amber-800"),"aria-label":`${o} proposed knowledge ${o===1?"item":"items"}`,children:o}):null]}),i.jsxs(Dn,{href:"/mcp",active:r,onNavigate:l,children:[i.jsx(Tr,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{children:"MCP"})]})]})}function qn({text:e}){return i.jsxs("div",{className:"flex items-center justify-center gap-2 py-10 text-sm text-muted",children:[i.jsx(ur,{className:"h-4 w-4 animate-spin","aria-hidden":!0}),e]})}function Qf({summary:e,timeseries:t,exceptions:n,hooks:r,deliveries:s,section:a,summaryLoading:o,sectionLoading:l,loadingMore:u,hasMore:c,deliveryFilters:d,error:h,onSectionChange:m,onLoadMore:p,onDeliveryFiltersChange:y,onViewHook:w,onRefresh:j}){var _,N,q,k,B,M;const b=Object.values((e==null?void 0:e.receipts)??{}).reduce((v,F)=>v+F,0),S=[{id:"overview",label:"Overview"},{id:"hooks",label:"Hooks",count:(_=e==null?void 0:e.totals)==null?void 0:_.hooks},{id:"deliveries",label:"Deliveries",count:(N=e==null?void 0:e.totals)==null?void 0:N.deliveries}];return i.jsxs("section",{className:"grid gap-4",children:[i.jsx(zl,{icon:i.jsx(bn,{className:"h-5 w-5 text-muted","aria-hidden":!0}),title:"GitHub webhooks",subtitle:(e==null?void 0:e.mode)==="canary"?"Canary ingestion health. Only enabled repositories may create jobs.":"Shadow ingestion health. Deliveries are observed but do not create jobs.",action:i.jsx(lt,{onClick:j})}),h?i.jsx(Ne,{tone:"error",text:h.message}):null,i.jsx("div",{className:"flex max-w-full flex-wrap rounded-md border border-border bg-white p-1",role:"tablist","aria-label":"Webhook dashboard section",children:S.map(v=>i.jsxs("button",{type:"button",role:"tab","aria-label":v.count===void 0?v.label:`${v.label} (${v.count} total)`,"aria-selected":a===v.id,className:V("inline-flex h-8 items-center gap-2 rounded px-3 text-sm font-semibold",a===v.id?"bg-primary text-white":"text-muted hover:bg-slate-50 hover:text-foreground"),onClick:()=>m(v.id),children:[v.label,v.count!==void 0?i.jsx("span",{className:"rounded border border-current/30 px-1 font-mono text-[10px]",children:v.count}):null]},v.id))}),i.jsxs("div",{className:"grid grid-cols-2 gap-3 xl:grid-cols-4","aria-label":"Webhook status",children:[i.jsx(_e,{title:"Receipts",value:b,icon:i.jsx(bn,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Duplicates",value:(e==null?void 0:e.duplicate_deliveries)??0,icon:i.jsx(ur,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Cross-source matches",value:(e==null?void 0:e.cross_source_matches)??0,icon:i.jsx(vn,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Mode",value:o?"…":(e==null?void 0:e.mode)??"unknown",icon:i.jsx(Ho,{className:"h-5 w-5"})})]}),a==="overview"?i.jsxs(i.Fragment,{children:[i.jsx(fe,{title:"Delivery activity",children:l?i.jsx(qn,{text:"Loading delivery activity…"}):t!=null&&t.length?i.jsx("div",{className:"h-72","aria-label":"Webhook deliveries over time",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(Fr,{data:t,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"bucket"}),i.jsx(ar,{allowDecimals:!1}),i.jsx(or,{}),i.jsx(ko,{}),i.jsx(Vt,{dataKey:"observed",stackId:"deliveries",fill:"#2563eb"}),i.jsx(Vt,{dataKey:"duplicate",stackId:"deliveries",fill:"#f59e0b"}),i.jsx(Vt,{dataKey:"unsupported",stackId:"deliveries",fill:"#94a3b8"})]})})}):i.jsx(Z,{text:"No webhook activity in the selected 30-day window."})}),i.jsx(fe,{title:"Receipt states",children:o?i.jsx(qn,{text:"Loading webhook summary…"}):Object.keys((e==null?void 0:e.receipts)??{}).length?i.jsx("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:Object.entries((e==null?void 0:e.receipts)??{}).sort(([v],[F])=>v.localeCompare(F)).map(([v,F])=>i.jsx(J,{label:v,value:F},v))}):i.jsx(Z,{text:"No webhook deliveries observed yet."})}),i.jsx(fe,{title:"Cross-source coverage",children:i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-4",children:[i.jsx(J,{label:"Both sources",value:((q=e==null?void 0:e.coverage)==null?void 0:q.both)??0}),i.jsx(J,{label:"IMAP only",value:((k=e==null?void 0:e.coverage)==null?void 0:k.imap_only)??0}),i.jsx(J,{label:"Webhook only",value:((B=e==null?void 0:e.coverage)==null?void 0:B.webhook_only)??0}),i.jsx(J,{label:"Coverage",value:((M=e==null?void 0:e.coverage)==null?void 0:M.ratio)==null?"not measurable":`${Math.round(e.coverage.ratio*100)}%`})]})}),i.jsx(fe,{title:"Exceptions requiring review",children:n!=null&&n.length?i.jsx("div",{className:"overflow-x-auto",children:i.jsxs("table",{className:"w-full min-w-[720px] text-left text-sm",children:[i.jsx("thead",{className:"border-b border-border text-xs text-muted",children:i.jsxs("tr",{children:[i.jsx("th",{className:"px-3 py-2",children:"Type"}),i.jsx("th",{className:"px-3 py-2",children:"Repository"}),i.jsx("th",{className:"px-3 py-2",children:"Reference"}),i.jsx("th",{className:"px-3 py-2",children:"Observed"})]})}),i.jsx("tbody",{children:n.map(v=>i.jsxs("tr",{className:"border-b border-border/70 last:border-0",children:[i.jsx("td",{className:"px-3 py-2 font-semibold",children:v.kind}),i.jsx("td",{className:"px-3 py-2 font-mono text-xs",children:v.repository??"unknown"}),i.jsx("td",{className:"px-3 py-2 font-mono text-xs",children:v.event_key??v.reference}),i.jsx("td",{className:"px-3 py-2 font-mono text-xs text-muted",children:v.created_at})]},`${v.kind}:${v.reference}`))})]})}):i.jsx(Z,{text:"No cross-source exceptions in retained data."})})]}):null,a==="hooks"?i.jsx(fe,{title:"Hook inventory",children:l?i.jsx(qn,{text:"Loading hook inventory…"}):r!=null&&r.length?i.jsx(Di,{noun:"hooks",hasMore:c,loading:u,onLoadMore:p,children:i.jsxs("table",{className:"w-full min-w-[920px] text-left text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"sticky top-0 z-10 border-b border-border bg-panel text-left text-xs text-muted",children:[i.jsx("th",{className:"px-3 py-2",children:"Target"}),i.jsx("th",{className:"px-3 py-2",children:"State"}),i.jsx("th",{className:"px-3 py-2",children:"Configuration"}),i.jsx("th",{className:"px-3 py-2",children:"Last delivery"}),i.jsx("th",{className:"px-3 py-2",children:"Last ping"})]})}),i.jsx("tbody",{children:r.map(v=>i.jsxs("tr",{className:"cursor-pointer border-b border-border/70 last:border-0 hover:bg-slate-50",onClick:()=>w(v.id),children:[i.jsxs("td",{className:"px-3 py-3",children:[i.jsx("button",{type:"button",className:"text-left font-semibold text-primary hover:underline",onClick:F=>{F.stopPropagation(),w(v.id)},children:v.target}),i.jsxs("div",{className:"font-mono text-xs text-muted",children:[v.target_type," · #",v.id]})]}),i.jsx("td",{className:"px-3 py-3",children:i.jsx("span",{className:V("rounded border px-2 py-1 text-xs font-semibold",v.status==="receiving"?"border-emerald-200 bg-emerald-50 text-emerald-700":v.status==="inactive"?"border-red-200 bg-red-50 text-red-700":"border-slate-200 bg-slate-50 text-slate-600"),children:v.status})}),i.jsxs("td",{className:"max-w-sm px-3 py-3 text-xs",children:[i.jsx("div",{children:v.events.join(", ")||"No event snapshot"}),i.jsxs("div",{className:"mt-1 font-mono text-muted",children:[v.content_type??"content type unknown"," · SSL ",v.ssl_verify===null||v.ssl_verify===void 0?"unknown":v.ssl_verify?"verified":"disabled"]})]}),i.jsxs("td",{className:"px-3 py-3 text-xs",children:[i.jsxs("div",{className:"font-semibold",children:[v.last_event_name??"Never",v.last_action?` · ${v.last_action}`:""]}),i.jsx("div",{className:"mt-1 font-mono text-muted",children:v.last_repository??v.last_event_at??"No delivery observed"})]}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs text-muted",children:v.last_ping_at??"Never"})]},v.id))})]})}):i.jsx(Z,{text:"No hook inventory is available. Redeliver a signed ping from GitHub to create the sanitized configuration snapshot."})}):null,a==="deliveries"?i.jsxs(fe,{title:"Recent deliveries",children:[i.jsx(Vf,{filters:d,onChange:y}),l?i.jsx(qn,{text:"Loading deliveries…"}):s!=null&&s.length?i.jsx(Di,{noun:"deliveries",hasMore:c,loading:u,onLoadMore:p,children:i.jsx(Fl,{deliveries:s,onViewHook:w})}):i.jsx(Z,{text:"No deliveries match the current filters."})]}):null]})}function Vf({filters:e,onChange:t}){const n=[{key:"hook_id",label:"Hook ID",placeholder:"690954530"},{key:"event_name",label:"Event",placeholder:"issue_comment"},{key:"repository",label:"Repository",placeholder:"gisce/repository"},{key:"result",label:"Result",placeholder:"observed"}];return i.jsx("div",{className:"grid gap-2 border-b border-border p-3 sm:grid-cols-2 xl:grid-cols-4",children:n.map(r=>i.jsxs("label",{className:"grid gap-1 text-xs font-semibold text-muted",children:[r.label,i.jsx("input",{className:"h-9 rounded-md border border-border bg-white px-2 font-mono text-xs text-foreground",value:e[r.key],placeholder:r.placeholder,onChange:s=>t({...e,[r.key]:s.target.value})})]},r.key))})}function Fl({deliveries:e,onViewHook:t}){return i.jsxs("table",{className:"w-full min-w-[980px] text-left text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"sticky top-0 z-10 border-b border-border bg-panel text-left text-xs text-muted",children:[i.jsx("th",{className:"px-3 py-2",children:"Received"}),i.jsx("th",{className:"px-3 py-2",children:"Hook"}),i.jsx("th",{className:"px-3 py-2",children:"Event"}),i.jsx("th",{className:"px-3 py-2",children:"Repository"}),i.jsx("th",{className:"px-3 py-2",children:"Result"}),i.jsx("th",{className:"px-3 py-2",children:"Delivery"})]})}),i.jsx("tbody",{children:e.map(n=>{var r;return i.jsxs("tr",{className:"border-b border-border/70 last:border-0",children:[i.jsx("td",{className:"px-3 py-3 font-mono text-xs text-muted",children:n.created_at}),i.jsx("td",{className:"px-3 py-3",children:n.hook_id?i.jsxs("button",{type:"button",className:"text-left text-primary hover:underline",onClick:()=>t(n.hook_id),children:[i.jsx("span",{className:"block font-semibold",children:((r=n.hook)==null?void 0:r.target)??`Hook #${n.hook_id}`}),i.jsxs("span",{className:"font-mono text-xs",children:["#",n.hook_id]})]}):i.jsx("span",{className:"text-xs text-muted",children:"Unknown (legacy)"})}),i.jsxs("td",{className:"px-3 py-3 font-semibold",children:[n.event_name,n.action?` · ${n.action}`:""]}),i.jsx("td",{className:"px-3 py-3",children:n.repository??"—"}),i.jsxs("td",{className:"px-3 py-3",children:[i.jsx("span",{className:"rounded border border-border bg-slate-50 px-2 py-1 text-xs font-semibold",children:n.status}),n.duplicate_count?i.jsxs("span",{className:"ml-2 font-mono text-xs text-muted",children:[n.duplicate_count," retries"]}):null]}),i.jsx("td",{className:"max-w-[14rem] truncate px-3 py-3 font-mono text-xs text-muted",title:n.delivery_id,children:n.delivery_id})]},n.delivery_id)})})]})}function Di({noun:e,hasMore:t,loading:n,onLoadMore:r,children:s,className:a}){return i.jsxs("div",{"data-testid":`lazy-scroll-${e}`,className:V("max-h-[640px] overflow-auto rounded-md border border-border",a),children:[s,i.jsx(Wf,{noun:e,hasMore:t,loading:n,onLoadMore:r})]})}function Wf({noun:e,hasMore:t,loading:n,onLoadMore:r}){const s=T.useRef(null),a=T.useRef(!1);return T.useEffect(()=>{n||(a.current=!1)},[n]),T.useEffect(()=>{const o=s.current;if(!o||!t||n||!r)return;const l=()=>{a.current||(a.current=!0,r())};if(!("IntersectionObserver"in window)){l();return}const u=new IntersectionObserver(c=>{c.some(d=>d.isIntersecting)&&l()},{rootMargin:"240px 0px"});return u.observe(o),()=>u.disconnect()},[t,n,e,r]),!t&&!n?null:i.jsx("div",{ref:s,className:"flex min-h-10 items-center justify-center border-t border-border px-3 py-2 text-xs font-medium text-muted","aria-live":"polite",children:n?`Loading more ${e}...`:`Scroll for more ${e}`})}function Gf({data:e,loading:t,error:n,onBack:r,onRefresh:s,onViewHook:a}){if(t)return i.jsx(qn,{text:"Loading hook detail…"});if(n)return i.jsxs("div",{className:"grid gap-3",children:[i.jsx(Ne,{tone:"error",text:n.message}),i.jsx("button",{type:"button",className:"w-fit rounded border border-border px-3 py-2 text-sm font-semibold",onClick:r,children:"Back to hooks"})]});if(!e)return i.jsx(Z,{text:"Hook detail is not available."});const o=e.hook;return i.jsxs("section",{className:"grid gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{children:[i.jsxs("button",{type:"button",className:"mb-2 inline-flex items-center gap-2 text-sm font-semibold text-primary hover:underline",onClick:r,children:[i.jsx(Bo,{className:"h-4 w-4","aria-hidden":!0}),"Back to hooks"]}),i.jsx("h2",{className:"text-xl font-semibold",children:o.target}),i.jsxs("p",{className:"font-mono text-xs text-muted",children:[o.target_type," webhook #",o.id]})]}),i.jsxs("div",{className:"flex gap-2",children:[i.jsx(lt,{onClick:s}),o.admin_url?i.jsxs("a",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold hover:bg-slate-50",href:Ze(o.admin_url),target:"_blank",rel:"noreferrer",children:[i.jsx(Gt,{className:"h-4 w-4","aria-hidden":!0}),"Open in GitHub"]}):null]})]}),i.jsxs("div",{className:"grid grid-cols-2 gap-3 lg:grid-cols-4",children:[i.jsx(_e,{title:"State",value:o.status,icon:i.jsx(bn,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Deliveries",value:e.stats.deliveries,icon:i.jsx(vn,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Retries",value:e.stats.duplicates,icon:i.jsx(ur,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Unsupported",value:e.stats.unsupported,icon:i.jsx(zr,{className:"h-5 w-5"})})]}),i.jsxs(fe,{title:"Sanitized configuration",children:[i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[i.jsx(J,{label:"Active",value:o.active?"yes":"no"}),i.jsx(J,{label:"Content type",value:o.content_type??"unknown"}),i.jsx(J,{label:"SSL verification",value:o.ssl_verify===null||o.ssl_verify===void 0?"unknown":o.ssl_verify?"enabled":"disabled"}),i.jsx(J,{label:"Destination URL",value:o.delivery_url??"unknown"}),i.jsx(J,{label:"GitHub created",value:o.github_created_at??"unknown"}),i.jsx(J,{label:"GitHub updated",value:o.github_updated_at??"unknown"}),i.jsx(J,{label:"Last ping",value:o.last_ping_at??"never"}),i.jsx(J,{label:"Last delivery",value:o.last_event_at??"never"}),i.jsx(J,{label:"Last result",value:o.last_result??"unknown"})]}),i.jsxs("div",{className:"mt-3 rounded-md border border-border p-3",children:[i.jsx("div",{className:"text-xs font-semibold text-muted",children:"Subscribed events"}),i.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:o.events.length?o.events.map(l=>i.jsx("span",{className:"rounded border border-border bg-slate-50 px-2 py-1 font-mono text-xs",children:l},l)):i.jsx("span",{className:"text-sm text-muted",children:"No event snapshot; redeliver a ping."})})]})]}),i.jsx(fe,{title:"Latest observed delivery",children:i.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[i.jsx(J,{label:"Event",value:o.last_event_name?`${o.last_event_name}${o.last_action?` · ${o.last_action}`:""}`:"none"}),i.jsx(J,{label:"Repository",value:o.last_repository??"none"}),i.jsx(J,{label:"Delivery ID",value:o.last_delivery_id??"none"})]})}),i.jsx(fe,{title:"Recent deliveries",children:e.recent_deliveries.length?i.jsx(Fl,{deliveries:e.recent_deliveries,onViewHook:a}):i.jsx(Z,{text:"This hook has no retained deliveries."})})]})}function Jf({processes:e,processesLoading:t,processesError:n,systemd:r,systemdLoading:s,systemdError:a,alerts:o,alertsLoading:l,alertsError:u,now:c,onRefreshProcesses:d,onRefreshSystemd:h,onRefreshAlerts:m}){return i.jsxs("section",{className:"grid gap-4","aria-label":"Bridge system",children:[i.jsxs(fe,{title:"Systemd",action:i.jsx(lt,{onClick:h}),children:[a?i.jsx(Ne,{tone:"error",text:a.message}):null,i.jsx(Rx,{data:r,loading:s})]}),i.jsxs(fe,{title:"Process activity",action:i.jsx(lt,{onClick:d}),children:[n?i.jsx(Ne,{tone:"error",text:n.message}):null,i.jsx(Ax,{data:e,loading:t})]}),i.jsxs(fe,{title:"Monitor alerts",action:i.jsx(lt,{onClick:m}),children:[u?i.jsx(Ne,{tone:"error",text:u.message}):null,i.jsx(Lx,{alerts:o,loading:l,now:c})]})]})}function Dn({href:e,active:t,children:n,onNavigate:r}){return i.jsx("a",{className:V("inline-flex h-8 min-w-0 flex-1 items-center justify-center gap-1 rounded-md px-1.5 text-xs font-semibold sm:flex-none sm:gap-1.5 sm:px-3 sm:text-sm [&>span]:truncate [&>svg]:shrink-0",t?"bg-primary text-white shadow-sm":"text-muted hover:bg-slate-50 hover:text-foreground"),href:e,onClick:s=>{!r||s.defaultPrevented||s.button!==0||s.metaKey||s.ctrlKey||s.altKey||s.shiftKey||(s.preventDefault(),r(e))},children:n})}function Xf({jobId:e,detail:t,selectedJob:n,user:r,onBackToDashboard:s,onRetry:a,onDismiss:o,onCancel:l,onRefresh:u}){const[c,d]=T.useState(!1),[h,m]=T.useState(!1),[p,y]=T.useState(!1),w=!!(r!=null&&r.is_admin&&n&&zn(n.status)),j=!!(n&&Oi(n,r)),b=c?"Retrying...":"Retry",S=h?"Dismissing...":"Dismiss",_=p?"Cancelling...":"Cancel";return i.jsxs("div",{className:"grid min-w-0 gap-3 sm:gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.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:"/",onClick:N=>{N.defaultPrevented||N.button!==0||N.metaKey||N.ctrlKey||N.altKey||N.shiftKey||(N.preventDefault(),s())},children:[i.jsx(Bo,{className:"h-4 w-4","aria-hidden":!0}),"Dashboard"]}),i.jsxs("div",{className:"flex items-center gap-2",children:[w?i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-semibold text-white disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:c,onClick:async()=>{if(window.confirm(`Retry job #${e}?`)){d(!0);try{await a(e)}finally{d(!1)}}},children:[i.jsx(Gn,{className:"h-4 w-4","aria-hidden":!0}),b]}):null,w?i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border bg-white px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:h,onClick:async()=>{if(window.confirm(`Dismiss job #${e}?`)){m(!0);try{await o(e)}finally{m(!1)}}},children:[i.jsx(wn,{className:"h-4 w-4","aria-hidden":!0}),S]}):null,j?i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-red-200 bg-red-50 px-3 text-sm font-semibold text-red-700 hover:bg-red-100 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:p,onClick:async()=>{const N=window.prompt(`Cancel job #${e}? Optional reason:`);if(N!==null){y(!0);try{await l(e,N)}finally{y(!1)}}},children:[i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0}),_]}):null,i.jsx(lt,{onClick:u})]})]}),i.jsx(fe,{title:`Job #${e}`,className:"p-3 sm:p-4",children:t})]})}function Yf({selectedJobId:e,selectedJob:t,loading:n,error:r,session:s,sessionEvents:a,transcript:o,now:l}){return t?i.jsx(kx,{job:t,session:s,sessionEvents:a,transcript:o,now:l}):e!==null&&n?i.jsx(Z,{text:"Loading selected job..."}):e!==null&&r?i.jsx(Ne,{tone:"error",text:`Job #${e}: ${r.message}`}):i.jsx(Z,{text:"Select a job to inspect its timeline, worklog and GitHub links."})}function Zf({data:e,loading:t,error:n,repo:r,status:s,user:a,now:o,onRepoChange:l,onStatusChange:u,onApprove:c,onReject:d,onUpdateRuleScope:h,onDeleteRule:m,onRefresh:p}){const y=(e==null?void 0:e.summary)??{},[w,j]=T.useState("proposals"),b=[{id:"proposals",label:"Proposals",count:(e==null?void 0:e.proposals.length)??0},{id:"rules",label:"Rules",count:(e==null?void 0:e.rules.length)??0},{id:"events",label:"Events",count:(e==null?void 0:e.events.length)??0}];return i.jsxs("div",{className:"grid min-w-0 gap-4",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("h2",{className:"flex items-center gap-2 text-base font-semibold",children:[i.jsx(Hi,{className:"h-5 w-5 text-muted","aria-hidden":!0}),"Acquired knowledge"]}),i.jsx("p",{className:"text-xs text-muted",children:"Captured feedback, proposed rules and curated agent memory."})]}),i.jsx(lt,{onClick:p})]}),n?i.jsx(Ne,{tone:"error",text:n.message}):null,i.jsxs("section",{className:"grid grid-cols-2 gap-3 lg:grid-cols-4","aria-label":"Knowledge metrics",children:[i.jsx(_e,{title:"Proposed",value:y.proposed??0,icon:i.jsx($o,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Approved",value:y.approved??0,icon:i.jsx(wn,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Rules",value:y.rules??0,icon:i.jsx(Ko,{className:"h-5 w-5"})}),i.jsx(_e,{title:"Events",value:y.events??0,icon:i.jsx(bn,{className:"h-5 w-5"})})]}),i.jsx(fe,{title:"Filters",className:"p-3",children:i.jsxs("div",{className:V("grid gap-3",w==="proposals"?"md:grid-cols-[minmax(0,1fr)_220px]":"md:grid-cols-[minmax(0,1fr)]"),children:[i.jsx(Ye,{label:"Repository",children:i.jsxs("select",{className:"control",value:r,onChange:S=>l(S.target.value),children:[i.jsx("option",{value:"",children:"All repositories"}),((e==null?void 0:e.repositories)??[]).map(S=>i.jsx("option",{value:S,children:S},S))]})}),w==="proposals"?i.jsx(Ye,{label:"Proposal status",children:i.jsxs("select",{className:"control",value:s,onChange:S=>u(S.target.value),children:[i.jsx("option",{value:"",children:"All statuses"}),i.jsx("option",{value:"proposed",children:"proposed"}),i.jsx("option",{value:"approved",children:"approved"}),i.jsx("option",{value:"rejected",children:"rejected"}),i.jsx("option",{value:"error",children:"error"})]})}):null]})}),i.jsxs(fe,{title:"Knowledge records",action:i.jsx("div",{className:"flex max-w-full flex-wrap rounded-md border border-border bg-white p-0.5",role:"tablist","aria-label":"Knowledge record type",children:b.map(S=>i.jsxs("button",{className:V("inline-flex h-8 items-center gap-1.5 rounded px-2.5 text-xs font-semibold",w===S.id?"bg-primary text-white":"text-muted hover:bg-slate-50 hover:text-foreground"),type:"button",role:"tab","aria-label":`${S.label} (${S.count})`,"aria-selected":w===S.id,onClick:()=>j(S.id),children:[i.jsx("span",{children:S.label}),i.jsx("span",{className:V("rounded-sm border px-1 font-mono text-[10px]",w===S.id?"border-white/40 text-white":"border-border text-muted"),children:S.count})]},S.id))}),children:[w==="proposals"?i.jsx(ex,{proposals:(e==null?void 0:e.proposals)??[],loading:t,isAdmin:!!(a!=null&&a.is_admin),now:o,onApprove:c,onReject:d}):null,w==="rules"?i.jsx(rx,{rules:(e==null?void 0:e.rules)??[],loading:t,now:o,onUpdateRuleScope:h,onDeleteRule:m}):null,w==="events"?i.jsx(ix,{events:(e==null?void 0:e.events)??[],loading:t,now:o}):null]})]})}function ex({proposals:e,loading:t,isAdmin:n,now:r,onApprove:s,onReject:a}){const[o,l]=T.useState(null);return t&&e.length===0?i.jsx(Z,{text:"Loading proposals..."}):e.length===0?i.jsx(Z,{text:"No proposals match the current filters."}):i.jsx("div",{className:"grid gap-2",children:e.map(u=>i.jsxs("article",{className:"grid min-w-0 gap-2 rounded-md border border-border bg-white p-3",children:[i.jsx(Bl,{scope:u.scope,type:u.type,confidence:u.confidence,status:u.status,timestamp:u.updated_at,now:r}),i.jsx("p",{className:"min-w-0 break-words text-sm font-medium [overflow-wrap:anywhere]",children:u.rule||u.reason||"No reusable rule proposed."}),u.reason?i.jsx("p",{className:"min-w-0 break-words text-xs text-muted [overflow-wrap:anywhere]",children:u.reason}):null,u.source_event?i.jsx(tx,{event:u.source_event}):i.jsxs("p",{className:"font-mono text-xs text-muted",children:["Source event ",u.event_id]}),u.error?i.jsx(Ne,{tone:"error",text:u.error}):null,n&&u.status==="proposed"?i.jsxs("div",{className:"flex flex-wrap gap-2",children:[i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md bg-primary px-3 text-sm font-semibold text-white disabled:opacity-60",type:"button",disabled:o===u.id,onClick:async()=>{l(u.id);try{await s(u.id)}finally{l(null)}},children:[i.jsx(wn,{className:"h-4 w-4","aria-hidden":!0}),"Approve"]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:o===u.id,onClick:async()=>{l(u.id);try{await a(u.id)}finally{l(null)}},children:[i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0}),"Reject"]})]}):null]},u.id))})}function tx({event:e}){const t=e.trigger_actor||(e.actor!=="github"?e.actor:null);return i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2 rounded-md border border-border bg-slate-50 px-2 py-1.5",children:[i.jsx(Cn,{actor:t,avatarUrl:e.trigger_actor_avatar_url,framed:!0}),e.source_job_id?i.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border bg-white px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:Sn(e.source_job_id),children:[i.jsx(vn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.source_job_id]}):null,e.github_urls.length>0?i.jsx(Xn,{urls:e.github_urls,compact:!0}):i.jsx("span",{className:"font-mono text-xs text-muted",children:"No GitHub link"})]})}function nx(e){const t=[{value:"global",label:"global"}];if(e.startsWith("repo:")){const n=e.slice(5),[r,s]=n.split("/",2);r&&s&&(t.push({value:`org:${r}`,label:`org:${r}`}),t.push({value:`repo:${r}/${s}`,label:`repo:${r}/${s}`}))}else e.startsWith("org:")&&t.push({value:e,label:e});return t.some(n=>n.value===e)||t.push({value:e,label:e}),t}function rx({rules:e,loading:t,now:n,onUpdateRuleScope:r,onDeleteRule:s}){const[a,o]=T.useState(null),[l,u]=T.useState(null),[c,d]=T.useState("");return t&&e.length===0?i.jsx(Z,{text:"Loading curated rules..."}):e.length===0?i.jsx(Z,{text:"No curated rules match the current filters."}):i.jsx("div",{className:"grid gap-2",children:e.map(h=>{const m=h.source_event_details??[],p=m[0],y=p?p.trigger_actor||(p.actor!=="github"?p.actor:null):null,w=m.flatMap(N=>N.github_urls??[]),j=nx(h.scope),b=l===h.id,S=a===h.id,_=!!h.can_manage;return i.jsxs("article",{className:"grid min-w-0 gap-2 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsx(Bl,{scope:h.scope,type:h.type,confidence:h.confidence,status:`${h.observations} observation${h.observations===1?"":"s"}`,timestamp:h.last_seen,now:n}),_?i.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[b?i.jsxs(i.Fragment,{children:[i.jsx(Ye,{label:"Scope",children:i.jsx("select",{className:"control h-8 min-w-[180px] py-1 text-xs",value:c,disabled:S,onChange:N=>d(N.target.value),children:j.map(N=>i.jsx("option",{value:N.value,children:N.label},N.value))})}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:S||c===h.scope,title:"Save scope",onClick:async()=>{if(c!==h.scope){o(h.id);try{await r(h.id,c),u(null)}finally{o(null)}}},children:[i.jsx(ic,{className:"h-4 w-4","aria-hidden":!0}),"Save"]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-muted hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:S,title:"Cancel scope edit",onClick:()=>{u(null),d("")},children:[i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0}),"Cancel"]})]}):i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:opacity-60",type:"button",disabled:S,title:"Edit scope",onClick:()=>{u(h.id),d(h.scope)},children:[i.jsx(rc,{className:"h-4 w-4","aria-hidden":!0}),"Edit"]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-red-200 px-3 text-sm font-semibold text-red-700 hover:bg-red-50 disabled:opacity-60",type:"button",disabled:S,onClick:async()=>{if(window.confirm("Delete this curated rule?")){o(h.id);try{await s(h.id)}finally{o(null)}}},children:[i.jsx(ki,{className:"h-4 w-4","aria-hidden":!0}),"Delete"]})]}):null]}),i.jsx("p",{className:"min-w-0 break-words text-sm font-medium [overflow-wrap:anywhere]",children:h.rule}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsx(Cn,{actor:y,avatarUrl:p==null?void 0:p.trigger_actor_avatar_url,framed:!0}),p!=null&&p.source_job_id?i.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-white",href:Sn(p.source_job_id),children:[i.jsx(vn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",p.source_job_id]}):null,w.length>0?i.jsx(Xn,{urls:w,compact:!0}):i.jsx("span",{className:"font-mono text-xs text-muted",children:"No GitHub link"})]})]},h.id)})})}function ix({events:e,loading:t,now:n}){return t&&e.length===0?i.jsx(Z,{text:"Loading captured events..."}):e.length===0?i.jsx(Z,{text:"No captured feedback events match the current filters."}):i.jsx("div",{className:"grid gap-2",children:e.map(r=>{const s=r.trigger_actor||(r.actor!=="github"?r.actor:null);return i.jsxs("details",{className:"group rounded-md border border-border bg-white",children:[i.jsxs("summary",{className:"grid cursor-pointer list-none gap-2 px-3 py-2 marker:hidden hover:bg-slate-50",children:[i.jsxs("div",{className:"flex min-w-0 items-center justify-between gap-2",children:[i.jsxs("span",{className:"inline-flex min-w-0 items-center gap-2 font-mono text-xs font-semibold text-muted",children:[i.jsx(yn,{className:"h-3.5 w-3.5 shrink-0 transition-transform group-open:rotate-180","aria-hidden":!0}),i.jsx("span",{className:"truncate",children:Dl(r.scope)})]}),i.jsx("span",{className:"shrink-0 font-mono text-xs text-muted",children:i.jsx(Ie,{value:r.occurred_at,relative:!0,now:n})})]}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsx(Cn,{actor:s,avatarUrl:r.trigger_actor_avatar_url,framed:!0}),r.source_job_id?i.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-white",href:Sn(r.source_job_id),children:[i.jsx(vn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",r.source_job_id]}):null,r.github_urls.length>0?i.jsx(Xn,{urls:r.github_urls,compact:!0}):i.jsx("span",{className:"font-mono text-xs text-muted",children:"No GitHub link"})]}),i.jsx("p",{className:"line-clamp-2 break-words text-sm [overflow-wrap:anywhere]",children:r.comment})]}),i.jsxs("div",{className:"grid gap-2 border-t border-border px-3 py-2",children:[i.jsxs("div",{children:[i.jsx("h3",{className:"mb-1 text-xs font-semibold text-muted",children:"GitHub links"}),r.github_urls.length>0?i.jsx(Xn,{urls:r.github_urls}):i.jsx("p",{className:"text-xs text-muted",children:"No links recorded."})]}),i.jsx("pre",{className:"max-h-72 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs leading-relaxed text-slate-100",children:JSON.stringify(r.context,null,2)})]})]},r.id)})})}function sx({tokens:e,loading:t,error:n,user:r,ownerOptions:s,dashboardUrl:a,dashboardUrlSource:o,now:l,onCreate:u,onUpdateOwner:c,onRevoke:d,onRefresh:h}){const[m,p]=T.useState(""),[y,w]=T.useState(""),[j,b]=T.useState(!1),[S,_]=T.useState(null),[N,q]=T.useState(null),[k,B]=T.useState(null),[M,v]=T.useState(""),F=e??[],L=s.find(E=>E.login===y);T.useEffect(()=>{var E;r!=null&&r.is_admin&&(y&&s.some(O=>O.login===y)||w((r==null?void 0:r.login)||((E=s[0])==null?void 0:E.login)||""))},[s,r==null?void 0:r.is_admin,r==null?void 0:r.login,y]);const P=(a||(typeof window>"u"?"":window.location.origin)).replace(/\/$/,""),G=`${P}/mcp`,z=`${P}/api/mcp`;return i.jsxs("div",{className:"grid min-w-0 gap-4",children:[i.jsx(zl,{icon:i.jsx(Tr,{className:"h-5 w-5 text-muted","aria-hidden":!0}),title:"MCP access",subtitle:r!=null&&r.is_admin?"Issue and revoke read-only tokens for any dashboard user.":"Issue and revoke read-only tokens linked to your user.",action:i.jsx(lt,{onClick:h})}),n?i.jsx(Ne,{tone:"error",text:n.message}):null,M?i.jsx(Ne,{tone:"error",text:M}):null,i.jsx(ax,{dashboardUrl:G,endpointUrl:z,dashboardUrlSource:o??"request"}),k?i.jsxs("section",{className:"rounded-md border border-emerald-300 bg-emerald-50 p-3 text-emerald-950","aria-label":"Created MCP token",children:[i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{children:[i.jsx("h2",{className:"text-sm font-semibold",children:"Token created"}),i.jsx("p",{className:"mt-1 text-xs text-emerald-800",children:"This secret is shown once. Store it in the local agent environment before leaving this page."})]}),i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-emerald-300 bg-white px-3 text-sm font-semibold text-emerald-900 hover:bg-emerald-100",type:"button",onClick:()=>B(null),children:[i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0}),"Hide"]})]}),i.jsx("pre",{className:"mt-3 overflow-auto rounded bg-emerald-950 px-3 py-2 font-mono text-xs text-emerald-50",children:k.token})]}):null,i.jsx(fe,{title:"Create token",children:i.jsxs("form",{className:r!=null&&r.is_admin?"grid gap-3 md:grid-cols-[minmax(0,1fr)_minmax(12rem,16rem)_auto]":"grid gap-3 md:grid-cols-[minmax(0,1fr)_auto]",onSubmit:async E=>{E.preventDefault();const O=m.trim();if(O){b(!0),v("");try{const Q=await u(O,r!=null&&r.is_admin?y:void 0);B(Q),p("")}catch(Q){v(Q instanceof Error?Q.message:String(Q))}finally{b(!1)}}},children:[i.jsx(Ye,{label:"Token name",children:i.jsx("input",{className:"control",value:m,placeholder:"local agent",disabled:j,onChange:E=>p(E.target.value)})}),r!=null&&r.is_admin?i.jsxs(Ye,{label:"Owner",children:[i.jsx(ql,{ariaLabel:"Owner",value:y,ownerOptions:s,disabled:j||s.length===0,selectedSuffix:E=>E.login===(r==null?void 0:r.login)?" (you)":"",emptyLabel:"No known users",onChange:w}),L?i.jsxs("span",{className:"font-normal text-muted",children:["Token will be linked to @",L.login,"."]}):null]}):null,i.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 disabled:cursor-not-allowed disabled:opacity-60",type:"submit",disabled:j||!m.trim()||!!(r!=null&&r.is_admin&&!y),children:[i.jsx(Tr,{className:"h-4 w-4","aria-hidden":!0}),j?"Creating...":"Create token"]})]})}),i.jsx(fe,{title:"Active tokens",children:i.jsx(ox,{tokens:F,loading:t,now:l,ownerOptions:s,canManageOwners:!!(r!=null&&r.is_admin),revokingId:S,updatingOwnerId:N,onUpdateOwner:async(E,O)=>{q(E),v("");try{await c(E,O)}catch(Q){v(Q instanceof Error?Q.message:String(Q))}finally{q(null)}},onRevoke:async E=>{if(window.confirm("Revoke this MCP token?")){_(E),v("");try{await d(E)}catch(O){v(O instanceof Error?O.message:String(O))}finally{_(null)}}}})})]})}function ax({dashboardUrl:e,endpointUrl:t,dashboardUrlSource:n}){const r=n==="configured"?"Configured public URL":n==="forwarded"?"Forwarded public URL":"Needs public URL",s=n==="request",a=s?"Set GITHUB_AGENT_BRIDGE_DASHBOARD_PUBLIC_URL or forward X-Forwarded-* headers":e,o=s?"Public dashboard URL required before connecting remote agents":t,u=`{ - "mcpServers": { - "github-agent-bridge": { - "url": "${s?"https://bridge.example.com/api/mcp":t}", - "headers": { - "Authorization": "Bearer \${GITHUB_AGENT_BRIDGE_MCP_TOKEN}" - } - } - } -}`;return i.jsxs(fe,{title:"Connect an agent",children:[s?i.jsx(Ne,{tone:"warning",text:"Set GITHUB_AGENT_BRIDGE_DASHBOARD_PUBLIC_URL, or forward X-Forwarded-* headers from the proxy, before connecting remote agents."}):null,i.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]",children:[i.jsxs("div",{className:"grid min-w-0 gap-3",children:[i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm font-semibold",children:[i.jsx(Gt,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Public dashboard URL",i.jsx("span",{className:"rounded-sm border border-border bg-slate-50 px-1.5 py-0.5 font-mono text-[11px] font-normal text-muted",children:r})]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Share this page URL with bridge admins only after it resolves to the external dashboard origin."}),i.jsx("pre",{className:"mt-3 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs text-slate-100",children:a})]}),i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Gt,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"HTTP MCP endpoint"]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Remote agents connect directly with a bearer token; no local `gab` binary is required on the agent host."}),i.jsx("pre",{className:"mt-3 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs text-slate-100",children:o})]})]}),i.jsxs("div",{className:"grid min-w-0 gap-3",children:[i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Tr,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Agent config"]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Create a token below, then store the one-time secret as `GITHUB_AGENT_BRIDGE_MCP_TOKEN` for the agent."}),i.jsx("pre",{className:"mt-3 max-h-64 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs leading-relaxed text-slate-100",children:u})]}),i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Hi,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Agent prompt"]}),i.jsx("p",{className:"mt-1 text-xs text-muted",children:"Ask the agent to use the read-only bridge knowledge server before acting on repository work."}),i.jsx("pre",{className:"mt-3 max-h-40 overflow-auto rounded-md bg-slate-950 px-3 py-2 font-mono text-xs leading-relaxed text-slate-100",children:"Use the github-agent-bridge MCP server for repository knowledge. Query list_repositories and list_knowledge before making repository decisions."})]})]})]})]})}function zl({icon:e,title:t,subtitle:n,action:r}){return i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("h2",{className:"flex items-center gap-2 text-base font-semibold",children:[e,t]}),i.jsx("p",{className:"text-xs text-muted",children:n})]}),r]})}function ox({tokens:e,loading:t,now:n,ownerOptions:r,canManageOwners:s,revokingId:a,updatingOwnerId:o,onUpdateOwner:l,onRevoke:u}){return t&&e.length===0?i.jsx(Z,{text:"Loading MCP tokens..."}):e.length===0?i.jsx(Z,{text:"No active MCP tokens."}):i.jsxs(i.Fragment,{children:[i.jsx("div",{className:"grid gap-2 md:hidden",children:e.map(c=>i.jsxs("article",{className:"grid min-w-0 gap-3 rounded-md border border-border bg-white p-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h3",{className:"break-words text-sm font-semibold [overflow-wrap:anywhere]",children:c.name}),i.jsx("div",{className:"mt-1 break-all font-mono text-xs text-muted",children:c.id}),s?i.jsx(so,{token:c,ownerOptions:r,disabled:o===c.id,onUpdateOwner:l}):c.user_login?i.jsxs("div",{className:"mt-1 text-xs text-muted",children:["Owner: @",c.user_login]}):null]}),i.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[i.jsx(J,{label:"Created",value:i.jsx(Ie,{value:c.created_at,relative:!0,now:n})}),i.jsx(J,{label:"Last used",value:c.last_used_at?i.jsx(Ie,{value:c.last_used_at,relative:!0,now:n}):"never"})]}),i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-red-200 px-3 text-sm font-semibold text-red-700 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:a===c.id,onClick:()=>u(c.id),children:[i.jsx(ki,{className:"h-4 w-4","aria-hidden":!0}),a===c.id?"Revoking...":"Revoke"]})]},c.id))}),i.jsx("div",{className:"hidden overflow-auto rounded-md border border-border md:block",children:i.jsxs("table",{className:"min-w-full border-collapse text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"border-b border-border bg-slate-50 text-left text-xs text-muted",children:[i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Name"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Owner"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Created"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"Last used"}),i.jsx("th",{className:"px-3 py-2 font-semibold",children:"ID"}),i.jsx("th",{className:"px-3 py-2 text-right font-semibold",children:"Actions"})]})}),i.jsx("tbody",{children:e.map(c=>i.jsxs("tr",{className:"border-b border-border last:border-b-0",children:[i.jsx("td",{className:"px-3 py-3 font-semibold",children:c.name}),i.jsx("td",{className:"px-3 py-3 text-xs text-muted",children:s?i.jsx(so,{token:c,ownerOptions:r,disabled:o===c.id,onUpdateOwner:l}):c.user_login?`@${c.user_login}`:"unassigned"}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs",children:i.jsx(Ie,{value:c.created_at,relative:!0,now:n})}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs",children:c.last_used_at?i.jsx(Ie,{value:c.last_used_at,relative:!0,now:n}):"never"}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs text-muted",children:c.id}),i.jsx("td",{className:"px-3 py-3 text-right",children:i.jsxs("button",{className:"inline-flex h-8 items-center gap-2 rounded-md border border-red-200 px-3 text-sm font-semibold text-red-700 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-60",type:"button",disabled:a===c.id,onClick:()=>u(c.id),children:[i.jsx(ki,{className:"h-4 w-4","aria-hidden":!0}),a===c.id?"Revoking...":"Revoke"]})})]},c.id))})]})})]})}function so({token:e,ownerOptions:t,disabled:n,onUpdateOwner:r}){const s=e.user_login??"";return i.jsx(ql,{ariaLabel:`Owner for ${e.name}`,value:s,ownerOptions:t,disabled:n||t.length===0,emptyLabel:"Select owner",size:"compact",onChange:a=>{!a||a===e.user_login||r(e.id,a)}})}function ql({value:e,ownerOptions:t,disabled:n,onChange:r,ariaLabel:s,selectedSuffix:a,emptyLabel:o,size:l="default"}){const u=t.find(d=>d.login===e),c=u?`@${u.login}${(a==null?void 0:a(u))??""}`:o;return i.jsxs("div",{className:V("relative flex min-w-0 items-center gap-2 rounded-md border border-border bg-panel text-foreground focus-within:border-primary focus-within:ring-1 focus-within:ring-primary",n?"opacity-60":"",l==="compact"?"h-8 w-44 max-w-full px-2":"h-9 w-full px-2.5"),children:[i.jsx("span",{className:V("pointer-events-none flex shrink-0 items-center justify-center",l==="compact"?"h-5 w-5":"h-6 w-6"),children:u!=null&&u.avatar_url?i.jsx("img",{className:"h-full w-full rounded-full bg-slate-100",src:Ze(u.avatar_url),alt:"",referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:V("text-muted",l==="compact"?"h-4 w-4":"h-5 w-5"),"aria-hidden":!0})}),i.jsx("span",{className:V("pointer-events-none min-w-0 flex-1 truncate font-mono",u?"text-foreground":"text-muted",l==="compact"?"text-xs":"text-sm"),children:c}),i.jsxs("select",{className:"absolute inset-0 h-full w-full cursor-pointer opacity-0 disabled:cursor-not-allowed","aria-label":s,value:e,disabled:n,onChange:d=>r(d.target.value),children:[t.length===0||!e?i.jsx("option",{value:"",children:o}):null,t.map(d=>i.jsxs("option",{value:d.login,children:["@",d.login,(a==null?void 0:a(d))??""]},d.login))]}),i.jsx(yn,{className:V("pointer-events-none shrink-0 text-muted",l==="compact"?"h-3.5 w-3.5":"h-4 w-4"),"aria-hidden":!0})]})}function Xn({urls:e,compact:t=!1}){const n=t?e.slice(0,2):e,r=e.length-n.length;return i.jsxs("div",{className:"flex min-w-0 max-w-full flex-wrap gap-1.5",children:[n.map(s=>i.jsxs("a",{className:V("inline-flex max-w-full items-center gap-1 rounded-md border border-border font-semibold text-primary hover:bg-white hover:underline",t?"h-7 px-2 text-xs":"min-h-7 px-2 py-1 text-xs"),href:Ze(s),"aria-label":s,rel:"noreferrer",target:"_blank",children:[i.jsx(Gt,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),i.jsx("span",{className:"truncate",children:t?lx(s):s})]},s)),r>0?i.jsxs("span",{className:"inline-flex h-7 items-center rounded-md border border-border px-2 font-mono text-xs text-muted",children:["+",r]}):null]})}function lx(e){try{const t=new URL(e);return t.pathname.replace(/^\//,"")+t.hash}catch{return e}}function Bl({scope:e,type:t,confidence:n,status:r,timestamp:s,now:a}){return i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2 text-xs text-muted",children:[i.jsx("span",{className:"truncate font-mono font-semibold text-foreground",children:Dl(e)}),i.jsx("span",{className:"rounded-sm border border-border px-1.5 py-0.5 font-mono",children:t}),i.jsxs("span",{className:"rounded-sm border border-border px-1.5 py-0.5 font-mono",children:[Math.round(n*100),"%"]}),i.jsx("span",{className:"rounded-sm border border-border px-1.5 py-0.5 font-mono",children:r}),i.jsx("span",{className:"font-mono",children:i.jsx(Ie,{value:s,relative:!0,now:a})})]})}function ux({user:e,loading:t}){const n=e!=null&&e.login?`@${e.login}`:t?"Loading profile...":"GitHub OAuth",r=e!=null&&e.is_admin?"admin":"read-only",s=e!=null&&e.avatar_url?i.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"}):i.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-slate-700 bg-slate-900",children:i.jsx(Wn,{className:"h-5 w-5","aria-hidden":!0})}),a=e!=null&&e.html_url?i.jsx("a",{className:"truncate font-semibold text-white hover:underline",href:Ze(e.html_url),rel:"noreferrer",target:"_blank",children:n}):i.jsx("div",{className:"truncate font-semibold text-white",children:n});return i.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:[i.jsx(Ko,{className:"hidden h-4 w-4 shrink-0 sm:block","aria-hidden":!0}),i.jsxs("div",{className:"hidden min-w-0 text-right sm:block",children:[a,i.jsxs("div",{className:"text-xs text-slate-400",children:["Signed in · ",r]})]}),s]})}function cx({config:e,loading:t,onEnable:n,onDisable:r}){const[s,a]=T.useState(!1),[o,l]=T.useState(""),u=!!(e!=null&&e.status.enabled),c=typeof navigator<"u"&&typeof window<"u"&&Rr(),d=t||s||!(e!=null&&e.configured)||!c,h=c?e!=null&&e.configured?u?"Disable notifications":"Enable notifications":"Notifications not configured":"Notifications unavailable";return i.jsx("div",{className:"relative",children:i.jsx("button",{className:V("inline-flex h-9 w-9 items-center justify-center rounded-md border text-sm font-semibold",u?"border-emerald-400 bg-emerald-50 text-emerald-700":"border-slate-700 bg-slate-900 text-slate-200",d&&"cursor-not-allowed opacity-60"),type:"button","aria-label":h,title:o||h,disabled:d,onClick:async()=>{a(!0),l("");try{u?await r():await n()}catch(m){l(m instanceof Error?m.message:String(m))}finally{a(!1)}},children:i.jsx(Uo,{className:V("h-4 w-4",s&&"animate-live-pulse"),"aria-hidden":!0})})})}function dx({notification:e,onDismiss:t,onNavigate:n}){if(!e)return null;const r=e.title||"GitHub Agent Bridge",s=e.body||e.summary||"Bridge job finished",a=e.url||e.job_url||(e.job_id?Sn(e.job_id):"/"),o=a.startsWith("/");return i.jsx("aside",{className:"fixed right-3 top-20 z-50 w-[min(calc(100vw-1.5rem),28rem)] rounded-md border border-emerald-300 bg-white shadow-xl shadow-slate-950/15","aria-live":"assertive","aria-label":"Bridge notification",children:i.jsxs("div",{className:"flex items-start gap-3 p-3",children:[i.jsx("div",{className:"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-emerald-50 text-emerald-700",children:i.jsx(Uo,{className:"h-4 w-4","aria-hidden":!0})}),i.jsxs("div",{className:"min-w-0 flex-1",children:[i.jsxs("div",{className:"flex items-start justify-between gap-2",children:[i.jsx("h2",{className:"min-w-0 break-words text-sm font-semibold text-foreground",children:r}),i.jsx("button",{className:"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted hover:bg-slate-100 hover:text-foreground",type:"button","aria-label":"Dismiss notification",onClick:t,children:i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0})})]}),i.jsx("p",{className:"mt-1 min-w-0 break-words text-sm text-muted",children:s}),e.detail?i.jsx("p",{className:"mt-1 line-clamp-2 min-w-0 break-words text-xs text-muted",children:e.detail}):null,i.jsxs("button",{className:"mt-3 inline-flex h-8 items-center gap-1.5 rounded-md border border-border px-2.5 text-xs font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:()=>{t(),o?n(a):window.open(Ze(a),"_blank","noopener,noreferrer")},children:[i.jsx(Gt,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Open"]})]})]})})}function hx({count:e,limit:t,loading:n,onRefresh:r}){return i.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:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("h2",{className:"text-base font-semibold",children:"Jobs"}),i.jsx("p",{className:"text-xs text-muted",children:n?"Refreshing latest jobs...":`Showing ${e} of the latest ${t} requested jobs`})]}),i.jsx(lt,{onClick:r,compactOnMobile:!0})]})}function fe({title:e,action:t,children:n,className:r,flushHeader:s=!1}){return i.jsxs("section",{className:V("min-w-0 rounded-lg border border-border bg-panel p-4 shadow-sm",r),children:[i.jsxs("div",{className:V("flex flex-wrap items-center justify-between gap-3",!s&&"mb-4"),children:[i.jsx("h2",{className:"text-sm font-semibold",children:e}),t]}),n]})}function _e({title:e,value:t,icon:n}){return i.jsxs("div",{className:"rounded-lg border border-border bg-panel p-3 shadow-sm md:p-4",children:[i.jsxs("div",{className:"flex items-center justify-between text-muted",children:[i.jsx("span",{className:"text-sm font-medium",children:e}),n]}),i.jsx("strong",{className:"mt-3 block text-2xl leading-none md:mt-4 md:text-3xl",children:t})]})}function px({filters:e,actorOptions:t,onChange:n}){const[r,s]=T.useState(e);T.useEffect(()=>s(e),[e]);const a=Df(e),o=io(e)||io(r),l=()=>{s(Mi),n(Mi)};return i.jsxs("details",{className:"my-3 rounded-md border border-border bg-slate-50/70",children:[i.jsxs("summary",{className:"grid cursor-pointer list-none grid-cols-[minmax(0,1fr)_auto] items-center gap-3 px-3 py-2 text-sm font-semibold marker:hidden",children:[i.jsxs("span",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsxs("span",{className:"inline-flex shrink-0 items-center gap-2",children:[i.jsx(tc,{className:"h-4 w-4 text-muted","aria-hidden":!0}),"Filters"]}),a.length>0?i.jsx("span",{className:"flex min-w-0 flex-wrap items-center gap-1.5","aria-label":"Applied filters",children:a.map(u=>i.jsxs("span",{className:"inline-flex max-w-full items-center gap-1 rounded-full border border-blue-200 bg-blue-50 px-2 py-0.5 text-xs font-semibold text-blue-700",children:[i.jsx("span",{className:"text-blue-700/70",children:u.label}),i.jsx("span",{className:"max-w-40 truncate font-mono",children:u.value.trim()})]},u.key))}):null]}),i.jsxs("span",{className:"inline-flex shrink-0 items-center gap-2",children:[o?i.jsxs("button",{className:"inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-border bg-white px-2.5 text-xs font-semibold text-foreground hover:bg-slate-50",type:"button",onClick:u=>{u.preventDefault(),u.stopPropagation(),l()},children:[i.jsx(Gn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Clear filters"]}):null,i.jsx(yn,{className:"h-4 w-4 text-muted","aria-hidden":!0})]})]}),i.jsxs("form",{className:"grid gap-3 border-t border-border bg-white p-3 md:grid-cols-3 xl:grid-cols-9",onSubmit:u=>{u.preventDefault(),n(r)},children:[i.jsx(Ye,{label:"Status",children:i.jsxs("select",{className:"control",value:r.status,onChange:u=>s({...r,status:u.target.value}),children:[i.jsx("option",{value:"",children:"All"}),i.jsx("option",{value:"pending",children:"pending"}),i.jsx("option",{value:"running",children:"running"}),i.jsx("option",{value:"blocked",children:"blocked"}),i.jsx("option",{value:"done",children:"done"}),i.jsx("option",{value:"denied",children:"denied"}),i.jsx("option",{value:"waiting_approval",children:"waiting_approval"})]})}),i.jsx(Ye,{label:"Repository",children:i.jsx("input",{className:"control",value:r.repo,placeholder:"owner/repo",onChange:u=>s({...r,repo:u.target.value})})}),i.jsx(Ye,{label:"Thread",children:i.jsx("input",{className:"control",value:r.thread,inputMode:"numeric",placeholder:"issue or PR",onChange:u=>s({...r,thread:u.target.value})})}),i.jsx(Ye,{label:"Action",children:i.jsx("input",{className:"control",value:r.action,placeholder:"reply_comment",onChange:u=>s({...r,action:u.target.value})})}),i.jsx(Ye,{label:"Actor",className:"xl:col-span-2",children:i.jsx(mx,{value:r.actor,options:t,onChange:u=>s({...r,actor:u})})}),i.jsx(Ye,{label:"Intent",children:i.jsxs("select",{className:"control",value:r.intent,onChange:u=>s({...r,intent:u.target.value}),children:[i.jsx("option",{value:"",children:"All"}),i.jsx("option",{value:"review_only",children:"review_only"}),i.jsx("option",{value:"work_allowed",children:"work_allowed"})]})}),i.jsxs("div",{className:"grid grid-cols-2 gap-2 self-end xl:col-span-2",children:[i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md border border-border px-3 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-white",type:"button",disabled:!o,onClick:l,children:[i.jsx(Gn,{className:"h-4 w-4","aria-hidden":!0}),"Clear"]}),i.jsxs("button",{className:"inline-flex h-9 items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-semibold text-white",type:"submit",children:[i.jsx(sc,{className:"h-4 w-4","aria-hidden":!0}),"Apply"]})]})]})]})}function mx({value:e,options:t,onChange:n}){const[r,s]=T.useState(!1),a=e.trim().replace(/^@/,"").toLowerCase(),o=t.filter(u=>!a||u.login.toLowerCase().includes(a)).slice(0,8),l=t.find(u=>u.login.toLowerCase()===a);return i.jsxs("div",{className:"relative min-w-0",children:[i.jsxs("div",{className:"control flex items-center gap-2 px-2",children:[l?i.jsx("img",{className:"h-5 w-5 shrink-0 rounded-full bg-slate-100",src:Ze(l.avatar_url??""),alt:`${l.login} avatar`,referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:"h-4 w-4 shrink-0 text-muted","aria-hidden":!0}),i.jsx("input",{className:"min-w-0 flex-1 bg-transparent font-mono text-sm outline-none",value:e,placeholder:"@login",onChange:u=>{n(u.target.value),s(!0)},onFocus:()=>s(!0),onBlur:()=>window.setTimeout(()=>s(!1),100)}),e?i.jsx("button",{className:"rounded-sm p-1 text-muted hover:bg-slate-100",type:"button","aria-label":"Clear actor filter",onClick:()=>n(""),children:i.jsx(Jt,{className:"h-3.5 w-3.5","aria-hidden":!0})}):null]}),r&&o.length>0?i.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:o.map(u=>i.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:c=>c.preventDefault(),onClick:()=>{n(u.login),s(!1)},children:[u.avatar_url?i.jsx("img",{className:"h-6 w-6 shrink-0 rounded-full bg-slate-100",src:Ze(u.avatar_url),alt:`${u.login} avatar`,referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:"h-5 w-5 shrink-0 text-muted","aria-hidden":!0}),i.jsxs("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-foreground",children:["@",u.login]}),i.jsx("span",{className:"shrink-0 rounded-full bg-slate-100 px-1.5 py-0.5 text-[10px] font-semibold text-muted",children:u.job_count})]},u.login))}):null]})}function Ye({label:e,children:t,className:n}){return i.jsxs("label",{className:V("grid min-w-0 gap-1 text-xs font-semibold text-muted",n),children:[e,t]})}function fx({jobs:e,loading:t,loadingMore:n=!1,hasMore:r=!1,onLoadMore:s,onViewJob:a,now:o,user:l,onRetry:u,onDismiss:c,onCancel:d}){const[h,m]=T.useState(null),[p,y]=T.useState(null),[w,j]=T.useState(null),b=T.useRef(!1),S=T.useRef(n),_=!!(l!=null&&l.is_admin&&u),N=!!(l!=null&&l.is_admin&&c);T.useEffect(()=>{S.current&&!n&&(b.current=!1),S.current=n},[n]);const q=T.useCallback(()=>{b.current||(b.current=!0,s==null||s())},[s]),k=T.useCallback(async v=>{if(u){m(v);try{await u(v)}finally{m(null)}}},[u]),B=T.useCallback(async v=>{if(c){y(v);try{await c(v)}finally{y(null)}}},[c]),M=T.useCallback(async(v,F)=>{if(d){j(v);try{await d(v,F)}finally{j(null)}}},[d]);return t&&e.length===0?i.jsx(Z,{text:"Loading jobs..."}):e.length===0?i.jsx(Z,{text:"No jobs match the current filters."}):i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"grid gap-2 md:hidden",children:[e.map(v=>i.jsx(bx,{job:v,onViewJob:a,now:o,canRetry:_&&zn(v.status),retrying:h===v.id,onRetry:k,canDismiss:N&&zn(v.status),dismissing:p===v.id,onDismiss:B,canCancel:!!(d&&Oi(v,l)),cancelling:w===v.id,onCancel:M},v.id)),i.jsx(gx,{hasMore:r,loading:n,onLoadMore:q})]}),i.jsx(Di,{noun:"jobs",hasMore:r,loading:n,onLoadMore:q,className:"hidden md:block",children:i.jsxs("table",{className:"min-w-[1080px] table-fixed border-collapse text-sm",children:[i.jsx("thead",{children:i.jsxs("tr",{className:"sticky top-0 z-10 border-b border-border bg-panel text-left text-xs text-muted",children:[i.jsx("th",{className:"w-[42%] px-3 py-2 font-semibold",children:"Job"}),i.jsx("th",{className:"w-32 px-3 py-2 font-semibold",children:"Status"}),i.jsx("th",{className:"w-40 px-3 py-2 font-semibold",children:"Action"}),i.jsx("th",{className:"w-36 px-3 py-2 font-semibold",children:"Actor"}),i.jsx("th",{className:"w-36 px-3 py-2 font-semibold",children:"Timing"}),i.jsx("th",{className:"w-28 px-3 py-2 font-semibold",children:"Updated"}),i.jsx("th",{className:"w-24 px-3 py-2 text-right font-semibold",children:"Actions"})]})}),i.jsx("tbody",{children:e.map(v=>i.jsx(xx,{job:v,now:o,onViewJob:a,canRetry:_&&zn(v.status),retrying:h===v.id,onRetry:k,canDismiss:N&&zn(v.status),dismissing:p===v.id,onDismiss:B,canCancel:!!(d&&Oi(v,l)),cancelling:w===v.id,onCancel:M},v.id))})]})})]})}function xx({job:e,now:t,onViewJob:n,canRetry:r,retrying:s,onRetry:a,canDismiss:o,dismissing:l,onDismiss:u,canCancel:c,cancelling:d,onCancel:h}){return i.jsxs("tr",{className:"cursor-pointer border-b border-border align-top hover:bg-slate-50",onClick:()=>n(e.id),children:[i.jsx("td",{className:"min-w-0 px-3 py-3",children:i.jsxs("div",{className:"flex min-w-0 items-start gap-2",children:[i.jsxs("span",{className:"mt-0.5 shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),i.jsxs("div",{className:"min-w-0 space-y-1",children:[i.jsx("div",{className:"line-clamp-2 text-sm font-semibold leading-snug text-foreground [overflow-wrap:anywhere]",title:e.subject,children:e.subject}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[i.jsx("span",{className:"min-w-0 max-w-full truncate font-mono",children:e.repo??e.work_key}),i.jsxs("span",{className:"shrink-0",children:["thread ",e.thread??"n/a"]})]})]})]})}),i.jsx("td",{className:"px-3 py-3",children:i.jsx(us,{status:e.status})}),i.jsxs("td",{className:"px-3 py-3",children:[i.jsx("div",{className:"min-w-0 truncate text-sm text-foreground",title:e.action,children:e.action}),i.jsx("div",{className:"mt-1",children:i.jsx(ls,{intent:e.intent,actionMode:e.action_mode,display:"intent",compact:!0})})]}),i.jsx("td",{className:"px-3 py-3",children:i.jsx(Cn,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})}),i.jsxs("td",{className:"px-3 py-3 text-xs text-muted",children:[i.jsxs("div",{className:"flex items-center justify-between gap-2",children:[i.jsx("span",{children:"wait"}),i.jsx("span",{className:"font-mono text-foreground",children:Qe(os(e,t))})]}),i.jsxs("div",{className:"mt-1 flex items-center justify-between gap-2",children:[i.jsx("span",{children:"run"}),i.jsx("span",{className:"font-mono text-foreground",children:Qe(as(e,t))})]}),i.jsxs("div",{className:"mt-1 flex items-center justify-between gap-2",children:[i.jsx("span",{children:"tries"}),i.jsx("span",{className:"font-mono text-foreground",children:e.attempts})]})]}),i.jsx("td",{className:"px-3 py-3 font-mono text-xs",children:i.jsx(Ie,{value:e.updated_at,compact:!0,relative:!0,now:t})}),i.jsx("td",{className:"px-3 py-3 text-right",children:i.jsxs("div",{className:"inline-flex items-center gap-1",children:[i.jsx(Ul,{jobId:e.id,canRetry:r,retrying:s,onRetry:a,compact:!0}),i.jsx($l,{jobId:e.id,canDismiss:o,dismissing:l,onDismiss:u,compact:!0}),i.jsx(Hl,{jobId:e.id,canCancel:c,cancelling:d,onCancel:h,compact:!0})]})})]})}function gx({hasMore:e,loading:t,onLoadMore:n}){return!e&&!t?null:i.jsxs("button",{className:"inline-flex min-h-10 w-full items-center justify-center gap-2 rounded-md border border-border px-3 py-2 text-sm font-semibold text-foreground hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60 md:hidden",type:"button",disabled:t||!e,onClick:()=>n==null?void 0:n(),children:[i.jsx(yn,{className:"h-4 w-4","aria-hidden":!0}),t?"Loading more jobs...":"Load more jobs"]})}function bx({job:e,onViewJob:t,now:n,canRetry:r,retrying:s,onRetry:a,canDismiss:o,dismissing:l,onDismiss:u,canCancel:c,cancelling:d,onCancel:h}){return i.jsxs("article",{className:"rounded-md border border-border bg-white shadow-[0_1px_0_rgba(15,23,42,0.03)]",children:[i.jsxs("button",{className:"grid w-full gap-2 p-3 text-left hover:bg-slate-50",type:"button",onClick:()=>t(e.id),children:[i.jsxs("div",{className:"flex items-start justify-between gap-2",children:[i.jsxs("div",{className:"min-w-0 space-y-1",children:[i.jsxs("div",{className:"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] items-center gap-2",children:[i.jsxs("span",{className:"shrink-0 font-mono text-xs font-semibold text-muted",children:["#",e.id]}),i.jsx("span",{className:"truncate font-mono text-sm",children:e.repo??e.work_key})]}),i.jsx("div",{className:"line-clamp-2 text-sm leading-snug text-foreground",children:e.subject}),i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted",children:[i.jsxs("span",{children:["thread ",e.thread??"n/a"," · ",e.action]}),i.jsx(ls,{intent:e.intent,actionMode:e.action_mode,compact:!0,display:"intent"}),i.jsx(Cn,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url})]})]}),i.jsx(us,{status:e.status})]}),i.jsxs("div",{className:"grid grid-cols-3 gap-2 text-xs",children:[i.jsx(J,{label:"Wait",value:Qe(os(e,n))}),i.jsx(J,{label:"Runtime",value:Qe(as(e,n))}),i.jsx(J,{label:"Updated",value:i.jsx(Ie,{value:e.updated_at,compact:!0,relative:!0,now:n})})]})]}),r||o||c?i.jsxs("div",{className:"flex flex-wrap gap-2 border-t border-border px-3 py-2",children:[i.jsx(Ul,{jobId:e.id,canRetry:r,retrying:s,onRetry:a}),i.jsx($l,{jobId:e.id,canDismiss:o,dismissing:l,onDismiss:u}),i.jsx(Hl,{jobId:e.id,canCancel:c,cancelling:d,onCancel:h})]}):null]})}function Ul({jobId:e,canRetry:t,retrying:n,onRetry:r,compact:s=!1}){if(!t)return null;const a=n?"Retrying...":"Retry";return i.jsxs("button",{className:V("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 disabled:cursor-not-allowed disabled:opacity-60",s?"w-8 px-0":"px-3"),type:"button",disabled:n,"aria-label":`Retry job #${e}`,title:`Retry job #${e}`,onClick:async o=>{o.stopPropagation(),window.confirm(`Retry job #${e}?`)&&await r(e)},children:[i.jsx(Gn,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:V(s&&"sr-only"),children:a})]})}function $l({jobId:e,canDismiss:t,dismissing:n,onDismiss:r,compact:s=!1}){if(!t)return null;const a=n?"Dismissing...":"Dismiss";return i.jsxs("button",{className:V("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 disabled:cursor-not-allowed disabled:opacity-60",s?"w-8 px-0":"px-3"),type:"button",disabled:n,"aria-label":`Dismiss job #${e}`,title:`Dismiss job #${e}`,onClick:async o=>{o.stopPropagation(),window.confirm(`Dismiss job #${e}?`)&&await r(e)},children:[i.jsx(wn,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:V(s&&"sr-only"),children:a})]})}function Hl({jobId:e,canCancel:t,cancelling:n,onCancel:r,compact:s=!1}){if(!t)return null;const a=n?"Cancelling...":"Cancel";return i.jsxs("button",{className:V("inline-flex h-8 items-center justify-center gap-2 rounded-md border border-red-200 bg-red-50 text-sm font-semibold text-red-700 hover:bg-red-100 disabled:cursor-not-allowed disabled:opacity-60",s?"w-8 px-0":"px-3"),type:"button",disabled:n,"aria-label":`Cancel job #${e}`,title:`Cancel job #${e}`,onClick:async o=>{o.stopPropagation();const l=window.prompt(`Cancel job #${e}? Optional reason:`);l!==null&&await r(e,l)},children:[i.jsx(Jt,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:V(s&&"sr-only"),children:a})]})}function Cn({actor:e,avatarUrl:t,framed:n=!1}){const r=t?i.jsx("img",{className:"h-4 w-4 shrink-0 rounded-full bg-slate-100",src:Ze(t),alt:e?`${e} avatar`:"",referrerPolicy:"no-referrer"}):i.jsx(Wn,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),s=i.jsxs(i.Fragment,{children:[r,i.jsx("span",{className:"min-w-0 truncate",children:e?`@${e}`:"unknown actor"})]});return n?i.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:s}):i.jsx("span",{className:"inline-flex min-w-0 max-w-full items-center gap-1 font-mono text-xs text-muted",children:s})}function yx(e){return(e==null?void 0:e.model)??"OpenClaw default"}function wx(e){return(e==null?void 0:e.thinking)??"OpenClaw default"}function vx(e){return e?e.configured?"configured":e.summary:"n/a"}function jx(e,t){const n=t||(e==="work_allowed"?"fix_allowed":"review_only");return n==="fix_allowed"||!t&&e==="work_allowed"?{mode:n,intentLabel:"work_allowed",title:"Work allowed"}:{mode:n,intentLabel:"review_only",title:"Review only"}}function ls({intent:e,actionMode:t,compact:n=!1,display:r="mode"}){const s=jx(e,t),a=s.intentLabel==="work_allowed"?oc:Ho,o=r==="intent"?s.intentLabel:s.mode;return i.jsxs("span",{className:V("inline-flex min-h-6 max-w-full items-center gap-1.5 rounded-md border px-2 text-xs font-semibold",s.intentLabel==="work_allowed"?"border-blue-200 bg-blue-50 text-blue-700":"border-violet-200 bg-violet-50 text-violet-700",n&&"min-h-5 px-1.5 text-[11px]"),title:`${s.title}: ${s.mode}`,"aria-label":`${s.title}: ${o}`,children:[i.jsx(a,{className:V("h-3.5 w-3.5 shrink-0",n&&"h-3 w-3"),"aria-hidden":!0}),i.jsx("span",{className:"truncate font-mono",children:o})]})}function kx({job:e,session:t,sessionEvents:n,transcript:r,now:s,compact:a=!1}){var p;const o=Sn(e.id),l=n??[],u=r??[],c=gf(l),d=bf(u),h=as(e,s),m=os(e,s);return i.jsxs("div",{className:"grid min-w-0 gap-4",children:[i.jsxs("div",{className:"sticky top-0 z-20 -mx-3 -mt-3 grid gap-2 border-b border-border bg-panel/95 px-3 py-2 shadow-sm backdrop-blur sm:-mx-4 sm:-mt-4 sm:px-4","aria-label":"Sticky job header",children:[i.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[i.jsx(us,{status:e.status}),i.jsxs("a",{className:"inline-flex h-7 items-center gap-1 rounded-md border border-border bg-white px-2 text-xs font-semibold text-foreground hover:bg-slate-50",href:o,children:[i.jsx(vn,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Job #",e.id]}),i.jsx(Cn,{actor:e.trigger_actor,avatarUrl:e.trigger_actor_avatar_url,framed:!0}),i.jsx("span",{className:"min-w-0 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:e.work_key})]}),i.jsxs("div",{className:"grid min-w-0 gap-2 lg:grid-cols-[minmax(0,1fr)_minmax(280px,auto)] lg:items-start",children:[i.jsx("p",{className:"min-w-0 break-words text-sm text-muted [overflow-wrap:anywhere]",children:e.subject}),i.jsxs("div",{className:"grid min-w-0 gap-1",children:[i.jsx("h3",{className:"text-xs font-semibold text-muted",children:"GitHub links"}),e.github_urls.length>0?i.jsx(Xn,{urls:e.github_urls,compact:!0}):i.jsx("p",{className:"text-xs text-muted",children:"No links recorded."})]})]})]}),i.jsxs("div",{className:V("grid gap-2 text-sm sm:gap-3",a?"grid-cols-1":"grid-cols-3"),children:[i.jsx(J,{label:"Queue wait",value:Qe(m)}),i.jsx(J,{label:e.status==="running"?"Running for":"Runtime",value:Qe(h)}),i.jsx(J,{label:"Coalesced",value:String(e.coalesced_count)})]}),e.queue_state==="serialized_by_work_key"?i.jsxs("p",{className:"rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900",children:["Serialized behind running job #",e.blocked_by_job_id," for this work key."]}):null,i.jsxs("div",{className:V("grid gap-2 text-sm sm:gap-3",a?"grid-cols-1":"grid-cols-3"),children:[i.jsx(J,{label:"Model",value:yx(e.model_route)}),i.jsx(J,{label:"Reasoning",value:wx(e.model_route)}),i.jsx(J,{label:"Route",value:vx(e.model_route)})]}),i.jsx(Nx,{job:e,compact:a}),i.jsxs("div",{className:V("grid gap-2 text-sm sm:gap-3",a?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[i.jsx(J,{label:"Created",value:i.jsx(Ie,{value:e.created_at,compact:!0,relative:!0,now:s})}),i.jsx(J,{label:"Started",value:e.started_at?i.jsx(Ie,{value:e.started_at,compact:!0,relative:!0,now:s}):"n/a"}),i.jsx(J,{label:"Updated",value:i.jsx(Ie,{value:e.updated_at,compact:!0,relative:!0,now:s})}),i.jsx(J,{label:"Finished",value:e.finished_at?i.jsx(Ie,{value:e.finished_at,compact:!0,relative:!0,now:s}):"n/a"})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Timeline"}),i.jsx("div",{className:"grid min-w-0 gap-3",children:(e.worklog??[]).length>0?(p=e.worklog)==null?void 0:p.map(y=>i.jsxs("div",{className:"min-w-0 border-l-2 border-primary pl-3",children:[i.jsx("div",{className:"text-sm font-semibold",children:y.phase}),i.jsx("div",{className:"font-mono text-xs text-muted",children:i.jsx(Ie,{value:y.ts,relative:!0,now:s})}),i.jsx("div",{className:"break-words text-sm [overflow-wrap:anywhere]",children:y.summary}),y.detail?i.jsx("div",{className:"mt-1 break-words font-mono text-xs text-muted [overflow-wrap:anywhere]",children:y.detail}):null]},y.id)):i.jsx(Z,{text:"No worklog entries."})})]}),i.jsxs("div",{children:[i.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[i.jsx(Qo,{className:"h-4 w-4","aria-hidden":!0}),"OpenClaw session"]}),t?i.jsxs("div",{className:"grid gap-3",children:[i.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[i.jsx(J,{label:"Session ID",value:t.id}),i.jsx(J,{label:"Source",value:t.source})]}),i.jsx("p",{className:"break-words text-xs text-muted [overflow-wrap:anywhere]",children:t.detail})]}):i.jsx(Z,{text:"Session correlation is loading."})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Agent activity"}),i.jsx("div",{className:"grid max-h-[460px] min-w-0 gap-2 overflow-auto pr-1",children:c.length>0?c.map((y,w)=>i.jsx(Cx,{event:y,defaultOpen:no(y.eventType,e.status==="running",w,c.length),now:s},y.id)):i.jsx(Z,{text:e.status==="running"?"Waiting for live agent output...":"No agent activity has been recorded for this session."})})]}),i.jsxs("div",{children:[i.jsx("h3",{className:"mb-2 text-sm font-semibold",children:"Session transcript"}),i.jsx("div",{className:"grid max-h-[620px] min-w-0 gap-2 overflow-auto pr-1",children:d.length>0?d.map((y,w)=>i.jsx(Sx,{entry:y,defaultOpen:no(y.kind,e.status==="running",w,d.length),now:s},y.id)):i.jsx(Z,{text:e.status==="running"?"Waiting for live transcript entries...":"No OpenClaw transcript entries are available for this session."})})]})]})}function Nx({job:e,compact:t=!1}){const n=e.intent_classifier??null,r=(n==null?void 0:n.llm)??{},s=(n==null?void 0:n.parser)??{},a=typeof r.confidence=="number"?`${Math.round(r.confidence*100)}%`:"n/a";return i.jsxs("div",{className:"grid gap-2",children:[i.jsx("h3",{className:"text-sm font-semibold",children:"Action mode"}),i.jsxs("div",{className:V("grid gap-2 text-sm sm:gap-3",t?"grid-cols-1":"grid-cols-2 xl:grid-cols-4"),children:[i.jsx(J,{label:"Mode",value:i.jsx(ls,{intent:e.intent,actionMode:e.action_mode})}),i.jsx(J,{label:"Intent",value:e.intent}),i.jsx(J,{label:"Addressed",value:n?ao(r.addressed_to_agent):"n/a"}),i.jsx(J,{label:"Write",value:n?r.write_permission??"none":e.intent==="work_allowed"?"allowed":"none"})]}),n?i.jsxs("div",{className:"grid gap-2 rounded-md border border-border bg-panel p-3 text-xs",children:[i.jsxs("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-4",children:[i.jsx(nt,{label:"Classifier",value:n.enabled?"enabled":"disabled"}),i.jsx(nt,{label:"Applied",value:ao(r.applied)}),i.jsx(nt,{label:"Confidence",value:a}),i.jsx(nt,{label:"Parser",value:`${s.action??"n/a"} / ${s.work_intent??"n/a"}`})]}),i.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[i.jsx(nt,{label:"LLM",value:`${r.action??"n/a"} / ${r.work_intent??"n/a"}`}),i.jsx(nt,{label:"Scope",value:r.scope||"n/a"})]}),r.main_request?i.jsx(nt,{label:"Main request",value:r.main_request}):null,r.subordinate_reason?i.jsx(nt,{label:"Subordinate reason",value:r.subordinate_reason}):null,r.reason?i.jsx(nt,{label:"Reason",value:r.reason}):null,n.error?i.jsx(nt,{label:"Error",value:n.error,tone:"danger"}):null]}):i.jsx("p",{className:"text-xs text-muted",children:"No intent classifier metadata recorded for this job."})]})}function ao(e){return e===!0?"yes":e===!1?"no":"n/a"}function nt({label:e,value:t,tone:n="neutral"}){return i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),i.jsx("div",{className:V("mt-0.5 min-w-0 break-words font-mono text-xs [overflow-wrap:anywhere]",n==="danger"?"text-red-700":"text-foreground"),children:t})]})}function Sx({entry:e,defaultOpen:t,now:n}){return i.jsx(Kl,{badge:e.badge,meta:i.jsx(Ie,{value:e.meta,relative:!0,now:n}),count:e.count,summary:e.summary,defaultOpen:t,children:i.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 Cx({event:e,defaultOpen:t,now:n}){return i.jsx(Kl,{badge:e.badge,meta:i.jsx(Ie,{value:e.meta,relative:!0,now:n}),count:e.count,summary:e.summary,defaultOpen:t,children:e.detail?i.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 Kl({badge:e,meta:t,count:n,summary:r,defaultOpen:s,children:a}){const[o,l]=T.useState(!!s);return i.jsxs("details",{className:"group min-w-0 rounded border border-border bg-slate-50/60",open:o,onToggle:u=>l(u.currentTarget.open),children:[i.jsxs("summary",{className:"grid cursor-pointer list-none gap-1 px-2 py-1.5 marker:hidden hover:bg-white",children:[i.jsxs("div",{className:"grid min-w-0 gap-1 sm:flex sm:items-center sm:justify-between sm:gap-2",children:[i.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[i.jsx(yn,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),i.jsx("span",{className:"truncate font-mono text-[11px] font-semibold text-muted",children:e}),n&&n>1?i.jsx("span",{className:"rounded-sm border border-border px-1 font-mono text-[10px] text-muted",children:n}):null]}),i.jsx("span",{className:"min-w-0 truncate pl-5 font-mono text-[11px] text-muted sm:shrink-0 sm:pl-0",children:t})]}),i.jsx("div",{className:"min-w-0 break-words pl-5 text-xs text-foreground [overflow-wrap:anywhere] sm:truncate",children:r})]}),i.jsx("div",{className:"min-w-0 border-t border-border bg-white px-2 py-2",children:a})]})}function oo({label:e,values:t}){const n=[{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 i.jsx("div",{className:"h-56",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(Fr,{data:n,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"name"}),i.jsx(ar,{tickFormatter:Qe}),i.jsx(or,{formatter:r=>[Qe(Number(r)),e]}),i.jsx(Vt,{dataKey:"seconds",fill:"#0969da",radius:[4,4,0,0]})]})})})}function _x({values:e,loading:t,totalJobs:n}){const r=Object.entries(e??{}).map(([s,a])=>({day:s,count:a}));return t&&r.length===0?i.jsx(Z,{text:"Loading job history..."}):r.length===0?i.jsx(Z,{text:n>0?"Job history has no valid creation dates.":"No job history available."}):i.jsx("div",{className:"h-56",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(Fr,{data:r,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"day",minTickGap:16}),i.jsx(ar,{allowDecimals:!1}),i.jsx(or,{formatter:s=>[Number(s),"jobs"]}),i.jsx(Vt,{dataKey:"count",fill:"#16a34a",radius:[4,4,0,0]})]})})})}function Ex({usage:e,loading:t,totalJobs:n}){const[r,s]=T.useState("day"),a=(e==null?void 0:e[r])??[],o=a.map(c=>({...c,label:Px(c.bucket,r)})),l=a.reduce((c,d)=>c+d.seconds,0),u=a.reduce((c,d)=>c+(d.runs??d.jobs),0);return t&&o.length===0?i.jsx(Z,{text:"Loading runtime usage..."}):o.length===0?i.jsx(Z,{text:n>0?"No jobs have recorded runtime yet.":"No job history available."}):i.jsxs("div",{className:"grid gap-3",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[i.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted",children:[i.jsx(ac,{className:"h-4 w-4","aria-hidden":!0}),i.jsxs("span",{children:[Cr(l)," consumed across ",u," run",u===1?"":"s"]})]}),i.jsx("div",{className:"inline-flex h-8 rounded-md border border-border bg-white p-0.5","aria-label":"Runtime grouping",children:["day","month"].map(c=>i.jsx("button",{className:V("rounded px-2.5 text-xs font-semibold capitalize",r===c?"bg-primary text-white":"text-muted hover:bg-slate-50"),type:"button",onClick:()=>s(c),children:c},c))})]}),i.jsx("div",{className:"h-64",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(Fr,{data:o,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"label",minTickGap:16,tick:{fontSize:11}}),i.jsx(ar,{tickFormatter:c=>Cr(Number(c))}),i.jsx(ko,{}),i.jsx(or,{formatter:(c,d)=>d==="Work"?[Cr(Number(c)),"work"]:d==="Review"?[Cr(Number(c)),"review"]:[Number(c),String(d)],labelFormatter:c=>String(c)}),i.jsx(Vt,{dataKey:"work_seconds",name:"Work",stackId:"runtime",fill:"#0969da",isAnimationActive:!1}),i.jsx(Vt,{dataKey:"review_seconds",name:"Review",stackId:"runtime",fill:"#8250df",radius:[4,4,0,0],isAnimationActive:!1})]})})})]})}function Px(e,t){if(t==="month"){const[a,o]=e.split("-").map(Number);return!a||!o?e:new Intl.DateTimeFormat(void 0,{month:"short",year:"numeric"}).format(new Date(a,o-1,1))}const[n,r,s]=e.split("-").map(Number);return!n||!r||!s?e:new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric"}).format(new Date(n,r-1,s))}function Cr(e){const t=Math.max(0,Math.round(e));if(t<60)return`${t}s`;const n=Math.round(t/60);if(n<60)return`${n}m`;const r=Math.floor(n/60),s=n%60;return s===0?`${r}h`:`${r}h ${s}m`}function lo(e){return Object.values(e).reduce((t,n)=>t+n,0)}function Rx({data:e,loading:t}){if(t&&!e)return i.jsx(Z,{text:"Loading systemd units..."});if(!e)return i.jsx(Z,{text:"No systemd snapshot available."});const n=e.units??[],r=n.filter(o=>o.active_state==="active").length,s=n.filter(o=>o.active_state==="failed"||o.result==="failed").length,a=n.filter(o=>o.kind==="timer").length;return i.jsxs("div",{className:"grid min-w-0 gap-3",children:[e.errors.length>0?i.jsx(Ne,{tone:"error",text:e.errors[0]}):null,n.length===0?i.jsx(Z,{text:"No configured bridge units found."}):i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[i.jsx(_r,{label:"Units",value:String(n.length)}),i.jsx(_r,{label:"Active",value:String(r)}),i.jsx(_r,{label:"Failed",value:String(s),tone:s>0?"bad":"neutral"}),i.jsx(_r,{label:"Timers",value:String(a)})]}),i.jsxs("div",{className:"overflow-hidden rounded-md border border-border bg-white",children:[i.jsxs("div",{className:"hidden grid-cols-[minmax(0,1.35fr)_90px_120px_90px_minmax(0,1fr)] gap-3 border-b border-border bg-slate-50 px-3 py-2 text-[11px] font-semibold uppercase text-muted md:grid",children:[i.jsx("span",{children:"Unit"}),i.jsx("span",{children:"Status"}),i.jsx("span",{children:"State"}),i.jsx("span",{children:"PID"}),i.jsx("span",{children:"Schedule"})]}),i.jsx("div",{className:"divide-y divide-border",children:n.map(o=>i.jsx(Ix,{unit:o},o.unit))})]})]})]})}function _r({label:e,value:t,tone:n="neutral"}){return i.jsxs("div",{className:V("min-w-0 rounded-md border bg-white px-3 py-2",n==="bad"?"border-red-200":"border-border"),children:[i.jsx("div",{className:V("font-mono text-lg font-semibold",n==="bad"?"text-red-700":"text-foreground"),children:t}),i.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Ix({unit:e}){const[t,n]=T.useState(!1),r=e.active_state==="active",s=e.active_state==="failed"||e.result==="failed",a=e.next_elapse||e.last_trigger||"n/a";return i.jsxs("details",{className:"group min-w-0",open:t,onToggle:o=>n(o.currentTarget.open),children:[i.jsxs("summary",{className:"grid min-w-0 cursor-pointer list-none grid-cols-2 gap-2 px-3 py-3 text-sm marker:hidden hover:bg-slate-50 md:grid-cols-[minmax(0,1.35fr)_90px_120px_90px_minmax(0,1fr)] md:items-center md:gap-3",children:[i.jsxs("div",{className:"col-span-2 min-w-0 md:col-span-1",children:[i.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[i.jsx(yn,{className:"h-3.5 w-3.5 shrink-0 text-muted transition-transform group-open:rotate-180","aria-hidden":!0}),i.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:e.unit})]}),i.jsxs("div",{className:"mt-1 flex flex-wrap items-center gap-1.5 pl-5 text-[11px] font-semibold uppercase text-muted",children:[i.jsx("span",{children:e.role}),i.jsx("span",{children:e.kind}),i.jsx("span",{children:e.load_state}),i.jsx("span",{children:t?"following log":"expand log"})]})]}),i.jsxs("div",{className:"flex flex-wrap items-center gap-2 md:block",children:[i.jsx("span",{className:"text-[11px] font-semibold uppercase text-muted md:hidden",children:"Status"}),i.jsx("span",{className:V("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",s?"border-red-300 bg-red-50 text-red-700":r?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-slate-50 text-slate-700"),children:e.active_state})]}),i.jsx(uo,{label:"State",value:e.sub_state,detail:e.result||"unknown"}),i.jsx(uo,{label:"PID",value:e.main_pid?String(e.main_pid):"n/a",detail:Qe(e.uptime_seconds)}),i.jsxs("div",{className:"col-span-2 min-w-0 md:col-span-1",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted md:hidden",children:"Schedule"}),i.jsx("div",{className:"truncate font-mono text-[11px] text-foreground",title:a,children:e.next_elapse?`next ${e.next_elapse}`:a})]})]}),i.jsx("div",{className:"border-t border-border bg-slate-50 px-3 pb-3 pt-2",children:i.jsx(Tx,{unit:e.unit,active:t})})]})}function uo({label:e,value:t,detail:n}){return i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted md:hidden",children:e}),i.jsx("div",{className:"truncate font-mono text-[11px] text-foreground",children:t}),n?i.jsx("div",{className:"truncate font-mono text-[11px] text-muted",children:n}):null]})}function Tx({unit:e,active:t}){const[n,r]=T.useState([]),[s,a]=T.useState(""),o=T.useRef(null);return T.useEffect(()=>{if(!t){r([]),a("");return}r([]),a("");const l=new EventSource(`/api/systemd/journal/stream?unit=${encodeURIComponent(e)}`);return l.addEventListener("journal_line",u=>{const c=Dr(u);c&&r(d=>[...d.slice(-199),c])}),l.addEventListener("journal_error",u=>{const c=Dr(u);a((c==null?void 0:c.error)??"journal stream failed")}),l.onerror=()=>{},()=>l.close()},[t,e]),T.useEffect(()=>{const l=o.current;l&&(l.scrollTop=l.scrollHeight)},[n]),i.jsxs("div",{className:"grid min-w-0 gap-2",children:[i.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:"Live journal"}),i.jsx("div",{className:"mt-0.5 truncate font-mono text-[11px] text-muted",children:n.length>0?`${n.length} lines streamed`:"waiting for journal output"})]}),i.jsx("div",{className:"font-mono text-[11px] text-muted",children:"journalctl -f"})]}),s?i.jsx(Ne,{tone:"error",text:s}):null,i.jsx("div",{ref:o,className:"h-72 overflow-auto rounded-md border border-slate-800 bg-slate-950 p-3 font-mono text-xs leading-relaxed text-slate-100",children:n.length>0?n.map((l,u)=>i.jsx("div",{className:"break-words [overflow-wrap:anywhere]",children:l.line},`${l.unit}-${u}`)):i.jsx("div",{className:"text-slate-400",children:"No journal lines received yet."})})]})}function Ax({data:e,loading:t}){var h,m,p,y,w,j;if(t&&!e)return i.jsx(Z,{text:"Loading process activity..."});if(!e)return i.jsx(Z,{text:"No process snapshot available."});const n=e.executor.children??[],r=n.flatMap(b=>Vl(b)),s=r.reduce((b,S)=>b+S.cpu_ticks,0),a=r.reduce((b,S)=>b+Mx(S),0),o=e.executor.service==="active",l=r.slice(0,8).map(b=>({label:`pid ${b.pid}`,ticks:b.cpu_ticks})),u=(e.samples??[]).map(b=>({label:Hn(b.ts),ticks:b.cpu_ticks,io:b.io_bytes,active:b.active_since_last_sample?"active":"quiet"})),c=u.length>0?u:l,d=(h=e.samples)==null?void 0:h[e.samples.length-1];return i.jsxs("div",{className:"grid gap-4",children:[i.jsx("div",{className:"rounded-md border border-slate-200 bg-slate-50 p-3",children:i.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[i.jsxs("div",{className:"min-w-0",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i.jsx("span",{className:V("inline-flex h-6 items-center rounded-full border px-2 text-xs font-semibold",o?"border-emerald-300 bg-emerald-50 text-emerald-700":"border-slate-300 bg-white text-slate-600"),children:o?"active":"idle"}),i.jsxs("span",{className:"font-mono text-xs text-muted",children:["service ",e.executor.service]})]}),i.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?i.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:e.running_jobs.slice(0,4).map(b=>i.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:[i.jsx("span",{className:"h-2 w-2 rounded-full bg-blue-600 animate-live-pulse","aria-hidden":!0}),"#",b.id," ",Qe(b.age_seconds)]},b.id))}):null,d?i.jsxs("p",{className:"mt-1 text-xs text-muted",children:["Last persisted sample ",Hn(d.ts)," · ",d.active_since_last_sample?"activity observed":`quiet ${Qe(d.idle_seconds)}`]}):null,i.jsx("p",{className:"mt-1 text-xs text-muted",children:e.detail})]}),i.jsxs("div",{className:"grid min-w-[190px] grid-cols-3 gap-2 text-center text-xs",children:[i.jsx(oi,{label:"PID",value:e.executor.pid?String(e.executor.pid):"n/a"}),i.jsx(oi,{label:"Children",value:String(r.length)}),i.jsx(oi,{label:"CPU ticks",value:String(s)})]})]})}),i.jsxs("div",{className:"grid gap-2 sm:grid-cols-2",children:[i.jsx(Er,{label:"Live process",value:((m=e.signals)==null?void 0:m.live_process.state)??(r.length>0?"live":"no_child_process"),detail:`${((p=e.signals)==null?void 0:p.live_process.child_count)??r.length} children`}),i.jsx(Er,{label:"Process activity",value:((y=e.signals)==null?void 0:y.process_activity.state)??(d!=null&&d.active_since_last_sample?"active":"quiet"),detail:d?`sample ${Hn(d.ts)}`:"no sample"}),i.jsx(Er,{label:"Semantic progress",value:(w=e.signals)!=null&&w.semantic_progress.length?"recent":"none",detail:co(e.running_jobs,"semantic_progress")}),i.jsx(Er,{label:"Visible progress",value:(j=e.signals)!=null&&j.visible_progress.length?"streaming":"none",detail:co(e.running_jobs,"visible_progress")})]}),e.alerts.length>0?i.jsx(Ne,{tone:"error",text:e.alerts[0]}):null,i.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]",children:[i.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[i.jsxs("div",{className:"mb-3 flex items-center justify-between gap-3",children:[i.jsxs("h3",{className:"flex items-center gap-2 text-sm font-semibold",children:[i.jsx(ma,{className:"h-4 w-4","aria-hidden":!0}),u.length>0?"CPU history":"CPU ticks"]}),i.jsxs("span",{className:"font-mono text-xs text-muted",children:[Wl(a)," I/O"]})]}),c.length>0?i.jsx("div",{className:"h-40",children:i.jsx(rr,{width:"100%",height:"100%",children:i.jsxs(ou,{data:c,children:[i.jsx(ir,{strokeDasharray:"3 3"}),i.jsx(sr,{dataKey:"label",tick:!1}),i.jsx(ar,{allowDecimals:!1,tick:{fontSize:11}}),i.jsx(or,{formatter:b=>[Number(b),"cpu ticks"]}),i.jsx(lu,{type:"monotone",dataKey:"ticks",stroke:"#0f766e",strokeWidth:2,dot:{r:3},activeDot:{r:5},isAnimationActive:!1})]})})}):i.jsx(Z,{text:"No executor CPU samples available."})]}),i.jsxs("div",{className:"min-w-0",children:[i.jsxs("h3",{className:"mb-2 flex items-center gap-2 text-sm font-semibold",children:[i.jsx(ma,{className:"h-4 w-4","aria-hidden":!0}),"Executor children"]}),n.length>0?i.jsx("div",{className:"grid gap-2",children:n.map(b=>i.jsx(Ql,{process:b},b.pid))}):i.jsx(Z,{text:"No child process detected for the executor."})]})]})]})}function Lx({alerts:e,loading:t,now:n}){if(t&&!e)return i.jsx(Z,{text:"Loading monitor alerts..."});const r=e??[];return r.length===0?i.jsx(Z,{text:"No active monitor alerts."}):i.jsx("div",{className:"grid gap-2",children:r.slice(0,5).map(s=>i.jsxs("div",{className:"rounded-md border border-red-200 bg-red-50 p-2.5",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-semibold text-red-700",children:[i.jsx(zr,{className:"h-3.5 w-3.5","aria-hidden":!0}),i.jsx("span",{children:s.severity}),i.jsx("span",{className:"font-normal text-red-600",children:Ll(s.last_seen,n)}),s.observations>1?i.jsxs("span",{className:"rounded-full border border-red-200 bg-white px-1.5",children:[s.observations,"x"]}):null]}),i.jsx("p",{className:"mt-1 break-words text-sm font-medium text-red-950 [overflow-wrap:anywhere]",children:s.message})]},s.fingerprint))})}function Ql({process:e}){var r,s;const t=((r=e.io_bytes)==null?void 0:r.read_bytes)??0,n=((s=e.io_bytes)==null?void 0:s.write_bytes)??0;return i.jsxs("div",{className:"rounded-md border border-border bg-white p-2.5",children:[i.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[i.jsxs("span",{className:"font-mono",children:["pid ",e.pid]}),i.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["state ",e.state]}),i.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["cpu ",e.cpu_ticks]}),i.jsxs("span",{className:"rounded-full border border-border px-2 text-xs text-muted",children:["I/O ",Wl(t+n)]})]}),i.jsx("div",{className:"mt-2 break-words font-mono text-xs text-muted",children:e.cmd||"unknown command"}),e.children&&e.children.length>0?i.jsx("div",{className:"mt-3 border-l-2 border-border pl-3",children:e.children.map(a=>i.jsx(Ql,{process:a},a.pid))}):null]})}function oi({label:e,value:t}){return i.jsxs("div",{className:"rounded-md border border-border bg-white px-2 py-2",children:[i.jsx("div",{className:"font-mono text-sm font-semibold text-foreground",children:t}),i.jsx("div",{className:"mt-0.5 text-[11px] font-semibold uppercase text-muted",children:e})]})}function Er({label:e,value:t,detail:n}){return i.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-white p-2.5",children:[i.jsx("div",{className:"text-[11px] font-semibold uppercase text-muted",children:e}),i.jsx("div",{className:"mt-1 truncate text-sm font-semibold text-foreground",children:t}),i.jsx("div",{className:"mt-1 truncate font-mono text-[11px] text-muted",children:n})]})}function co(e,t){const n=e.find(s=>s[t]),r=n==null?void 0:n[t];return!n||!r?"no running heartbeat":`#${n.id} ${r.phase} ${Qe(r.age_seconds??null)}`}function Vl(e){return[e,...(e.children??[]).flatMap(t=>Vl(t))]}function Mx(e){var t,n;return(((t=e.io_bytes)==null?void 0:t.read_bytes)??0)+(((n=e.io_bytes)==null?void 0:n.write_bytes)??0)}function Wl(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function J({label:e,value:t}){return i.jsxs("div",{className:"min-w-0 rounded-md border border-border p-3",children:[i.jsx("div",{className:"text-xs font-semibold text-muted",children:e}),i.jsx("div",{className:"mt-1 min-w-0 break-words text-sm [overflow-wrap:anywhere]",children:t})]})}function us({status:e}){const t=yf(e),n=e==="running"||e==="pending";return i.jsxs("span",{className:V("inline-flex min-h-6 items-center gap-1.5 rounded-full border px-2 text-xs font-semibold",t.badge),children:[i.jsx("span",{className:V("h-2.5 w-2.5 rounded-full",t.dot,n&&"animate-live-pulse"),"aria-hidden":!0}),e]})}function Z({text:e}){return i.jsx("div",{className:"rounded-md border border-dashed border-border p-6 text-center text-sm text-muted",children:e})}function Ne({tone:e,text:t}){return i.jsx("div",{className:V("rounded-md border p-3 text-sm",e==="error"&&"border-red-300 bg-red-50 text-red-700",e==="warning"&&"border-amber-300 bg-amber-50 text-amber-800"),children:t})}function lt({onClick:e,compactOnMobile:t=!1}){return i.jsxs("button",{className:V("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:[i.jsx(ur,{className:"h-4 w-4","aria-hidden":!0}),i.jsx("span",{className:V(t&&"hidden sm:inline"),children:"Refresh"})]})}const ho=document.getElementById("root");ho&&pu.createRoot(ho).render(i.jsx(T.StrictMode,{children:i.jsx(Bu,{client:lf,children:i.jsx(Ff,{})})})); diff --git a/src/github_agent_bridge/dashboard_static/index.html b/src/github_agent_bridge/dashboard_static/index.html index 610b9a9..b9394e8 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/src/github_agent_bridge/queue.py b/src/github_agent_bridge/queue.py index 32910ef..017613a 100644 --- a/src/github_agent_bridge/queue.py +++ b/src/github_agent_bridge/queue.py @@ -876,6 +876,7 @@ def _ensure_columns(self, con: sqlite3.Connection) -> None: "webhook_shadow_receipts": { "duplicate_count": "INTEGER NOT NULL DEFAULT 0", "hook_id": "TEXT", + "payload_json": "TEXT", }, "webhook_hooks": { "name": "TEXT", diff --git a/src/github_agent_bridge/sql/schema.sql b/src/github_agent_bridge/sql/schema.sql index b725df5..efb8223 100644 --- a/src/github_agent_bridge/sql/schema.sql +++ b/src/github_agent_bridge/sql/schema.sql @@ -88,6 +88,7 @@ CREATE TABLE IF NOT EXISTS webhook_shadow_receipts ( event_key TEXT, repository TEXT, payload_hash TEXT NOT NULL, + payload_json TEXT, status TEXT NOT NULL CHECK(status IN ('observed','duplicate','unsupported')), duplicate_count INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL @@ -120,6 +121,17 @@ CREATE TABLE IF NOT EXISTS webhook_hooks ( updated_at TEXT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_webhook_hooks_page ON webhook_hooks(updated_at DESC, hook_id DESC); +CREATE TABLE IF NOT EXISTS webhook_hook_actions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + hook_id TEXT NOT NULL, + action TEXT NOT NULL CHECK(action IN ('ping')), + actor TEXT NOT NULL, + status TEXT NOT NULL CHECK(status IN ('requested','succeeded','failed')), + detail TEXT, + created_at TEXT NOT NULL, + completed_at TEXT +); +CREATE INDEX IF NOT EXISTS idx_webhook_hook_actions_hook ON webhook_hook_actions(hook_id, created_at DESC); CREATE TABLE IF NOT EXISTS coalesced_notifications ( id INTEGER PRIMARY KEY AUTOINCREMENT, job_id INTEGER NOT NULL REFERENCES jobs(id) ON DELETE CASCADE, diff --git a/src/github_agent_bridge/systemd_status.py b/src/github_agent_bridge/systemd_status.py index a4540b5..f5191fd 100644 --- a/src/github_agent_bridge/systemd_status.py +++ b/src/github_agent_bridge/systemd_status.py @@ -19,6 +19,8 @@ class BridgeUnit: BRIDGE_UNITS = [ BridgeUnit("executor", "service", "GITHUB_AGENT_BRIDGE_EXECUTOR_UNIT", "github-agent-bridge.service"), BridgeUnit("dashboard", "service", "GITHUB_AGENT_BRIDGE_DASHBOARD_UNIT", "github-agent-bridge-dashboard.service"), + BridgeUnit("webhook", "service", "GITHUB_AGENT_BRIDGE_WEBHOOK_UNIT", "github-agent-bridge-webhook.service"), + BridgeUnit("webhook", "socket", "GITHUB_AGENT_BRIDGE_WEBHOOK_SOCKET_UNIT", "github-agent-bridge-webhook.socket"), BridgeUnit("reader", "service", "GITHUB_AGENT_BRIDGE_READER_SERVICE_UNIT", "github-agent-bridge-reader.service"), BridgeUnit("reader", "timer", "GITHUB_AGENT_BRIDGE_READER_TIMER_UNIT", "github-agent-bridge-reader.timer"), BridgeUnit("monitor", "service", "GITHUB_AGENT_BRIDGE_MONITOR_SERVICE_UNIT", "github-agent-bridge-monitor.service"), diff --git a/src/github_agent_bridge/webhook.py b/src/github_agent_bridge/webhook.py index 009005c..9d73108 100644 --- a/src/github_agent_bridge/webhook.py +++ b/src/github_agent_bridge/webhook.py @@ -137,8 +137,11 @@ def persist_shadow_delivery( ) try: con.execute( - "INSERT INTO webhook_shadow_receipts(delivery_id,hook_id,event_name,action,event_key,repository,payload_hash,status,created_at) VALUES(?,?,?,?,?,?,?,?,?)", - (delivery_id, hook_id, event_name, action, event_key, repo, payload_hash, status, now), + "INSERT INTO webhook_shadow_receipts(delivery_id,hook_id,event_name,action,event_key,repository,payload_hash,payload_json,status,created_at) VALUES(?,?,?,?,?,?,?,?,?,?)", + ( + delivery_id, hook_id, event_name, action, event_key, repo, + payload_hash, raw_payload.decode("utf-8"), status, now, + ), ) except sqlite3.IntegrityError: con.rollback() diff --git a/systemd/env.example b/systemd/env.example index 579e84e..f849cca 100644 --- a/systemd/env.example +++ b/systemd/env.example @@ -31,6 +31,8 @@ GITHUB_AGENT_BRIDGE_SYSTEMCTL_BIN=systemctl GITHUB_AGENT_BRIDGE_JOURNALCTL_BIN=journalctl GITHUB_AGENT_BRIDGE_EXECUTOR_UNIT=github-agent-bridge.service GITHUB_AGENT_BRIDGE_DASHBOARD_UNIT=github-agent-bridge-dashboard.service +GITHUB_AGENT_BRIDGE_WEBHOOK_UNIT=github-agent-bridge-webhook.service +GITHUB_AGENT_BRIDGE_WEBHOOK_SOCKET_UNIT=github-agent-bridge-webhook.socket GITHUB_AGENT_BRIDGE_READER_SERVICE_UNIT=github-agent-bridge-reader.service GITHUB_AGENT_BRIDGE_READER_TIMER_UNIT=github-agent-bridge-reader.timer GITHUB_AGENT_BRIDGE_MONITOR_SERVICE_UNIT=github-agent-bridge-monitor.service @@ -76,6 +78,9 @@ GITHUB_AGENT_BRIDGE_DASHBOARD_ALLOWED_TEAMS= GITHUB_AGENT_BRIDGE_DASHBOARD_ADMIN_USERS= GITHUB_AGENT_BRIDGE_DASHBOARD_ADMIN_TEAMS= GITHUB_AGENT_BRIDGE_DASHBOARD_PUBLIC_URL= +# Used only when running the dedicated ingress without socket activation. +GITHUB_AGENT_BRIDGE_WEBHOOK_HOST=127.0.0.1 +GITHUB_AGENT_BRIDGE_WEBHOOK_PORT=8766 # Optional browser Push API notifications for completed bridge jobs. The public # key is served to signed-in dashboard users; keep the private key secret. GITHUB_AGENT_BRIDGE_WEB_PUSH_VAPID_PUBLIC_KEY= @@ -90,3 +95,6 @@ GITHUB_AGENT_BRIDGE_WEB_PUSH_ICON_URL= # the same policy used by the reader and only enqueues policy.enabledRepos. GITHUB_AGENT_BRIDGE_WEBHOOK_MODE=shadow GITHUB_AGENT_BRIDGE_WEBHOOK_POLICY=%h/.config/github-agent-bridge/policy.json +# Required in addition to WEBHOOK_MODE=primary. This prevents a config typo from +# changing the source of work without an explicit operator decision. +GITHUB_AGENT_BRIDGE_WEBHOOK_PRIMARY_ACK= diff --git a/systemd/github-agent-bridge-dashboard.service b/systemd/github-agent-bridge-dashboard.service index 3532468..e87a747 100644 --- a/systemd/github-agent-bridge-dashboard.service +++ b/systemd/github-agent-bridge-dashboard.service @@ -11,7 +11,7 @@ Environment=GITHUB_AGENT_BRIDGE_DASHBOARD_PORT=8765 EnvironmentFile=-%h/.config/github-agent-bridge/env ExecStart=%h/.local/bin/github-agent-bridge-dashboard Restart=always -RestartSec=5 +RestartSec=1 [Install] WantedBy=default.target diff --git a/systemd/github-agent-bridge-webhook.service b/systemd/github-agent-bridge-webhook.service new file mode 100644 index 0000000..f19eebb --- /dev/null +++ b/systemd/github-agent-bridge-webhook.service @@ -0,0 +1,17 @@ +[Unit] +Description=GitHub Agent Bridge webhook ingress +Requires=github-agent-bridge-webhook.socket +After=network-online.target github-agent-bridge-webhook.socket +Wants=network-online.target + +[Service] +Type=simple +Environment=GITHUB_AGENT_BRIDGE_DASHBOARD_DB=%h/.local/state/github-agent-bridge/bridge.sqlite3 +EnvironmentFile=-%h/.config/github-agent-bridge/env +Sockets=github-agent-bridge-webhook.socket +ExecStart=%h/.local/bin/github-agent-bridge-webhook --fd 3 +Restart=on-failure +RestartSec=500ms + +[Install] +WantedBy=default.target diff --git a/systemd/github-agent-bridge-webhook.socket b/systemd/github-agent-bridge-webhook.socket new file mode 100644 index 0000000..04d15db --- /dev/null +++ b/systemd/github-agent-bridge-webhook.socket @@ -0,0 +1,11 @@ +[Unit] +Description=GitHub Agent Bridge webhook ingress socket + +[Socket] +ListenStream=127.0.0.1:8766 +NoDelay=true +KeepAlive=true +Backlog=4096 + +[Install] +WantedBy=sockets.target diff --git a/tests/test_autoupdate.py b/tests/test_autoupdate.py index 23b21c3..b8d0f5e 100644 --- a/tests/test_autoupdate.py +++ b/tests/test_autoupdate.py @@ -157,6 +157,46 @@ def test_dashboard_only_update_can_stage_while_jobs_are_active(tmp_path, monkeyp ] +def test_webhook_only_update_restarts_only_ingress(tmp_path, monkeypatch): + monkeypatch.setattr("github_agent_bridge.actors.github_actor_details_for_context", lambda ctx, *, gh_bin="gh": None) + db = tmp_path / "bridge.sqlite3" + JobQueue(db) + + plan = plan_update( + db, + repo_dir=tmp_path, + installed_version="1.2.3", + runner=release_runner("v1.2.4", ["src/github_agent_bridge/webhook.py"]), + ) + + assert plan["decision"] == "stage_webhook_reload" + assert plan["classification"]["webhook_only"] is True + assert plan["service_plan"]["immediate"] == [{ + "command": "try-restart", + "unit": "github-agent-bridge-webhook.service", + "reason": "webhook ingress update can reload independently", + }] + + +def test_shared_dashboard_and_ingress_update_restarts_both_apis(tmp_path, monkeypatch): + monkeypatch.setattr("github_agent_bridge.actors.github_actor_details_for_context", lambda ctx, *, gh_bin="gh": None) + db = tmp_path / "bridge.sqlite3" + JobQueue(db) + + plan = plan_update( + db, + repo_dir=tmp_path, + installed_version="1.2.3", + runner=release_runner("v1.2.4", ["src/github_agent_bridge/backend.py"]), + ) + + assert plan["decision"] == "stage_api_reload" + assert [item["unit"] for item in plan["service_plan"]["immediate"]] == [ + "github-agent-bridge-dashboard.service", + "github-agent-bridge-webhook.service", + ] + + def test_executor_update_records_pending_reload_when_jobs_are_active(tmp_path, monkeypatch): monkeypatch.setattr("github_agent_bridge.actors.github_actor_details_for_context", lambda ctx, *, gh_bin="gh": None) db = tmp_path / "bridge.sqlite3" diff --git a/tests/test_backend.py b/tests/test_backend.py index 2e75559..6125603 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -75,6 +75,7 @@ def test_dashboard_status_is_read_only_and_lists_recent_jobs(tmp_path): "delete_knowledge_rule", "create_mcp_token", "revoke_mcp_token", + "ping_webhook", "view_autoupdate_plan", "refresh_autoupdate_plan", "apply_autoupdate", diff --git a/tests/test_webhook.py b/tests/test_webhook.py index 5ad3899..3ea7d85 100644 --- a/tests/test_webhook.py +++ b/tests/test_webhook.py @@ -9,12 +9,28 @@ from fastapi.testclient import TestClient from github_agent_bridge import backend -from github_agent_bridge.backend import DashboardConfig, _encode_session, _sign, create_app +from github_agent_bridge.backend import DashboardConfig, _encode_session, _sign, create_app, create_webhook_app SECRET = "test-secret" +def test_dedicated_webhook_ingress_exposes_only_health_and_delivery(tmp_path): + client = TestClient(create_webhook_app(DashboardConfig( + db=tmp_path / "bridge.sqlite3", webhook_secrets=(SECRET,), + ))) + payload = issue_comment_payload() + + assert client.get("/api/health").json() == { + "ok": True, "service": "github-agent-bridge-webhook-ingress", + } + assert client.post( + "/api/webhooks/github", content=payload, headers=signed_headers(payload), + ).json()["status"] == "observed" + assert client.get("/").status_code == 404 + assert client.get("/api/webhooks/github/summary").status_code == 404 + + def signed_headers(payload: bytes, *, delivery: str = "delivery-1", event: str = "issue_comment", secret: str = SECRET) -> dict[str, str]: digest = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest() return { @@ -157,6 +173,19 @@ def test_webhook_canary_enqueues_enabled_actionable_repository_once(tmp_path): assert first.json()["enqueue_status"] == "enqueued" assert first.json()["job_id"] assert retry.json()["enqueue_status"] == "duplicate" + detail = client.get("/api/webhooks/github/deliveries/delivery-1").json() + assert detail["delivery"]["delivery_id"] == "delivery-1" + assert detail["payload"] == json.loads(payload) + assert detail["payload_hash"] == hashlib.sha256(payload).hexdigest() + assert detail["job"] == { + "id": first.json()["job_id"], + "work_key": "gisce/github-agent-bridge#191", + "status": "pending", + "action": "reply_comment", + "decision": "auto_trusted", + "work_intent": "work_allowed", + "updated_at": detail["job"]["updated_at"], + } with sqlite3.connect(config.db) as con: assert con.execute("SELECT COUNT(*) FROM jobs").fetchone()[0] == 1 assert con.execute( @@ -227,6 +256,41 @@ def test_webhook_canary_ignores_successful_workflow_run(tmp_path): assert con.execute("SELECT COUNT(*) FROM jobs").fetchone()[0] == 0 +def test_webhook_primary_requires_explicit_acknowledgement(tmp_path): + try: + DashboardConfig( + db=tmp_path / "bridge.sqlite3", webhook_mode="primary", + webhook_policy=canary_policy(tmp_path), webhook_primary_ack=False, + ) + except ValueError as exc: + assert "PRIMARY_ACK" in str(exc) + else: + raise AssertionError("primary mode must require an explicit acknowledgement") + + +def test_webhook_primary_enqueues_trusted_repo_without_canary_allowlist(tmp_path): + policy = canary_policy(tmp_path) + policy.write_text(json.dumps({ + "trustedOrgs": ["gisce"], "enabledRepos": [], "botLogins": ["giscebot"], + "actions": {"trustedAuto": ["reply_comment"]}, + })) + payload = actionable_issue_comment_payload() + config = DashboardConfig( + db=tmp_path / "bridge.sqlite3", require_auth=False, + webhook_secrets=(SECRET,), webhook_mode="primary", webhook_policy=policy, + webhook_primary_ack=True, + ) + + response = TestClient(create_app(config)).post( + "/api/webhooks/github", content=payload, headers=signed_headers(payload), + ) + + assert response.json()["mode"] == "primary" + assert response.json()["enqueue_status"] == "enqueued" + with sqlite3.connect(config.db) as con: + assert con.execute("SELECT first_source FROM github_events").fetchone()[0] == "webhook" + + def test_webhook_shadow_selects_secret_by_repository_owner(tmp_path): payload = issue_comment_payload() client = TestClient(create_app(DashboardConfig( @@ -285,12 +349,18 @@ def test_webhook_status_requires_dashboard_admin(tmp_path): ) assert {client.get(path).status_code for path in paths} == {401} assert client.get("/api/webhooks/github/hooks/42").status_code == 401 + assert client.post("/api/webhooks/github/hooks/42/ping").status_code == 401 + assert client.get("/api/webhooks/github/deliveries/delivery-1").status_code == 401 client.cookies.set("gab_dashboard_session", _sign(config, _encode_session({"login": "alice"}))) assert {client.get(path).status_code for path in paths} == {403} assert client.get("/api/webhooks/github/hooks/42").status_code == 403 + assert client.post("/api/webhooks/github/hooks/42/ping").status_code == 403 + assert client.get("/api/webhooks/github/deliveries/delivery-1").status_code == 403 client.cookies.set("gab_dashboard_session", _sign(config, _encode_session({"login": "operator"}, is_admin=True))) assert {client.get(path).status_code for path in paths} == {200} assert client.get("/api/webhooks/github/hooks/42").status_code == 404 + assert client.post("/api/webhooks/github/hooks/42/ping").status_code == 404 + assert client.get("/api/webhooks/github/deliveries/delivery-1").status_code == 404 assert client.get("/api/status").json()["webhook_configured"] is True @@ -365,6 +435,7 @@ def test_webhook_monitoring_endpoints_keep_summary_light_and_return_real_data(tm assert detail["stats"] == {"deliveries": 2, "duplicates": 0, "unsupported": 1} assert {item["delivery_id"] for item in detail["recent_deliveries"]} == {"ping-1", "delivery-1"} assert "secret" not in json.dumps(detail) + assert detail["recent_actions"] == [] first_page = client.get("/api/webhooks/github/deliveries", params={"limit": 1}).json() assert len(first_page["deliveries"]) == 1 @@ -382,6 +453,14 @@ def test_webhook_monitoring_endpoints_keep_summary_light_and_return_real_data(tm } assert second_page["next_cursor"] is None + delivery_detail = client.get("/api/webhooks/github/deliveries/delivery-1").json() + assert delivery_detail["delivery"] == next( + item for item in deliveries if item["delivery_id"] == "delivery-1" + ) + assert delivery_detail["payload"] == json.loads(delivery) + assert delivery_detail["payload_hash"] == hashlib.sha256(delivery).hexdigest() + assert delivery_detail["job"] is None + filtered = client.get("/api/webhooks/github/deliveries", params={ "hook_id": "42", "event_name": "issue_comment", "repository": "gisce/github-agent-bridge", "result": "observed", @@ -403,6 +482,89 @@ def test_webhook_monitoring_endpoints_keep_summary_light_and_return_real_data(tm } +def test_admin_can_request_hook_ping_and_action_is_audited(tmp_path, monkeypatch): + db = tmp_path / "bridge.sqlite3" + client = TestClient(create_app(DashboardConfig(db=db, require_auth=False, webhook_secrets=(SECRET,)))) + ping = json.dumps({ + "hook": { + "id": 42, "active": True, "events": ["issue_comment"], + "ping_url": "https://api.github.com/orgs/gisce/hooks/42/pings", + }, + "organization": {"login": "gisce"}, + }).encode() + assert client.post( + "/api/webhooks/github", content=ping, + headers=hook_headers(ping, delivery="ping-config", event="ping", hook_id="42"), + ).status_code == 200 + calls = [] + + def fake_ping(endpoint, *, gh_bin): + calls.append((endpoint, gh_bin)) + return backend.subprocess.CompletedProcess([], 0, "", "") + + monkeypatch.setattr(backend, "_request_webhook_ping", fake_ping) + response = client.post("/api/webhooks/github/hooks/42/ping") + + assert response.status_code == 200 + assert response.json()["status"] == "succeeded" + assert calls == [("/orgs/gisce/hooks/42/pings", "gh")] + action = client.get("/api/webhooks/github/hooks/42").json()["recent_actions"][0] + assert action["action"] == "ping" + assert action["actor"] == "test" + assert action["status"] == "succeeded" + assert action["completed_at"] + + +def test_hook_ping_rejects_untrusted_stored_api_url(tmp_path, monkeypatch): + db = tmp_path / "bridge.sqlite3" + client = TestClient(create_app(DashboardConfig(db=db, require_auth=False, webhook_secrets=(SECRET,)))) + ping = json.dumps({ + "hook": { + "id": 42, "active": True, + "ping_url": "https://attacker.example/orgs/gisce/hooks/42/pings", + }, + "organization": {"login": "gisce"}, + }).encode() + assert client.post( + "/api/webhooks/github", content=ping, + headers=hook_headers(ping, delivery="ping-config", event="ping", hook_id="42"), + ).status_code == 200 + monkeypatch.setattr(backend, "_request_webhook_ping", lambda *args, **kwargs: None) + + response = client.post("/api/webhooks/github/hooks/42/ping") + + assert response.status_code == 409 + assert response.json()["detail"] == "webhook_ping_url_invalid" + + +def test_failed_hook_ping_is_audited_without_exposing_cli_error(tmp_path, monkeypatch): + db = tmp_path / "bridge.sqlite3" + client = TestClient(create_app(DashboardConfig(db=db, require_auth=False, webhook_secrets=(SECRET,)))) + ping = json.dumps({ + "hook": { + "id": 42, "active": True, + "ping_url": "https://api.github.com/orgs/gisce/hooks/42/pings", + }, + "organization": {"login": "gisce"}, + }).encode() + client.post( + "/api/webhooks/github", content=ping, + headers=hook_headers(ping, delivery="ping-config", event="ping", hook_id="42"), + ) + monkeypatch.setattr( + backend, "_request_webhook_ping", + lambda *args, **kwargs: backend.subprocess.CompletedProcess([], 1, "", "permission denied: sensitive detail"), + ) + + response = client.post("/api/webhooks/github/hooks/42/ping") + + assert response.status_code == 502 + assert response.json()["detail"] == "github_webhook_ping_failed" + assert "sensitive detail" not in response.text + action = client.get("/api/webhooks/github/hooks/42").json()["recent_actions"][0] + assert action["status"] == "failed" + assert action["detail"] == "permission denied: sensitive detail" + def test_webhook_monitoring_rejects_unbounded_ranges_and_invalid_cursors(tmp_path): client = TestClient(create_app(DashboardConfig( db=tmp_path / "bridge.sqlite3", require_auth=False, webhook_secrets=(SECRET,), diff --git a/tests/test_webhook_systemd.py b/tests/test_webhook_systemd.py new file mode 100644 index 0000000..e432fe3 --- /dev/null +++ b/tests/test_webhook_systemd.py @@ -0,0 +1,33 @@ +from pathlib import Path + +from github_agent_bridge.backend import build_parser + + +ROOT = Path(__file__).resolve().parents[1] + + +def test_webhook_cli_accepts_inherited_socket_fd(): + args = build_parser(ingress=True).parse_args(["--fd", "3"]) + + assert args.fd == 3 + assert args.port == 8766 + + +def test_webhook_systemd_service_consumes_socket_activation_fd(): + service = (ROOT / "systemd/github-agent-bridge-webhook.service").read_text() + socket = (ROOT / "systemd/github-agent-bridge-webhook.socket").read_text() + + assert "Sockets=github-agent-bridge-webhook.socket" in service + assert "github-agent-bridge-webhook --fd 3" in service + assert "RestartSec=500ms" in service + assert "ListenStream=127.0.0.1:8766" in socket + assert "Backlog=4096" in socket + + +def test_nginx_routes_webhook_to_dedicated_ingress(): + nginx = (ROOT / "docs/nginx-dashboard.conf").read_text() + + webhook_location = nginx.index("location = /api/webhooks/github") + dashboard_location = nginx.index("location / {") + assert webhook_location < dashboard_location + assert "proxy_pass http://127.0.0.1:8766;" in nginx[webhook_location:dashboard_location]