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) => (
-
))}