MediaRouter / docs /brand-kits.md
basyx's picture
Upload 376 files
8bf0d31 verified
|
Raw
History Blame Contribute Delete
2.98 kB
# Brand Kit
## Status
The current working tree implements Brand Kit as a real workspace-owned domain
under `app/brand/` with `/v1/brand` REST routes, frontend brand-kit feature
modules, TypeScript/Python SDK resources, MCP brand tools, and an n8n
`MediaBrandKit` node. Authoritative PostgreSQL migrations, RLS runtime
certification, Docker/Hugging Face runtime verification, and final production
certification remain deferred until all planned product phases are complete.
## Domain model
`BrandKit` and `BrandKitVersion` are the canonical records. A kit owns versions
through `brand_kit_versions`, includes workspace/creator ownership fields, and
tracks `status`, timestamps, and an `active_version_id`. Versions store bounded
branding fields such as colors, fonts, voice/tone metadata, asset references,
watermark settings, and a `metadata` JSON column mapped safely away from the
SQLAlchemy reserved `metadata` attribute.
## API
| Method | Endpoint | Purpose |
|---|---|---|
| `GET` | `/v1/brand` | List workspace brand kits with active version metadata. |
| `POST` | `/v1/brand` | Create a workspace brand kit. |
| `PATCH` | `/v1/brand/{brand_kit_id}` | Update a workspace brand kit. |
| `DELETE` | `/v1/brand/{brand_kit_id}` | Delete a workspace brand kit. |
`POST /v1/brand` accepts `name`, optional `description`, and `initial_version`
payload data. The response surface returns the kit plus its current
`active_version_id`; it does not expose invitation tokens or secret fields.
Version-specific brand-kit routes are **not exposed** in the current backend
contract. Python and TypeScript SDKs therefore fail closed with
`NotImplementedError` for `get_version` and `create_version` instead of
inventing endpoints.
## Frontend
The frontend uses `/v1/brand` through `frontend/features/brand-kits/api/index.ts`.
Brand kits appear in workspace settings navigation with `permission: "admin"`,
and capability discovery treats the brand area as active when the backend
advertises the expected routes.
## SDK
Both official SDKs use `/v1/brand` for list/get/create/update/delete operations.
The Python client is defined in `sdk/python/media_platform/brand_kits.py`, and
the TypeScript client is defined in `sdk/typescript/src/resources/brand-kits.ts`.
Static contract tests verify route paths, request bodies, and fail-closed
versioned-operation behavior.
## MCP and n8n
MCP registers narrow typed brand tools through `app/mcp/tools/brand.py` and
`app/mcp/server.py`. The official n8n `MediaBrandKit` node consumes the shared
MediaRouter SDK/credential boundary; no provider credentials or raw brand
documents are exposed to n8n transports.
## Security and runtime
Brand kit routes reuse the existing API-key authentication, scoped workspace
context, and structured audit boundary. Sensitive fields remain backend-only.
PostgreSQL FORCE RLS, migration ordering, and provider-facing certification are
intentionally deferred to the final production certification phase.