feat(api): tags routes

Add lib/api/routes/tags.js: list + upsert at /api/tags, and an
entity-scoped router mounted at /api/:entity_type/:entity_id/tags
for attach (idempotent), list, and detach. entity_type is bounded by
a zod enum covering space/project/task/page/ref/resource/source_doc/
conversation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
root
2026-06-01 01:46:43 +10:00
parent 74dac905d3
commit 2eb499c56f
3 changed files with 122 additions and 0 deletions

View File

@@ -15,6 +15,7 @@ import { router as sourceDocsRouter, resourcesScopedRouter as sourceDocsByResour
import { router as agentsRouter, tokensRouter as agentTokensRouter } from './routes/agents.js';
import { router as conversationsRouter } from './routes/conversations.js';
import { conversationsScopedRouter as messagesByConvRouter } from './routes/messages.js';
import { router as tagsRouter, entityScopedRouter as tagsByEntityRouter } from './routes/tags.js';
export function mountApi(app) {
const api = Router();
@@ -37,6 +38,8 @@ export function mountApi(app) {
api.use('/agent-tokens', agentTokensRouter);
api.use('/conversations', conversationsRouter);
api.use('/conversations/:conversation_id/messages', messagesByConvRouter);
api.use('/tags', tagsRouter);
api.use('/:entity_type/:entity_id/tags', tagsByEntityRouter);
api.use((_req, _res, next) => next(new NotFoundError('route not found')));