diff --git a/ui/src/components/EmptyState.tsx b/ui/src/components/EmptyState.tsx index 2e2612ab8fb..3cadb4536aa 100644 --- a/ui/src/components/EmptyState.tsx +++ b/ui/src/components/EmptyState.tsx @@ -5,17 +5,20 @@ import { Button } from "@/components/ui/button"; interface EmptyStateProps { icon: LucideIcon; message: string; + /** Optional secondary line rendered under the primary message. */ + description?: string; action?: string; onAction?: () => void; } -export function EmptyState({ icon: Icon, message, action, onAction }: EmptyStateProps) { +export function EmptyState({ icon: Icon, message, description, action, onAction }: EmptyStateProps) { return (
{message}
+{message}
+ {description &&{description}
} {action && onAction && ({entry.description}
) : null} @@ -77,10 +82,304 @@ function CatalogDialog({ ); } +type CredentialDraft = { secretId: string; headerName: string }; + +/** + * New-connection dialog. Enforces secret *references* (no free-text token field) + * and runs a live gateway probe (health-check) against the draft before the + * operator activates it — per the Phase 0B spec surface map. + */ +function NewConnectionDialog({ companyId, onClose }: { companyId: string; onClose: () => void }) { + const qc = useQueryClient(); + const { pushToast } = useToast(); + + const apps = useQuery({ + queryKey: queryKeys.tools.applications(companyId), + queryFn: () => toolsApi.listApplications(companyId), + }); + const secrets = useQuery({ + queryKey: queryKeys.secrets.list(companyId), + queryFn: () => secretsApi.list(companyId), + }); + const templates = useQuery({ + queryKey: queryKeys.tools.stdioTemplates(companyId), + queryFn: () => toolsApi.listStdioTemplates(companyId), + }); + + const [applicationId, setApplicationId] = useState(""); + const [name, setName] = useState(""); + const [transport, setTransport] = useState<"remote_http" | "local_stdio">("remote_http"); + const [endpointUrl, setEndpointUrl] = useState(""); + const [templateId, setTemplateId] = useState(""); + const [creds, setCreds] = useState{example.description}
+Fixture tools
+Safe default profile
++ Allows {example.safeDefaultProfile.allowedToolNames.join(", ")} +
+- Evaluate what the policy engine would decide for an agent + tool, using authoritative server - state. This calls the same engine the gateway uses — it does not grant or change access. -
{selectorSummary(policy)}
+ {policy.description ? ( +{policy.description}
+ ) : null} +{rule.description}
) : null}Effective agent access
+Resolve active company and agent bindings into allowed tool names.
+{profile.description}
+ ) : null} +
+ {profile.entries.length} entries / {profile.bindings.length} bindings / updated{" "}
+
+ No runtime alerts are firing. Recommended thresholds are still available in the runbook. +
+ ) : ( +{alert.observed}
+{alert.firstResponderAction}
+- Stop/restart actions are disabled until the control endpoints ship (PAP-10411). Health and - lifecycle shown here reflect server state. + Health and lifecycle shown here reflect server state. Stop and restart controls apply only to local + stdio runtime slots.
- Govern which agents can use which external tools and MCP servers. Access is enforced server-side by the - tool gateway — these screens configure and observe that enforcement, they do not replace it. -
+