Copy the connection instructions into your Bot’s chat. Add the custom MCP plugin and complete its browser authorization.
{p.connection?.resourceUrl &&Copy this code into Paperclip’s authorization page. Do not paste it into Bot chat. Expires {new Date(p.pairing.expiresAt).toLocaleTimeString()}.
+{binding?.connected ? "Agent access connected." : "Watching for authorization. This connection works as the named agent."}
Grok plugins are account-wide. Linking one Bot does not isolate its credentials from other Bots on your account.
{pairingPreviewError}
} {pairDot.error &&{pairDot.error.message}
} - + } {data && <> {data.requiresSignIn ? : <> diff --git a/ui/storybook/stories/agents/grok-bot/journeys.stories.tsx b/ui/storybook/stories/agents/grok-bot/journeys.stories.tsx index b2dbbdfdba1..61a0ceb8436 100644 --- a/ui/storybook/stories/agents/grok-bot/journeys.stories.tsx +++ b/ui/storybook/stories/agents/grok-bot/journeys.stories.tsx @@ -13,8 +13,8 @@ const connection: GrokConnection = { enabled: true, resourceUrl: "https://paperc agentLifecycleState: "ready", canConfigureConnection: true, recoveryNeeded: false, binding: { id: bindingId, providerKind: "grok_bot", status: "connected", connected: true, subscriptionVerified: false, hasPendingChallenge: false, pairingExpiresAt: null, challengeExpiresAt: null, wakeVerified: false, routine: null } }; -function SetupPreview({ initialStep = 0, outboundOnly = false, rejected = false, recovering = false, saved = false }: { - initialStep?: GrokSetupStep; outboundOnly?: boolean; rejected?: boolean; recovering?: boolean; saved?: boolean; +function SetupPreview({ initialStep = 0, outboundOnly = false, rejected = false, recovering = false, saved = false, awaitingAuthorization = false }: { + initialStep?: GrokSetupStep; outboundOnly?: boolean; rejected?: boolean; recovering?: boolean; saved?: boolean; awaitingAuthorization?: boolean; }) { const [open, setOpen] = useState(true); const [step, setStep] = useState(initialStep); @@ -30,7 +30,7 @@ function SetupPreview({ initialStep = 0, outboundOnly = false, rejected = false, status: verified ? "acknowledged" as const : recovering ? "unknown" as const : rejected ? "rejected" as const : "accepted" as const, httpStatus: rejected ? 401 : recovering ? null : 200, sentAt: new Date().toISOString(), acknowledgedAt: verified ? new Date().toISOString() : null, expiresAt: new Date(Date.now() + 600000).toISOString() } : null } : null; - const state: GrokConnection = { ...connection, recoveryNeeded: recovering, binding: { ...connection.binding!, status: verified ? "ready" : "connected", routine, wakeVerified: verified } }; + const state: GrokConnection = { ...connection, agentLifecycleState: awaitingAuthorization ? "verifying" : connection.agentLifecycleState, recoveryNeeded: recovering, binding: { ...connection.binding!, connected: !awaitingAuthorization, status: awaitingAuthorization ? "pairing" : verified ? "ready" : "connected", routine, wakeVerified: verified } }; return open ?