tracker/src/tracker/api/schemas.py
markov c1fd50f28c
Some checks failed
Deploy Tracker / deploy (push) Failing after 4s
Labels on AgentConfig + auto-assign by labels
- AgentConfig.labels ARRAY(String) field
- Auto-assign matches task labels ↔ agent labels (not capabilities)
- labels in AgentConfigOut, auth.ok, config.updated
2026-02-28 00:47:09 +01:00

145 lines
3.0 KiB
Python

"""Shared Pydantic schemas — single source of truth for all API responses."""
from pydantic import BaseModel
class MemberBrief(BaseModel):
"""Compact member reference for nested objects (author, assignee, reviewer, uploader)."""
id: str
slug: str
name: str
class AttachmentOut(BaseModel):
id: str
filename: str
mime_type: str | None = None
size: int
class StepOut(BaseModel):
id: str
task_id: str
title: str
done: bool
position: int
created_at: str
class TaskOut(BaseModel):
id: str
project_id: str
parent_id: str | None = None
number: int
key: str
title: str
description: str | None = None
type: str
status: str
priority: str
labels: list[str] = []
assignee_id: str | None = None
assignee: MemberBrief | None = None
reviewer_id: str | None = None
reviewer: MemberBrief | None = None
watcher_ids: list[str] = []
depends_on: list[str] = []
position: int
time_spent: int
steps: list[StepOut] = []
subtasks: list["SubtaskBrief"] = []
parent_key: str | None = None
parent_title: str | None = None
created_at: str
updated_at: str
class SubtaskBrief(BaseModel):
id: str
key: str
title: str
status: str
assignee: MemberBrief | None = None
class MessageOut(BaseModel):
id: str
chat_id: str | None = None
task_id: str | None = None
parent_id: str | None = None
author_type: str
author_id: str | None = None
author: MemberBrief | None = None
content: str
thinking: str | None = None
tool_log: list[dict] | None = None
mentions: list[MemberBrief] = []
actor: MemberBrief | None = None
voice_url: str | None = None
attachments: list[AttachmentOut] = []
created_at: str
class AgentConfigOut(BaseModel):
capabilities: list[str] = []
labels: list[str] = []
chat_listen: str
task_listen: str
prompt: str | None = None
model: str | None = None
class MemberOut(BaseModel):
id: str
name: str
slug: str
type: str
role: str
status: str
avatar_url: str | None = None
is_active: bool = True
agent_config: AgentConfigOut | None = None
token: str | None = None
class Config:
from_attributes = True
class ProjectOut(BaseModel):
id: str
name: str
slug: str
description: str | None = None
repo_urls: list[str] = []
status: str
task_counter: int
chat_id: str | None = None
auto_assign: bool = False
class Config:
from_attributes = True
class UploadOut(BaseModel):
"""Response from file upload endpoint."""
file_id: str
filename: str
mime_type: str | None = None
size: int
storage_name: str
class OkResponse(BaseModel):
ok: bool = True
class ProjectFileOut(BaseModel):
id: str
filename: str
description: str | None = None
mime_type: str | None = None
size: int
uploaded_by: MemberBrief | None = None
created_at: str
updated_at: str