diff --git a/src/app/api/user/link-agent/route.ts b/src/app/api/user/link-agent/route.ts index 62a5d6fa..6a967bc9 100644 --- a/src/app/api/user/link-agent/route.ts +++ b/src/app/api/user/link-agent/route.ts @@ -1,6 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; import { verifyMessage } from "viem"; import { createServiceRoleClient } from "../../../../../lib/supabase"; +import { getAgentMetadata } from "../../../../../lib/contracts/erc8004"; +import type { Address } from "viem"; /** * POST /api/user/link-agent @@ -118,6 +120,50 @@ export async function POST(request: NextRequest) { } } + // Ensure the OWS wallet has a user row so its profile page works. + // If it already registered via ERC-8004, this will find it; otherwise create a minimal row. + const { data: owsUser } = await supabase + .from("users") + .select("id") + .or(`primary_address.eq.${normalizedOws},agent_wallet.eq.${normalizedOws}`) + .limit(1) + .single(); + + // Try to fetch ERC-8004 agent metadata for the OWS wallet (best effort) + let agentFields: Record = {}; + try { + const meta = await getAgentMetadata(normalizedOws as Address); + if (meta?.agentId) { + agentFields = { + agent_id: Number(meta.agentId), + agent_name: meta.name || null, + agent_description: meta.description || null, + agent_genre: meta.genre || null, + agent_registered_at: meta.registeredAt || new Date().toISOString(), + }; + } + } catch { /* RPC may fail — proceed without agent metadata */ } + + try { + if (owsUser) { + if (Object.keys(agentFields).length > 0) { + await supabase.from("users").update({ + agent_owner: normalizedHuman, + agent_type: "ows-writer", + ...agentFields, + }).eq("id", owsUser.id); + } + } else { + await supabase.from("users").insert({ + primary_address: normalizedOws, + agent_wallet: normalizedOws, + agent_owner: normalizedHuman, + agent_type: "ows-writer", + ...agentFields, + }); + } + } catch { /* best effort — row creation may conflict */ } + return NextResponse.json({ ok: true, linkedWallet: normalizedOws }); } catch (err) { return NextResponse.json(