diff --git a/apps/web/app/auth/connect/page.tsx b/apps/web/app/auth/connect/page.tsx index 609c6e9a..37f61d3d 100644 --- a/apps/web/app/auth/connect/page.tsx +++ b/apps/web/app/auth/connect/page.tsx @@ -90,6 +90,17 @@ const PLUGIN_INFO: Record = { ], icon: "/images/plugins/cursor.svg", }, + codex: { + name: "OpenAI Codex", + description: + "Persistent memory for OpenAI Codex CLI. Remembers your coding context, patterns, and decisions across sessions.", + features: [ + "Auto-recalls relevant context before each prompt", + "Captures coding decisions and patterns automatically", + "Builds persistent user profile across projects", + ], + icon: "/images/plugins/codex.svg", + }, } function getPluginName(client: string): string { diff --git a/apps/web/app/oauth/consent/page.tsx b/apps/web/app/oauth/consent/page.tsx index d0e5e284..6e56420c 100644 --- a/apps/web/app/oauth/consent/page.tsx +++ b/apps/web/app/oauth/consent/page.tsx @@ -6,6 +6,7 @@ import { cn } from "@lib/utils" import { LogoFull } from "@ui/assets/Logo" import { Popover, PopoverContent, PopoverTrigger } from "@ui/components/popover" import { Building2, Check, ChevronDown, LoaderIcon } from "lucide-react" +import Image from "next/image" import { useSearchParams } from "next/navigation" import { Suspense, useState } from "react" @@ -19,6 +20,26 @@ const DATA_CAPABILITIES = [ "See your spaces (container tags) and create new ones", ] as const +// Mirrors mono/packages/lib/plugins.ts; kept in sync manually. +const KNOWN_OAUTH_CLIENTS: Record = { + "supermemory-claude-code": { + name: "Claude Code", + icon: "/images/plugins/claude-code.svg", + }, + "supermemory-opencode": { + name: "OpenCode", + icon: "/images/plugins/opencode.svg", + }, + "supermemory-openclaw": { + name: "OpenClaw", + icon: "/images/plugins/openclaw.svg", + }, + "supermemory-codex": { + name: "OpenAI Codex", + icon: "/images/plugins/codex.svg", + }, +} + function shortClientId(id: string): string { return id.length > 12 ? `${id.slice(0, 4)}…${id.slice(-4)}` : id } @@ -53,6 +74,9 @@ function OAuthConsentContent() { organizations?.find((o) => o.id === activeOrgId)?.name ?? null const canSwitchOrg = (organizations?.length ?? 0) > 1 const clientId = params.get("client_id") ?? "" + const knownClient = clientId ? KNOWN_OAUTH_CLIENTS[clientId] : undefined + const requesterName = knownClient?.name ?? "An application" + const requesterIcon = knownClient?.icon ?? null const scopes = (params.get("scope") ?? "").split(/\s+/).filter(Boolean) const accountAccess = accountAccessLabels(scopes) // A valid consent page is reached only via /oauth2/authorize, which appends a @@ -241,13 +265,28 @@ function OAuthConsentContent() {
-
-

- Authorize access -

-

- An application wants to connect to your Supermemory account. -

+
+ {requesterIcon ? ( +
+ {requesterName} +
+ ) : null} +
+

+ Connect {requesterName} +

+

+ {knownClient + ? `${requesterName} wants to connect to your Supermemory account.` + : "An application wants to connect to your Supermemory account."} +

+