# Agent Card

Every workspace publishes an Agent Card at `/.well-known/agent-card.json`. This is a standard A2A document that describes the workspace's identity, capabilities, and how to communicate with it.

## Example

```json
{
  "name": "Reno Stars SEO Agent",
  "description": "Bilingual EN/ZH SEO page builder for Vancouver renovation companies",
  "version": "1.2.0",
  "url": "https://seo-agent.reno-stars.com",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true
  },
  "defaultInputModes": ["text/plain", "application/json"],
  "defaultOutputModes": ["text/plain", "application/json", "text/html"],
  "skills": [
    {
      "id": "generate_seo_page",
      "name": "Generate SEO Landing Page",
      "description": "Creates a bilingual EN/ZH Next.js page targeting a renovation keyword",
      "tags": ["seo", "bilingual", "nextjs"],
      "examples": ["Generate a page targeting 'kitchen renovation Vancouver'"]
    }
  ],
  "supportedInterfaces": [
    { "protocol": "JSONRPC", "url": "https://seo-agent.reno-stars.com/a2a" }
  ]
}
```

## How the Agent Card Is Used

### By the Platform
- The platform reads the card when a workspace registers
- Stores the full card in Postgres (`workspaces.agent_card` JSONB column)
- Caches the workspace URL in Redis for fast resolution

### By the Canvas
- The canvas renders node UI **directly from the card**
- Node title comes from `name`
- Skill badges come from `skills[].name`
- Input/output port types come from `defaultInputModes` / `defaultOutputModes`

### By Peer Workspaces (Automatic Skill Injection)

When a workspace builds its system prompt, it pulls Agent Cards from all reachable peer workspaces (siblings, children, parent) and appends their skill descriptions. This way a calling workspace (e.g. Business Core) knows what it can ask the SEO agent to do without any manual wiring.

The mechanism:
1. On startup, the workspace queries the platform for peer Agent Cards via `GET /registry/:id/peers`
2. Skill descriptions from those cards are appended to the agent's system prompt
3. When a peer updates its card (`AGENT_CARD_UPDATED` event), the workspace rebuilds its system prompt automatically

This means adding a new skill to a workspace makes it immediately available to all reachable peers — no manual wiring, no restarts.

## Lifecycle

1. Workspace container starts
2. Agent Card is generated from the workspace config
3. A2A server publishes it at `/.well-known/agent-card.json`
4. Workspace sends `POST /registry/register` with the card
5. Platform stores the card in Postgres
6. Canvas reads the card and renders the node

## Live Updates

When a workspace's skills change at runtime:
1. Workspace rescans skills folder, rebuilds Agent Card
2. Workspace sends `POST /registry/update-card` with the new card
3. Platform stores the updated card, writes `AGENT_CARD_UPDATED` event
4. Platform broadcasts via WebSocket to **all subscribers** — both canvas clients and peer workspaces

Both canvas clients and workspace agents subscribe to the same platform WebSocket at `/ws`. The platform filters events server-side using `X-Workspace-ID` — each workspace only receives events about workspaces it can communicate with (via `CanCommunicate()`). Canvas clients receive all events (no workspace ID header).

When a peer workspace receives `AGENT_CARD_UPDATED`, it rebuilds its system prompt automatically. When the canvas receives it, it updates the node's skill badges.

## Related Docs

- [Core Concepts](../product/core-concepts.md) — What an Agent Card is
- [A2A Protocol](../api-protocol/a2a-protocol.md) — How the card fits into A2A
- [Workspace Runtime](./workspace-runtime.md) — How the card is generated at startup
- [Canvas UI](../frontend/canvas.md) — How the card drives node rendering
