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 3eb345f..fedd300 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 ad96d8a..e4f7f01 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 d76399d..726e03c 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 e17a371..c56ebf7 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 61466bd..07df8fe 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) => ( - ))}