Conversation
This comment has been minimized.
This comment has been minimized.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
It's more of a promotional content and doesn't add any value to this page once you have connected your first agent. |
I'd think it's better as a blog post (and we can cross-reference it here at some point with blog entries displayed in the hub) |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
frontend/src/screens/ai/AI.tsx (1)
396-419: Consider extracting the connect button handler for clarity.The inline handler has nested conditionals. While correct, extracting it would improve readability.
♻️ Optional: Extract handler
+ const handleConnect = React.useCallback(() => { + if (!expandedAgent) return; + + const agent = agents.find((a) => a.id === expandedAgent); + const connections = + expandedAgent === "claude" + ? claudeConnections + : expandedAgent === "goose" + ? gooseConnections + : undefined; + + const hasExistingConnection = (connections?.length ?? 0) > 0; + if (hasExistingConnection && agent?.setupUrl) { + navigate(agent.setupUrl); + } else { + handleCreateConnection(expandedAgent); + } + }, [expandedAgent, claudeConnections, gooseConnections, navigate]); <Button - onClick={() => { - if (!expandedAgent) { - return; - } - const agent = agents.find((a) => a.id === expandedAgent); - const connections = - expandedAgent === "claude" - ? claudeConnections - : expandedAgent === "goose" - ? gooseConnections - : undefined; - const hasExistingConnection = (connections?.length ?? 0) > 0; - if (hasExistingConnection && agent?.setupUrl) { - navigate(agent.setupUrl); - } else { - handleCreateConnection(expandedAgent); - } - }} + onClick={handleConnect} disabled={isLoading || !expandedAgent} >🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 396 - 419, Extract the inline onClick logic from the Button into a named handler (e.g., handleConnectClick) to improve readability: move the current anonymous function body that references expandedAgent, agents, claudeConnections, gooseConnections, navigate, and handleCreateConnection into a standalone function (preserve the early return when !expandedAgent, the agent lookup via agents.find, the connections selection logic, the hasExistingConnection check, and the navigate vs handleCreateConnection branching), then replace the Button's onClick with onClick={handleConnectClick}; keep the disabled={isLoading || !expandedAgent} prop as-is.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/src/components/connections/ClaudeConnectionInstructions.tsx`:
- Around line 25-26: In the ClaudeConnectionInstructions React component, update
every anchor element that uses target="_blank" (the link rendering to
"claude.ai" and the other two external anchors) to include rel="noopener
noreferrer" to prevent window.opener access and referrer leakage; locate the <a
... target="_blank"> elements in ClaudeConnectionInstructions.tsx and add
rel="noopener noreferrer" to each.
In `@frontend/src/components/connections/GooseConnectionInstructions.tsx`:
- Around line 24-26: The Button is wrapped inside an <a>, creating nested
interactive elements; update GooseConnectionInstructions to use the Button's
asChild prop instead: render the Button with asChild and move the anchor element
as the Button's child (keeping the href from gooseDesktopLink) so the resulting
DOM is a single interactive element; locate the Button usage in the
GooseConnectionInstructions component and replace the
<a><Button>...</Button></a> pattern with the asChild pattern using the same href
and label.
In `@frontend/src/screens/apps/Connections.tsx`:
- Line 23: The call setSearchParams({}, { replace: true }) wipes all query
params; instead read the current searchParams (from useSearchParams), create a
new URLSearchParams from it, remove or update only the 'tab' param as required
(e.g. newParams.delete('tab') or newParams.set('tab', value)), then call
setSearchParams(Object.fromEntries(newParams.entries()), { replace: true }) so
non-'tab' params like 'category' are preserved; reference setSearchParams and
the searchParams returned by useSearchParams to locate the change.
---
Nitpick comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 396-419: Extract the inline onClick logic from the Button into a
named handler (e.g., handleConnectClick) to improve readability: move the
current anonymous function body that references expandedAgent, agents,
claudeConnections, gooseConnections, navigate, and handleCreateConnection into a
standalone function (preserve the early return when !expandedAgent, the agent
lookup via agents.find, the connections selection logic, the
hasExistingConnection check, and the navigate vs handleCreateConnection
branching), then replace the Button's onClick with onClick={handleConnectClick};
keep the disabled={isLoading || !expandedAgent} prop as-is.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 4ca9af4a-d522-4e4a-a76c-b6001cc05b6b
⛔ Files ignored due to path filters (6)
frontend/src/assets/suggested-apps/cline.pngis excluded by!**/*.pngfrontend/src/assets/suggested-apps/codex.pngis excluded by!**/*.pngfrontend/src/assets/suggested-apps/cursor.pngis excluded by!**/*.pngfrontend/src/assets/suggested-apps/openclaw.pngis excluded by!**/*.pngfrontend/src/assets/suggested-apps/opencode.pngis excluded by!**/*.pngfrontend/yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (13)
frontend/package.jsonfrontend/src/components/AppSidebar.tsxfrontend/src/components/connections/ClaudeConnectionInstructions.tsxfrontend/src/components/connections/GooseConnectionInstructions.tsxfrontend/src/components/connections/SuggestedApps.tsxfrontend/src/components/ui/tabs.tsxfrontend/src/constants.tsfrontend/src/index.cssfrontend/src/routes.tsxfrontend/src/screens/ai/AI.tsxfrontend/src/screens/apps/Connections.tsxfrontend/src/screens/internal-apps/Claude.tsxfrontend/src/screens/internal-apps/Goose.tsx
There was a problem hiding this comment.
🧹 Nitpick comments (1)
frontend/src/screens/ai/AI.tsx (1)
697-707: Consider defensive check for empty prompts array.Line 702 performs
(i + 1) % prompts.length. While all current categories have prompts, an empty array would cause a divide-by-zero resulting inNaN. A guard could prevent future issues if the data structure changes.🛡️ Optional defensive fix
React.useEffect(() => { if (isTyping) { return; } + if (prompts.length === 0) { + return; + } const pause = setTimeout(() => { setIndex((i) => (i + 1) % prompts.length); setCharCount(0); setIsTyping(true); }, 3000); return () => clearTimeout(pause); }, [isTyping, prompts]);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 697 - 707, The useEffect that advances the prompt (the effect watching isTyping and prompts) can produce NaN when prompts is empty due to `(i + 1) % prompts.length`; add a defensive guard so the timeout only schedules when prompts.length > 0 (or compute nextIndex safely by checking prompts.length and defaulting to 0). Update the effect around setIndex/setCharCount/setIsTyping (the same block using setIndex((i) => (i + 1) % prompts.length)) to skip or set a safe index when prompts is empty to avoid divide-by-zero.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 697-707: The useEffect that advances the prompt (the effect
watching isTyping and prompts) can produce NaN when prompts is empty due to `(i
+ 1) % prompts.length`; add a defensive guard so the timeout only schedules when
prompts.length > 0 (or compute nextIndex safely by checking prompts.length and
defaulting to 0). Update the effect around setIndex/setCharCount/setIsTyping
(the same block using setIndex((i) => (i + 1) % prompts.length)) to skip or set
a safe index when prompts is empty to avoid divide-by-zero.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 7858d5e9-56dd-4049-b0dd-282ff9747028
📒 Files selected for processing (4)
frontend/src/components/connections/ClaudeConnectionInstructions.tsxfrontend/src/components/connections/GooseConnectionInstructions.tsxfrontend/src/screens/ai/AI.tsxfrontend/src/screens/apps/Connections.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
- frontend/src/components/connections/ClaudeConnectionInstructions.tsx
- frontend/src/components/connections/GooseConnectionInstructions.tsx
- frontend/src/screens/apps/Connections.tsx
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
frontend/src/screens/ai/AI.tsx (2)
685-725: Add a defensive guard for empty prompt lists.
currentPrompt.lengthat Line 704 assumesprompts[index]is always defined. Today it is, but a future empty category would crash this component.Defensive tweak
function RotatingPrompt({ prompts }: { prompts: string[] }) { + const safePrompts = prompts.length > 0 ? prompts : [""]; const [index, setIndex] = React.useState(0); const [charCount, setCharCount] = React.useState(0); const [isTyping, setIsTyping] = React.useState(true); - const currentPrompt = prompts[index]; + const currentPrompt = safePrompts[index] ?? ""; @@ - setIndex((i) => (i + 1) % prompts.length); + setIndex((i) => (i + 1) % safePrompts.length);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 685 - 725, RotatingPrompt assumes prompts[index] exists; add a defensive guard for empty prompts by treating currentPrompt as an empty string (e.g., const currentPrompt = prompts[index] ?? '') and early-exiting effects when prompts.length === 0 so you never read currentPrompt.length or use prompts.length in a modulus when the array is empty; update the typing effect (which checks currentPrompt.length) and the rotate effect (which uses prompts.length) to first return if prompts.length === 0, and ensure state (charCount/isTyping/index) is reset appropriately when prompts becomes empty.
138-140: Stop polling once the agent is connected.Line 138 enables polling for as long as
createdAppIdexists, so requests continue every 3s even afterlastUsedAtis set. This is unnecessary churn.Proposed refactor
export function AI() { const [isLoading, setLoading] = React.useState(false); + const [isPollingConnection, setIsPollingConnection] = React.useState(false); const [connectionSecret, setConnectionSecret] = React.useState(""); const [createdAppId, setCreatedAppId] = React.useState<number>(); @@ - const { data: createdApp } = useApp(createdAppId, !!createdAppId); + const { data: createdApp } = useApp(createdAppId, isPollingConnection); const isConnected = !!createdApp?.lastUsedAt; + + React.useEffect(() => { + if (createdApp?.lastUsedAt) { + setIsPollingConnection(false); + } + }, [createdApp?.lastUsedAt]); @@ setConnectionSecret(createAppResponse.pairingUri); setCreatedAppId(createAppResponse.id); + setIsPollingConnection(true); setExpandedAgent(agentId); @@ onValueChange={(value) => { setConnectionSecret(""); setCreatedAppId(undefined); + setIsPollingConnection(false); setExpandedAgent(value); }}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 138 - 140, The hook is currently polled as long as createdAppId exists, so change the enabled flag to stop polling once the agent connects: update the useApp call to pass a boolean that is true only while createdAppId exists AND createdApp?.lastUsedAt is falsy (e.g. useApp(createdAppId, !!createdAppId && !createdApp?.lastUsedAt)), referencing useApp and createdApp?.lastUsedAt so polling halts when the agent becomes connected.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 146-177: The handleCreateConnection function sets loading true but
calls setLoading(false) after the try/catch block, which can be skipped if an
exception is thrown in the catch; move the setLoading(false) into a finally
block so it's always executed. Update the handleCreateConnection implementation
to use try { ... } catch (error) { handleRequestError(...); } finally {
setLoading(false); } to guarantee cleanup of loading state for the createApp
flow and related state updates.
---
Nitpick comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 685-725: RotatingPrompt assumes prompts[index] exists; add a
defensive guard for empty prompts by treating currentPrompt as an empty string
(e.g., const currentPrompt = prompts[index] ?? '') and early-exiting effects
when prompts.length === 0 so you never read currentPrompt.length or use
prompts.length in a modulus when the array is empty; update the typing effect
(which checks currentPrompt.length) and the rotate effect (which uses
prompts.length) to first return if prompts.length === 0, and ensure state
(charCount/isTyping/index) is reset appropriately when prompts becomes empty.
- Around line 138-140: The hook is currently polled as long as createdAppId
exists, so change the enabled flag to stop polling once the agent connects:
update the useApp call to pass a boolean that is true only while createdAppId
exists AND createdApp?.lastUsedAt is falsy (e.g. useApp(createdAppId,
!!createdAppId && !createdApp?.lastUsedAt)), referencing useApp and
createdApp?.lastUsedAt so polling halts when the agent becomes connected.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 4e519a06-5ab1-4f0d-9a90-5e1c300cf15a
📒 Files selected for processing (1)
frontend/src/screens/ai/AI.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
frontend/src/screens/ai/AI.tsx (1)
146-177:⚠️ Potential issue | 🟡 MinorAlways clear loading state in
finally.If
handleRequestError(...)throws, Line 176 is skipped and the connect UI stays stuck in the loading state. Move the cleanup into afinallyblock.Possible fix
try { @@ } catch (error) { handleRequestError("Failed to create connection", error); + } finally { + setLoading(false); } - setLoading(false); };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 146 - 177, The loading flag in handleCreateConnection can remain true if handleRequestError throws because setLoading(false) is outside the try/catch; wrap the async logic in a try/catch/finally and move setLoading(false) into the finally block so it always runs (leave the existing try body that calls createApp and sets setConnectionSecret/setCreatedAppId/setExpandedAgent/toast, keep the catch calling handleRequestError, and ensure finally always calls setLoading(false)).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 146-171: Prevent multiple concurrent app creations by locking the
agent selector and disabling the Connect button while an in-flight createApp
exists and until the current secret is cleared or a reconnect is explicitly
selected. In handleCreateConnection check and return early if a creation is
already in progress or if connectionSecret/createdAppId is present; set a
"selectorLocked" (or reuse loading) state before calling createApp and keep it
true until you either clear connectionSecret/createdAppId or the user triggers a
reconnect action; update UI logic that renders the agent select and Connect
button (the places referenced around lines 339-345 and 384-395) to respect this
lock so the user cannot change agent or re-click Connect while createApp is
pending or a secret exists.
- Around line 188-194: Replace the nested Link + Button usage with the dedicated
LinkButton component to avoid nesting interactive elements: use LinkButton
(instead of Link wrapping Button) and pass the
to="/apps?tab=app-store&category=ai" and child content (including the
LayoutGridIcon and "Explore App Store" text); also add an import for LinkButton
from src/components/ui/custom/link-button. Update the JSX where Button and Link
are currently used (referencing Button, Link, LayoutGridIcon in AI.tsx) to the
new LinkButton usage.
---
Duplicate comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 146-177: The loading flag in handleCreateConnection can remain
true if handleRequestError throws because setLoading(false) is outside the
try/catch; wrap the async logic in a try/catch/finally and move
setLoading(false) into the finally block so it always runs (leave the existing
try body that calls createApp and sets
setConnectionSecret/setCreatedAppId/setExpandedAgent/toast, keep the catch
calling handleRequestError, and ensure finally always calls setLoading(false)).
🪄 Autofix (Beta)
✅ Autofix completed
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 09e637ee-6666-4da0-92a9-9d503d40a883
📒 Files selected for processing (1)
frontend/src/screens/ai/AI.tsx
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
♻️ Duplicate comments (2)
frontend/src/screens/ai/AI.tsx (2)
345-353:⚠️ Potential issue | 🟠 MajorAdd an explicit “new/reconnect” action — current state can dead-end after first connection.
Once
connectionSecret/createdAppIdis set, controls are disabled and there’s no UI action to clear that state. Users can get stuck without a reconnect path.Proposed fix
export function AI() { @@ const [selectorLocked, setSelectorLocked] = React.useState(false); @@ + const resetConnectionState = React.useCallback(() => { + setConnectionSecret(""); + setCreatedAppId(undefined); + setSelectorLocked(false); + }, []); + @@ <Select value={expandedAgent ?? undefined} onValueChange={(value) => { - setConnectionSecret(""); - setCreatedAppId(undefined); - setSelectorLocked(false); + resetConnectionState(); setExpandedAgent(value); }} @@ </div> + + {(connectionSecret || createdAppId) && ( + <Button variant="ghost" size="sm" onClick={resetConnectionState}> + Create another connection + </Button> + )}Also applies to: 392-400, 407-437
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 345 - 353, The Select and related UI become permanently disabled once connectionSecret or createdAppId is set, so add an explicit “New/Reconnect” action that clears the connected state and re-enables the selector: implement a visible button or menu item (adjacent to the Select or in the same control area where disabled is computed) that calls the same state resets used elsewhere (setConnectionSecret(""), setCreatedAppId(undefined), setSelectorLocked(false), and optionally setExpandedAgent(undefined) or a sensible default) and ensure it is rendered even when selectorLocked/isLoading/connectionSecret/createdAppId would otherwise disable controls; apply the same pattern to the other similar disabled blocks that reference selectorLocked/connectionSecret/createdAppId so users can always start a new connection.
148-185:⚠️ Potential issue | 🟡 MinorMove loading cleanup to
finallyto avoid stuck loading state.If the catch-path throws (directly or indirectly),
setLoading(false)can be skipped. Put it infinallyfor guaranteed cleanup.Proposed fix
const handleCreateConnection = async (agentId: string) => { @@ setLoading(true); setSelectorLocked(true); try { @@ toast(`${agentName} connection created`); } catch (error) { handleRequestError("Failed to create connection", error); setSelectorLocked(false); + } finally { + setLoading(false); } - setLoading(false); };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/screens/ai/AI.tsx` around lines 148 - 185, The cleanup call setLoading(false) should be moved into a finally block inside handleCreateConnection so it always runs even if the catch path re-throws; keep the try/catch logic (including setSelectorLocked(true) and the catch calling setSelectorLocked(false)) as-is but add a finally that calls setLoading(false) (referencing handleCreateConnection and setLoading) to guarantee the loading state is cleared on every code path.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In `@frontend/src/screens/ai/AI.tsx`:
- Around line 345-353: The Select and related UI become permanently disabled
once connectionSecret or createdAppId is set, so add an explicit “New/Reconnect”
action that clears the connected state and re-enables the selector: implement a
visible button or menu item (adjacent to the Select or in the same control area
where disabled is computed) that calls the same state resets used elsewhere
(setConnectionSecret(""), setCreatedAppId(undefined), setSelectorLocked(false),
and optionally setExpandedAgent(undefined) or a sensible default) and ensure it
is rendered even when selectorLocked/isLoading/connectionSecret/createdAppId
would otherwise disable controls; apply the same pattern to the other similar
disabled blocks that reference selectorLocked/connectionSecret/createdAppId so
users can always start a new connection.
- Around line 148-185: The cleanup call setLoading(false) should be moved into a
finally block inside handleCreateConnection so it always runs even if the catch
path re-throws; keep the try/catch logic (including setSelectorLocked(true) and
the catch calling setSelectorLocked(false)) as-is but add a finally that calls
setLoading(false) (referencing handleCreateConnection and setLoading) to
guarantee the loading state is cleared on every code path.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: e3b7baf6-b06d-416f-8c3b-cd7451c0ce56
📒 Files selected for processing (1)
frontend/src/screens/ai/AI.tsx
|
Claude instructions fix is here #2216 |
Fixed 1 file(s) based on 2 unresolved review comments. Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Replace connection secret embedding with @getalby/cli auth command for CLI-based agents. The auth flow generates keys locally so the secret never leaves the device or gets sent to the AI model. - Generic agents skip connection creation, show auth prompt immediately - Claude Code and Goose CLI tabs use auth instead of secret/MCP config - Claude Web/Desktop and Goose Desktop still use MCP URLs as before - "Waiting for agent to connect" only shown for MCP-based agents Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use @getalby/cli auth for all CLI agents instead of embedding connection secrets in prompts — keys stay local, never sent to AI - Split Claude dropdown into "Claude Code" (auth prompt) and "Claude Web/Desktop" (MCP setup via /apps/new) - Goose uses generic auth prompt (no dedicated setup page needed) - Remove Goose internal-app page/route (no longer linked) - Remove standalone ClaudeConnectionInstructions and GooseConnectionInstructions components (inlined into consumers) - Add agent logo map in AppAvatar for connections without full app store entries (goose, openclaw, cursor, codex, cline, opencode) - Remove Goose from app store (prevents 404 on internal redirect) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: update Claude connector setup wording Align Claude Web/Desktop steps with current Connectors labels and MCP URL wording. Made-with: Cursor Co-authored-by: René Aaron <rene@twentyuno.net> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add generic McpSetup component for inline MCP URL connection creation (reusable for future agents with MCP support) - Claude entry gets mcpInstructions for Web/Desktop connector setup - Remove /internal-apps/claude page and route - Remove Claude from app store, add to agentLogos map - Support subfolder installs in auth prompt hub URL Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add service names to prompts (bitrefill.com, ppq.ai, unhuman.store) - Add "Creative" category with image generation + print-on-demand - Replace weak automation example with spending analysis - Rename heading to "What can your agent do?" Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Make inspiration prompts clickable to copy (matching connect card), use ChevronRightIcon consistently, and add discovery prompt to Services. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace untestable "bitcoin price data" prompt with a working discover→fetch example using Pull That Up Jamie podcast search. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
WebFetch summarizes SKILL.md content, losing critical details. Switch to `npx -y skills add getAlby/bitcoin-payments-skill` which downloads the full skill file via GitHub without summarization. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts: # frontend/package.json
# Conflicts: # frontend/src/components/connections/SuggestedApps.tsx
Resolve conflicts: - package.json: drop individual @radix-ui/* deps (master uses consolidated radix-ui) - tabs.tsx: adopt master's shadcn v4 tabs with built-in line variant support - yarn.lock: reset from master - AI.tsx: move variant="line" from Tabs to TabsList per new API Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The repo was renamed from getAlby/bitcoin-payments-skill to getAlby/payments-skill. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
After approving a new app connection, redirect to /apps/:id instead of the apps list so the user sees the app they just created. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When app_store_app_id metadata is not set, fall back to matching the app name against the agent logos map so agent apps created via auth show proper icons without needing app store entries. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
/ai) that consolidates all AI agent onboarding into a single hubTest plan
/aiand verify hero section renders with dismiss functionality/internal-apps/claudeand/internal-apps/gooseroutes are removed🤖 Generated with Claude Code