A community based topic aggregation platform built on atproto

feat: update external embed lexicon schema for nested structure

Update external embed lexicon to use proper nested structure with dedicated
external object, aligning with atproto conventions and enabling better validation.

**Schema Changes:**
1. Main object now requires "external" property (was flat structure)
2. Add dedicated "external" definition with link metadata
3. Update embedType known values:
- OLD: ["article", "image", "video-stream"]
- NEW: ["article", "image", "video", "website"]
- Removed "video-stream" (use "video" instead)
- Added "website" for generic pages

**Before (flat structure):**
```json
{
"$type": "social.coves.embed.external",
"uri": "https://example.com",
"title": "Example",
"thumb": {...}
}
```

**After (nested structure):**
```json
{
"$type": "social.coves.embed.external",
"external": {
"uri": "https://example.com",
"title": "Example",
"thumb": {...}
}
}
```

**Rationale:**
- Follows atproto pattern (app.bsky.embed.external uses same structure)
- Enables future extensibility (can add external-level metadata)
- Clearer separation between embed type and embedded content
- Better validation with required "external" property

**embedType Values:**
- "article": Blog posts, news articles (rich text content)
- "image": Image galleries, photos (visual content)
- "video": Video embeds from Streamable, YouTube, etc.
- "website": Generic web pages without specific type

This aligns our lexicon with atproto best practices and prepares for
potential federation with other atproto implementations.

Breaking change: Clients must update to use nested structure.

+13 -2
+13 -2
internal/atproto/lexicon/social/coves/embed/external.json
··· 5 5 "main": { 6 6 "type": "object", 7 7 "description": "External link embed with preview metadata and provider support", 8 + "required": ["external"], 9 + "properties": { 10 + "external": { 11 + "type": "ref", 12 + "ref": "#external" 13 + } 14 + } 15 + }, 16 + "external": { 17 + "type": "object", 18 + "description": "External link metadata", 8 19 "required": ["uri"], 9 20 "properties": { 10 21 "uri": { ··· 36 47 }, 37 48 "embedType": { 38 49 "type": "string", 39 - "knownValues": ["article", "image", "video-stream"], 40 - "description": "Type hint for special handling of known providers" 50 + "knownValues": ["article", "image", "video", "website"], 51 + "description": "Type hint for content rendering and filtering" 41 52 }, 42 53 "provider": { 43 54 "type": "string",