From 2ac47ff4cb947af163f55ad769bcecc491fef3fa Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 3 Mar 2026 11:29:34 -0600 Subject: [PATCH] ui: add Cursor adapter option and mark non-functional adapters as Coming Soon Only Claude Code and Codex are selectable. OpenClaw, Cursor, Shell Command, and HTTP Webhook are shown as disabled with "Coming soon" across all adapter selection UIs: onboarding wizard, agent config form, and invite landing page. Co-Authored-By: Claude Opus 4.6 --- ui/src/components/AgentConfigForm.tsx | 33 +++++++++++++++---- ui/src/components/AgentProperties.tsx | 1 + ui/src/components/OnboardingWizard.tsx | 30 +++++++++++++---- ui/src/components/agent-config-primitives.tsx | 1 + ui/src/pages/InviteLanding.tsx | 11 ++++--- 5 files changed, 59 insertions(+), 17 deletions(-) diff --git a/ui/src/components/AgentConfigForm.tsx b/ui/src/components/AgentConfigForm.tsx index 3eb345ff..fedd300c 100644 --- a/ui/src/components/AgentConfigForm.tsx +++ b/ui/src/components/AgentConfigForm.tsx @@ -801,6 +801,18 @@ function AdapterEnvironmentResult({ result }: { result: AdapterEnvironmentTestRe /* ---- Internal sub-components ---- */ +const ENABLED_ADAPTER_TYPES = new Set(["claude_local", "codex_local"]); + +/** Display list includes all real adapter types plus UI-only coming-soon entries. */ +const ADAPTER_DISPLAY_LIST: { value: string; label: string; comingSoon: boolean }[] = [ + ...AGENT_ADAPTER_TYPES.map((t) => ({ + value: t, + label: adapterLabels[t] ?? t, + comingSoon: !ENABLED_ADAPTER_TYPES.has(t), + })), + { value: "cursor", label: "Cursor", comingSoon: true }, +]; + function AdapterTypeDropdown({ value, onChange, @@ -817,16 +829,25 @@ function AdapterTypeDropdown({ - {AGENT_ADAPTER_TYPES.map((t) => ( + {ADAPTER_DISPLAY_LIST.map((item) => ( ))} diff --git a/ui/src/components/AgentProperties.tsx b/ui/src/components/AgentProperties.tsx index ad96d8ae..e4f7f01b 100644 --- a/ui/src/components/AgentProperties.tsx +++ b/ui/src/components/AgentProperties.tsx @@ -18,6 +18,7 @@ const adapterLabels: Record = { claude_local: "Claude (local)", codex_local: "Codex (local)", openclaw: "OpenClaw", + cursor: "Cursor", process: "Process", http: "HTTP", }; diff --git a/ui/src/components/OnboardingWizard.tsx b/ui/src/components/OnboardingWizard.tsx index d76399db..726e03c1 100644 --- a/ui/src/components/OnboardingWizard.tsx +++ b/ui/src/components/OnboardingWizard.tsx @@ -31,6 +31,7 @@ import { Terminal, Globe, Sparkles, + MousePointer2, Check, Loader2, FolderOpen, @@ -383,34 +384,49 @@ export function OnboardingWizard() { label: "OpenClaw", icon: Bot, desc: "Notify OpenClaw webhook", + comingSoon: true, + }, + { + value: "cursor" as const, + label: "Cursor", + icon: MousePointer2, + desc: "Cursor AI agent", + comingSoon: true, }, { value: "process" as const, label: "Shell Command", icon: Terminal, desc: "Run a process", + comingSoon: true, }, { value: "http" as const, label: "HTTP Webhook", icon: Globe, desc: "Call an endpoint", + comingSoon: true, }, - ] as const).map((opt) => ( + ]).map((opt) => ( ))} diff --git a/ui/src/components/agent-config-primitives.tsx b/ui/src/components/agent-config-primitives.tsx index e17a3716..c56ebf7a 100644 --- a/ui/src/components/agent-config-primitives.tsx +++ b/ui/src/components/agent-config-primitives.tsx @@ -53,6 +53,7 @@ export const adapterLabels: Record = { claude_local: "Claude (local)", codex_local: "Codex (local)", openclaw: "OpenClaw", + cursor: "Cursor", process: "Process", http: "HTTP", }; diff --git a/ui/src/pages/InviteLanding.tsx b/ui/src/pages/InviteLanding.tsx index 61466bdb..07df8fe5 100644 --- a/ui/src/pages/InviteLanding.tsx +++ b/ui/src/pages/InviteLanding.tsx @@ -15,14 +15,17 @@ const joinAdapterOptions: AgentAdapterType[] = [ ...AGENT_ADAPTER_TYPES.filter((type): type is Exclude => type !== "openclaw"), ]; -const adapterLabels: Record = { +const adapterLabels: Record = { claude_local: "Claude (local)", codex_local: "Codex (local)", openclaw: "OpenClaw", + cursor: "Cursor", process: "Process", http: "HTTP", }; +const ENABLED_INVITE_ADAPTERS = new Set(["claude_local", "codex_local"]); + function dateTime(value: string) { return new Date(value).toLocaleString(); } @@ -42,7 +45,7 @@ export function InviteLandingPage() { const token = (params.token ?? "").trim(); const [joinType, setJoinType] = useState("human"); const [agentName, setAgentName] = useState(""); - const [adapterType, setAdapterType] = useState("openclaw"); + const [adapterType, setAdapterType] = useState("claude_local"); const [capabilities, setCapabilities] = useState(""); const [result, setResult] = useState<{ kind: "bootstrap" | "join"; payload: unknown } | null>(null); const [error, setError] = useState(null); @@ -255,8 +258,8 @@ export function InviteLandingPage() { onChange={(event) => setAdapterType(event.target.value as AgentAdapterType)} > {joinAdapterOptions.map((type) => ( - ))}