import { usePluginAction, usePluginData, type PluginDetailTabProps, type PluginSettingsPageProps, type PluginWidgetProps, } from "@paperclipai/plugin-sdk/ui"; import type React from "react"; type SurfaceStatus = { status: "ok" | "degraded" | "error"; checkedAt: string; databaseNamespace: string; routeKeys: string[]; capabilities: string[]; summary: null | { rootIssueId: string; childIssueId: string | null; blockerIssueId: string | null; billingCode: string; subtreeIssueIds: string[]; wakeupQueued: boolean; }; }; const panelStyle = { display: "grid", gap: 10, fontSize: 13, lineHeight: 1.45, } satisfies React.CSSProperties; const rowStyle = { display: "flex", justifyContent: "space-between", gap: 12, } satisfies React.CSSProperties; const buttonStyle = { border: "1px solid #1f2937", background: "#111827", color: "#fff", borderRadius: 6, padding: "6px 10px", font: "inherit", cursor: "pointer", } satisfies React.CSSProperties; function SurfaceRows({ data }: { data: SurfaceStatus }) { return (
Status{data.status}
Namespace{data.databaseNamespace}
Routes{data.routeKeys.join(", ")}
Capabilities{data.capabilities.length}
); } export function DashboardWidget({ context }: PluginWidgetProps) { const { data, loading, error } = usePluginData("surface-status", { companyId: context.companyId, }); if (loading) return
Loading orchestration smoke status...
; if (error) return
Orchestration smoke error: {error.message}
; if (!data) return null; return (
Orchestration Smoke
Checked {data.checkedAt}
); } export function IssuePanel({ context }: PluginDetailTabProps) { const { data, loading, error, refresh } = usePluginData("surface-status", { companyId: context.companyId, issueId: context.entityId, }); const initialize = usePluginAction("initialize-smoke"); if (loading) return
Loading orchestration smoke...
; if (error) return
Orchestration smoke error: {error.message}
; if (!data) return null; return (
Orchestration Smoke
{data.summary ? (
Child{data.summary.childIssueId ?? "none"}
Blocker{data.summary.blockerIssueId ?? "none"}
Billing{data.summary.billingCode}
Subtree{data.summary.subtreeIssueIds.length}
Wakeup{data.summary.wakeupQueued ? "queued" : "not queued"}
) : (
No smoke run recorded for this issue.
)}
); } export function SettingsPage({ context }: PluginSettingsPageProps) { const { data, loading, error } = usePluginData("surface-status", { companyId: context.companyId, }); if (loading) return
Loading orchestration smoke settings...
; if (error) return
Orchestration smoke settings error: {error.message}
; if (!data) return null; return (
Orchestration Smoke Surface
); }