"use client"; import Link from "next/link"; import { useApi } from "@/lib/api"; import { Bar, Panel, Skeleton, Tag } from "@/components/ui"; interface P { platform: string; learned: boolean; adapter: boolean; confidence: number; page_types: number; entity_types: number; navigation_actions: number; network_schemas: number; media_patterns: number; sessions: number; has_manifest: boolean; profiles: { alias: string; has_state: boolean }[]; } const PHASE: Record = { youtube: "Phase 1", reddit: "Phase 1", facebook: "Phase 2 · adapter", instagram: "Phase 2", tiktok: "Phase 3", x: "Phase 3", linkedin: "Phase 4", threads: "Phase 4" }; export default function Platforms() { const { data, loading } = useApi("/platforms", { refreshMs: 15_000 }); return (

Connectors

A connector is learned state, not hand-written truth: page types, response schemas, action → observation patterns and media patterns accumulated across sessions, compiled into a manifest once confidence is sufficient.

{loading ? ( ) : (
{data?.map((p) => (
{p.platform} {PHASE[p.platform]}
{p.adapter ? "adapter" : "no adapter"} {p.learned ? "learned" : "unlearned"} {p.has_manifest && compiled} {p.profiles.map((pr) => ( profile {pr.alias} ))}
connector confidence {p.confidence}%
= 70 ? "#43e69a" : p.confidence >= 40 ? "#38e1ff" : "#ffb347"} />
{[ ["page types", p.page_types], ["entity types", p.entity_types], ["navigation actions", p.navigation_actions], ["network schemas", p.network_schemas], ["media patterns", p.media_patterns], ["sessions", p.sessions], ].map(([k, v]) => (
{k as string}
{v as number}
))}
))}
)}
); }