diff --git a/backend/src/api/routes/agent_conversations.py b/backend/src/api/routes/agent_conversations.py index adf60b82..e1017f00 100644 --- a/backend/src/api/routes/agent_conversations.py +++ b/backend/src/api/routes/agent_conversations.py @@ -2,7 +2,7 @@ # #region AgentChat.Api.Conversations [C:3] [TYPE Module] [SEMANTICS agent-chat,api,rest] # @defgroup AgentChat REST routes for conversation lifecycle. -from datetime import datetime +from datetime import datetime, timezone from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session @@ -170,10 +170,10 @@ async def save_conversation( id=body.conversation_id, user_id=user_id, title=body.title or "", - created_at=datetime.utcnow(), + created_at=datetime.now(timezone.utc), ) db.add(conv) - conv.updated_at = datetime.utcnow() + conv.updated_at = datetime.now(timezone.utc) if body.title: conv.title = body.title @@ -196,7 +196,7 @@ async def save_conversation( state=msg_data.get("state"), tool_calls=msg_data.get("tool_calls"), attachments=msg_data.get("attachments"), - created_at=datetime.utcnow(), + created_at=datetime.now(timezone.utc), ) db.add(msg) db.flush() diff --git a/backend/src/schemas/agent.py b/backend/src/schemas/agent.py index 8d2cdb43..1bd8723e 100644 --- a/backend/src/schemas/agent.py +++ b/backend/src/schemas/agent.py @@ -4,7 +4,14 @@ from datetime import datetime -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_serializer + + +def _serialize_datetime(v: datetime) -> str: + """Serialize datetime as ISO 8601 with Z suffix. Naive datetimes are treated as UTC.""" + if v.tzinfo is None: + return v.strftime("%Y-%m-%dT%H:%M:%S") + "Z" + return v.isoformat() # #region Schemas.Agent.ConversationItem [C:1] [TYPE Class] [SEMANTICS agent,schema,conversation] @@ -18,6 +25,8 @@ class ConversationItem(BaseModel): has_tool_calls: bool = False # conversation includes tool usage has_error: bool = False # conversation has error state risk_level: str | None = None # "safe" | "guarded" | "dangerous" + + _serialize_updated_at = field_serializer("updated_at")(_serialize_datetime) # #endregion Schemas.Agent.ConversationItem @@ -63,6 +72,8 @@ class MessageItem(BaseModel): tool_calls: list[ToolCall] | None = None attachments: list[AttachmentMeta] | None = None created_at: datetime + + _serialize_created_at = field_serializer("created_at")(_serialize_datetime) # #endregion Schemas.Agent.MessageItem diff --git a/frontend/src/lib/components/DashboardMaintenanceBadge.svelte b/frontend/src/lib/components/DashboardMaintenanceBadge.svelte index 402552c2..a8ade7f0 100644 --- a/frontend/src/lib/components/DashboardMaintenanceBadge.svelte +++ b/frontend/src/lib/components/DashboardMaintenanceBadge.svelte @@ -10,6 +10,8 @@