Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions autobot-backend/api/chat_folders.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

import json
import uuid
from datetime import datetime, timezone
from typing import Any, Dict, List

from fastapi import APIRouter, Depends, Request
Expand All @@ -25,6 +24,7 @@
from auth_middleware import get_current_user
from autobot_shared.error_boundaries import ErrorCategory, with_error_handling
from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp
from constants.redis_constants import REDIS_KEY

logger = get_logger(__name__)
Expand Down Expand Up @@ -143,7 +143,7 @@ async def create_folder(
"owner": username,
"pinned": False,
"archived": False,
"created_at": datetime.now(timezone.utc).isoformat(),
"created_at": utc_timestamp(),
"session_ids": [],
}
folders.append(folder)
Expand Down
4 changes: 2 additions & 2 deletions autobot-backend/api/desktop_control_lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@

import json
import os
from datetime import datetime, timezone

from autobot_shared.logging_manager import get_logger
from autobot_shared.redis_client import get_async_redis_client
from autobot_shared.time_utils import utc_timestamp

logger = get_logger(__name__)

Expand Down Expand Up @@ -113,7 +113,7 @@ async def acquire_human_control(session_id: str, owner: str) -> dict:
key = _lock_key(session_id)
record = {
"owner": owner,
"acquired_at": datetime.now(timezone.utc).isoformat(),
"acquired_at": utc_timestamp(),
}
try:
redis = await get_async_redis_client(database="main")
Expand Down
4 changes: 2 additions & 2 deletions autobot-backend/api/marketplace_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import re
import socket
import uuid
from datetime import datetime, timezone
from typing import Any
from urllib.parse import urlparse

Expand All @@ -32,6 +31,7 @@
from autobot_shared.error_boundaries import ErrorCategory, with_error_handling
from autobot_shared.logging_manager import get_logger
from autobot_shared.redis_client import get_async_redis_client
from autobot_shared.time_utils import utc_timestamp
from autobot_shared.url_safety import resolve_safe_ip_async

logger = get_logger(__name__)
Expand Down Expand Up @@ -144,7 +144,7 @@ async def add_marketplace(
url=url,
description=request.description,
is_builtin=False,
created_at=datetime.now(timezone.utc).isoformat(),
created_at=utc_timestamp(),
)
redis = await get_async_redis_client(database="main")
if redis is None:
Expand Down
5 changes: 2 additions & 3 deletions autobot-backend/chat_workflow/stop_hook.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@
a message to Redis. The actual work happens in background Celery workers.
"""

from datetime import datetime, timezone

from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp

logger = get_logger(__name__)

Expand Down Expand Up @@ -57,7 +56,7 @@ async def on_turn_complete(
from tasks.memory_tasks import extract_facts_task as _ef # type: ignore[assignment]
from tasks.memory_tasks import write_verbatim_task as _wv # type: ignore[assignment]

timestamp = datetime.now(timezone.utc).isoformat()
timestamp = utc_timestamp()

try:
# Verbatim store writes — one task per role for parallelism
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@

import pytest

from autobot_shared.time_utils import utc_timestamp

# ---------------------------------------------------------------------------
# Helpers — build lightweight stubs that match the real dataclass shapes.
# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -119,7 +121,7 @@ def _stub_shared(sys_mod):
if not hasattr(tu, "now_utc"):
tu.now_utc = lambda: datetime.now(timezone.utc)
if not hasattr(tu, "utc_timestamp"):
tu.utc_timestamp = lambda: datetime.now(timezone.utc).isoformat()
tu.utc_timestamp = lambda: utc_timestamp()

# Keep autobot_shared package-level accessible
shared = sys_mod.modules["autobot_shared"]
Expand Down
4 changes: 2 additions & 2 deletions autobot-backend/initialization/lifespan.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
import logging
from concurrent.futures import ThreadPoolExecutor
from contextlib import asynccontextmanager
from datetime import datetime, timezone

from fastapi import FastAPI

from autobot_shared.logging_manager import get_logger
from autobot_shared.ssot_constants import STARTUP_ERROR_FILE
from autobot_shared.time_utils import utc_timestamp
from autobot_shared.tracing import (
instrument_aiohttp,
instrument_redis,
Expand Down Expand Up @@ -508,7 +508,7 @@ async def initialize_critical_services(app: FastAPI):
json.dumps(
{
"error_type": error_type,
"timestamp": datetime.now(timezone.utc).isoformat(),
"timestamp": utc_timestamp(),
}
),
encoding="utf-8",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from typing import Any, List, Sequence

from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp
from knowledge.backends.async_base import AsyncBaseClient, AsyncBaseCollection
from knowledge.backends.base import Embedding, Metadata, Where, WhereDocument

Expand Down Expand Up @@ -210,9 +211,7 @@ async def get_or_create_collection(
metadata: Metadata | None = None,
embedding_function: Any | None = None,
) -> AsyncBaseCollection:
from datetime import datetime, timezone

provenance: dict = {"created_at": datetime.now(timezone.utc).isoformat()}
provenance: dict = {"created_at": utc_timestamp()}
if metadata:
provenance.update(metadata)
raw_col = await self._raw.get_or_create_collection(
Expand All @@ -236,9 +235,7 @@ async def create_collection(
metadata: Metadata | None = None,
embedding_function: Any | None = None,
) -> AsyncBaseCollection:
from datetime import datetime, timezone

provenance: dict = {"created_at": datetime.now(timezone.utc).isoformat()}
provenance: dict = {"created_at": utc_timestamp()}
if metadata:
provenance.update(metadata)
try:
Expand Down
7 changes: 3 additions & 4 deletions autobot-backend/knowledge/backends/chromadb_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from typing import Any, List, Sequence

from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp
from knowledge.backends.base import (
BaseClient,
BaseCollection,
Expand Down Expand Up @@ -191,9 +192,8 @@ def get_or_create_collection(
metadata: Metadata | None = None,
embedding_function: Any | None = None,
) -> BaseCollection:
from datetime import datetime, timezone

provenance: dict = {"created_at": datetime.now(timezone.utc).isoformat()}
provenance: dict = {"created_at": utc_timestamp()}
if metadata:
provenance.update(metadata)
kwargs: dict = {"name": name, "metadata": provenance}
Expand All @@ -214,9 +214,8 @@ def create_collection(
metadata: Metadata | None = None,
embedding_function: Any | None = None,
) -> BaseCollection:
from datetime import datetime, timezone

provenance: dict = {"created_at": datetime.now(timezone.utc).isoformat()}
provenance: dict = {"created_at": utc_timestamp()}
if metadata:
provenance.update(metadata)
kwargs: dict = {"name": name, "metadata": provenance}
Expand Down
10 changes: 5 additions & 5 deletions autobot-backend/llc/kb/handoff_brief.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
"""LLC HandoffBriefGenerator — AI→Human and Human→AI KB-powered briefs (GH#8239)."""

import json
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional

from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp
from llm_shared.types import LLMType

from .rag_assembler import AssemblerProfile, LLCRAGAssembler
Expand Down Expand Up @@ -108,7 +108,7 @@ async def generate_agent_to_human_brief(
"open_questions": brief_content.get("open_questions", []),
"next_steps": brief_content.get("next_steps", []),
"artifacts": brief_content.get("artifacts", []),
"generated_at": datetime.now(timezone.utc).isoformat(),
"generated_at": utc_timestamp(),
"generator": "handoff_brief_generator",
}

Expand Down Expand Up @@ -196,7 +196,7 @@ async def generate_human_to_agent_brief(
"company_standards": brief_content.get("company_standards", []),
"project_context": brief_content.get("project_context", []),
"suggested_approach": brief_content.get("suggested_approach", ""),
"generated_at": datetime.now(timezone.utc).isoformat(),
"generated_at": utc_timestamp(),
"generator": "handoff_brief_generator",
}

Expand Down Expand Up @@ -229,7 +229,7 @@ def _fallback_agent_to_human_brief(self) -> Dict[str, Any]:
"open_questions": [],
"next_steps": [],
"artifacts": [],
"generated_at": datetime.now(timezone.utc).isoformat(),
"generated_at": utc_timestamp(),
"generator": "fallback",
}

Expand All @@ -240,7 +240,7 @@ def _fallback_human_to_agent_brief(self, human_notes: str) -> Dict[str, Any]:
"company_standards": [],
"project_context": [],
"suggested_approach": "Proceed with default best practices. Escalate if unclear.",
"generated_at": datetime.now(timezone.utc).isoformat(),
"generated_at": utc_timestamp(),
"generator": "fallback",
}

Expand Down
4 changes: 2 additions & 2 deletions autobot-backend/llc/kb/sprint_summarizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
"""

import uuid
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional

from sqlalchemy.ext.asyncio import AsyncSession

from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp
from llm_shared.types import LLMType

from ..kb.collections import KbCollectionManager
Expand Down Expand Up @@ -268,7 +268,7 @@ async def _llm_summarize_and_index(
)
await self._direct_merge(docs, dst_collection, sprint_id, project_id)
return "[direct-merged: LLM returned empty content]"
closed_at = datetime.now(timezone.utc).isoformat()
closed_at = utc_timestamp()
sprint_name = sprint.name if sprint else str(sprint_id)

from knowledge import get_knowledge_base # lazy
Expand Down
5 changes: 3 additions & 2 deletions autobot-backend/llc/notifications/publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@

import logging
from dataclasses import dataclass, field
from datetime import datetime, timezone
from typing import Any, Dict, Optional

from autobot_shared.time_utils import utc_timestamp

logger = logging.getLogger(__name__)

try:
Expand Down Expand Up @@ -64,7 +65,7 @@ async def publish(
"entity_id": entity_id,
"payload": payload,
"actor_id": actor_id,
"ts": datetime.now(timezone.utc).isoformat(),
"ts": utc_timestamp(),
}
try:
if get_live_event_manager is not None:
Expand Down
3 changes: 2 additions & 1 deletion autobot-backend/llc/services/handoff.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from sqlalchemy.ext.asyncio import AsyncSession

from autobot_shared.redis_client import get_async_redis_client
from autobot_shared.time_utils import utc_timestamp

from ..kb.handoff_brief import HandoffBriefGenerator
from ..models.enums import ActivityEventType, WorkItemStatus
Expand Down Expand Up @@ -541,7 +542,7 @@ def _generate_brief(self, item: LLCWorkItem, agent_notes: Optional[str]) -> Dict
"comment_count": len(item.comments or []),
"recent_comments": comment_excerpts[-5:],
"agent_notes": agent_notes,
"generated_at": datetime.now(timezone.utc).isoformat(),
"generated_at": utc_timestamp(),
"generator": "stub-phase4",
}

Expand Down
6 changes: 3 additions & 3 deletions autobot-backend/services/kb_folder_watcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import asyncio
import json
import time
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Dict, List, Optional

Expand All @@ -30,6 +29,7 @@
from autobot_shared.logging_manager import get_logger
from autobot_shared.redis_client import get_async_redis_client
from autobot_shared.singleton_factory import lazy_singleton
from autobot_shared.time_utils import utc_timestamp

logger = get_logger(__name__)

Expand Down Expand Up @@ -67,7 +67,7 @@ def __init__(
self.recursive = recursive
self.category = category
self.tags = tags or []
self.created_at = datetime.now(timezone.utc).isoformat()
self.created_at = utc_timestamp()

def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary for JSON serialization."""
Expand Down Expand Up @@ -466,7 +466,7 @@ async def _process_single_change(self, folder_id: str, file_path: Path, change_t
# Update stats
if folder_id in self._stats:
self._stats[folder_id]["files_ingested"] += 1
self._stats[folder_id]["last_change"] = datetime.now(timezone.utc).isoformat()
self._stats[folder_id]["last_change"] = utc_timestamp()

logger.info("Successfully ingested file: %s into collection %s", file_path.name, config.collection)

Expand Down
3 changes: 2 additions & 1 deletion autobot-backend/services/task_workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from typing import Any, Iterator, Optional

from autobot_shared.logging_manager import get_logger
from autobot_shared.time_utils import utc_timestamp
from services.task_workspace_common import validate_task_id

logger = get_logger(__name__)
Expand Down Expand Up @@ -146,7 +147,7 @@ def allocate(
workspace_base.mkdir(parents=True, exist_ok=True)
_enforce_limit(agent_id, max_per_agent, root)

created_at = datetime.now(timezone.utc).isoformat()
created_at = utc_timestamp()
_git_add_worktree(root, workspace_dir, branch)

meta = {
Expand Down
4 changes: 3 additions & 1 deletion autobot-backend/tests/test_voice_realtime_telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

import pytest

from autobot_shared.time_utils import utc_timestamp

# ── Helpers ──────────────────────────────────────────────────────────────────


Expand All @@ -33,7 +35,7 @@ def _make_record(**kwargs):
"session_id": "test-session-1",
"user_id": "user-42",
"model": "gpt-realtime-2",
"started_at": datetime.now(timezone.utc).isoformat(),
"started_at": utc_timestamp(),
"ended_at": None,
"duration_s": 0.0,
"audio_in_s": 0.0,
Expand Down
4 changes: 2 additions & 2 deletions autobot-backend/utils/celery_reliability.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

import json
import logging
from datetime import datetime, timezone
from functools import wraps
from typing import Any, Callable, Dict

Expand All @@ -33,6 +32,7 @@
from autobot_shared.retry_mechanism import RETRYABLE_EXCEPTIONS
from autobot_shared.ssot_config import config
from autobot_shared.status_enums import TaskStatus
from autobot_shared.time_utils import utc_timestamp

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -138,7 +138,7 @@ def park_dead_letter(task_name: str, task_id: str, args_summary: str, error: str
"args_summary": args_summary,
"error": error,
"status": TaskStatus.PARKED.value,
"timestamp": datetime.now(timezone.utc).isoformat(),
"timestamp": utc_timestamp(),
}
logger.error("Celery task parked in dead-letter queue: %s (%s) — %s", task_name, task_id, error)
try:
Expand Down
Loading
Loading