Skip to content

Agent profiles public shareable page at agents - #466

Open
ekwe7 wants to merge 18 commits into
Bitcoindefi:mainfrom
ekwe7:Agent-profiles-public-shareable-page-at-agents
Open

Agent profiles public shareable page at agents#466
ekwe7 wants to merge 18 commits into
Bitcoindefi:mainfrom
ekwe7:Agent-profiles-public-shareable-page-at-agents

Conversation

@ekwe7

@ekwe7 ekwe7 commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

closes #160

📝 Description

Introduces public profile URLs for agents to enable seamless sharing across external tools and social media. This PR implements a dynamic Next.js App Router route (app/agents/[id]/page.tsx), wires up data fetching from the agent API, incorporates Open Graph (OG) metadata for rich link previews, and links existing map marker popups directly to these new profile pages.

🛠️ Changes

Dynamic Route:
Created app/agents/[id]/page.tsx for rendering individual agent profiles.
Data Fetching:
Connected the profile page to GET /api/agents/[id] to dynamically fetch agent metrics (name, status badge, current task, XP/level, and district).
SEO & Social Previews:
Added dynamic <title> tags and Open Graph (OG) meta tags to ensure beautiful link card previews on platforms like X, Discord, and Slack.
Error Handling:
Implemented a robust 404 fallback utilizing Next.js notFound() when an invalid or non-existent agent ID is requested.
Map Integration:
Updated map marker popup components to turn agent names/details into clickable links pointing to their public profile.

✅ Acceptance Criteria Verified
Profile Rendering:
/agents/[id] displays the agent's name, status, and district correctly.
Metadata:
Page contains accurate title tags and OG meta properties for social previews.
Error States:
Invalid agent IDs properly trigger standard 404 pages.
Map Popups:
Map marker popups successfully link users directly to the agent's profile page.

ekwe7 and others added 18 commits June 24, 2026 18:13
- Create lib/renderer/construction.ts to manage the 4-phase animation timeline.

- Integrate district.unlocked SSE event listener into components/pixel-city.tsx.

- Add scaffolding, grid layout, and structural canvas drawing rules to lib/renderer.ts.

- Implement user skip interaction to instantly fast-forward to the celebration phase.
Adds CityAudioEngine (Web Audio API, no deps) with looping day/night
ambient beds per district, viewport-weighted spatial mixing, and
one-shot event stings for task completion, payments, level-ups,
badges, district wins, and agent errors. Ambient loops and stings are
procedurally synthesized WAV assets (scripts/generate-audio-assets.mjs)
checked into public/audio/. Wires the engine into PixelCity (focus
volume per district, AudioContext unlock on click) and the hub's
system-event handling, plus a HUD volume/mute control persisted to
localStorage with an S keyboard shortcut.
…) unlocked via XP

Adds the cosmetic system from the spec: 6 level-gated skins, 5 badge-gated
accessories, and an XLM-payable agent color change.

- lib/cosmetics.ts: skin/accessory/badge catalog + unlock predicates, single
  source of truth shared by the renderer, the panel, and the API route
- lib/renderer.ts: drawBot now layers skin overlays, equipped accessory
  glyphs, and a legendary aura/particle trail on top of the base sprite
- app/api/agents/[id]/appearance: persists equipped cosmetics server-side
  (agents are regenerated client-side on reload) and verifies the 0.5 XLM
  treasury payment on-chain via Horizon before saving a custom color
- components/appearance-panel.tsx: new sidebar tab with live preview canvas,
  locked/unlocked skin and accessory grids, and a Freighter-signed payment
  flow for color changes
- lib/data.ts, lib/types.ts: agents now carry a default AgentAppearance

Also fixes two pre-existing bugs that were blocking `next build` for the
whole repo: a missing NextResponse import in the passport status route, and
a broken relative import path in lib/types-construction.ts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…idden

The preview comment is informational only. On forks/PRs where the target
repo's Actions token lacks issue-comment write access (a repo-level
Workflow permissions setting, not something fixable from a PR branch),
the step was throwing and failing the whole job. Catch and warn instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…s, badges, district wins

Adds lib/renderer/particles.ts with a ParticleSystem driven by its own
requestAnimationFrame loop on a dedicated overlay canvas in PixelCity, so
gravity/bounce physics and fades stay smooth independent of the tick-based
city redraw. SSE events (task.completed, payment.received, agent.xp,
badge.unlocked, district.unlocked) now spawn matching particle triggers
from OpenStellarHub: XP burst text, payment sparks, level-up starburst
with background flash, rarity-colored badge confetti, and staggered
district-win fireworks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements GET /api/cron/close-stale-quests secured with CRON_SECRET.
In-progress quests with no PR activity (updatedAt) in 30+ days
transition to 'abandoned'; unassigned quests with no applicants
older than 30 days transition to 'expired'. Both emit protocol
events (quest.abandoned / quest.expired) via the system event bus.
Schedule added to vercel.json at midnight UTC daily (0 0 * * *).
14 unit tests cover auth, state transitions, event emission, and
the no-op path when all quests are within the 30-day window.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…oyments

Implements the npx open-stellar bootstrap setup wizard with readline prompts
for project name, Stellar network, database URL, and admin wallet address.
Validates Stellar G... addresses (re-prompts on failure), warns on non-postgres
DB URLs, writes .env.local with all four values, and supports --yes for CI.
Adds 15 unit tests covering validation, env generation, file writing, and
the --yes code path.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements GET /api/agents/[id]/districts/map returning all districts
with unlocked/locked status, XP progress, and unlock timestamps.
Adds static district registry (lib/districts/) as the source of truth
for labels and XP thresholds, backed by an in-memory unlock store
following the existing globalThis pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Agent profiles: public shareable page at /agents/[id]

1 participant