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 3eb345ff93..fedd300cc0 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 ad96d8ae35..e4f7f01b1d 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 d76399db1d..726e03c1b9 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 e17a3716cd..c56ebf7a38 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 61466bdbd1..07df8fe505 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) => ( - ))}