[eric] analytics: group into service/analytics/ subpackage (linter folder-fix), rewire imports, trim ws_manager comment

This commit is contained in:
ciregenz
2026-06-24 18:38:10 -07:00
committed by ciregenz
parent 44ba123c22
commit edd800596e
12 changed files with 15 additions and 16 deletions
+2 -4
View File
@@ -90,12 +90,10 @@ class ConnectionManager:
if event == "agent:status" and data.get("status") in TERMINAL_STATUSES:
seq_log.persist_terminal(session_id, payload_str)
# Mirror every discrete agent message into swarm-analytics. Outside the
# stamp lock (fire-and-forget; must not gate the broadcast). Replays use
# ws.send_text directly, not this path, so reconnects don't double-count.
# Outside the stamp lock so analytics can't gate the broadcast; replays go via ws.send_text, so reconnects don't double-count.
if event == "agent:message":
try:
from backend.apps.service.analytics_agent_bridge import bridge_agent_message, BroadcastMessage
from backend.apps.service.analytics.agent_bridge import bridge_agent_message, BroadcastMessage
bridge_agent_message(session_id, BroadcastMessage.model_validate(data.get("message") or {}))
except Exception:
logger.debug("agent:message analytics bridge failed", exc_info=True)
@@ -147,7 +147,7 @@ class AgentLaunchMixin:
})
try:
from backend.apps.service.analytics import track_agent_created
from backend.apps.service.analytics.client import track_agent_created
track_agent_created(id=session.id, dashboard_id=session.dashboard_id)
except Exception:
pass
+1 -1
View File
@@ -95,7 +95,7 @@ async def generate_title(session: Optional[AgentSession], session_id: str, first
"name": title,
})
try:
from backend.apps.service.analytics import track_agent_title
from backend.apps.service.analytics.client import track_agent_title
track_agent_title(id=session_id, title=title)
except Exception:
pass
+1 -1
View File
@@ -78,7 +78,7 @@ def p_sync_identity_to_service(settings_obj) -> None:
logger.debug("identify sync failed: %s", e)
if email:
try:
from backend.apps.service.analytics import track_link_email
from backend.apps.service.analytics.client import track_link_email
track_link_email(email)
except Exception as e:
logger.debug("analytics link_email sync failed: %s", e)
+3 -3
View File
@@ -137,7 +137,7 @@ async def create_dashboard(body: DashboardCreate):
dashboard = Dashboard(name=body.name)
save(dashboard)
try:
from backend.apps.service.analytics import track_dashboard_event
from backend.apps.service.analytics.client import track_dashboard_event
track_dashboard_event(dashboard_id=dashboard.id, action="create")
except Exception:
pass
@@ -458,7 +458,7 @@ async def delete_dashboard(dashboard_id: str):
p_delete(dashboard_id)
try:
from backend.apps.service.analytics import track_dashboard_event
from backend.apps.service.analytics.client import track_dashboard_event
track_dashboard_event(dashboard_id=dashboard_id, action="delete")
except Exception:
pass
@@ -565,7 +565,7 @@ async def duplicate_dashboard(dashboard_id: str):
atomic_write_json(os.path.join(DATA_DIR, f"{new_id}.json"), new_dashboard)
try:
from backend.apps.service.analytics import track_dashboard_event
from backend.apps.service.analytics.client import track_dashboard_event
track_dashboard_event(dashboard_id=new_id, action="create")
except Exception:
pass
@@ -13,7 +13,7 @@ from pydantic import BaseModel, ConfigDict
from typeguard import typechecked
from backend.apps.agents.core.models import AgentSession
from backend.apps.service.analytics import track_agent_message
from backend.apps.service.analytics.client import track_agent_message
logger = logging.getLogger(__name__)
@@ -11,7 +11,7 @@ from typing import Optional
from pydantic import BaseModel, ConfigDict
from typeguard import typechecked
from backend.apps.service.analytics import (
from backend.apps.service.analytics.client import (
persist_client_env,
track_app_opened,
track_dashboard_event,
+3 -3
View File
@@ -191,7 +191,7 @@ async def service_lifespan():
svc.sync({"identity": id_props})
# First-boot log write doubles as the token-registration trigger.
from backend.apps.service.analytics import get_analytics_client, track_link_email
from backend.apps.service.analytics.client import get_analytics_client, track_link_email
analytics_client = get_analytics_client()
if analytics_client is not None:
try:
@@ -251,7 +251,7 @@ async def service_lifespan():
# Flush before the process exits or buffered events are lost.
try:
from backend.apps.service.analytics import track_app_closed, shutdown_analytics
from backend.apps.service.analytics.client import track_app_closed, shutdown_analytics
track_app_closed()
shutdown_analytics()
except Exception:
@@ -444,7 +444,7 @@ async def service_status():
def p_bridge_to_analytics(item: dict) -> None:
# Boundary adapter: validate the raw report() envelope into a typed event, hand it to the analytics bridge.
from backend.apps.service.analytics_frontend_bridge import bridge_frontend_event, FrontendEvent
from backend.apps.service.analytics.frontend_bridge import bridge_frontend_event, FrontendEvent
try:
bridge_frontend_event(FrontendEvent.model_validate(item))
except Exception:
+1 -1
View File
@@ -266,7 +266,7 @@ async def apply_settings_update(body: AppSettings, protect_fields: set[str] | No
if id_props:
p_identify(id_props)
if body.user_email:
from backend.apps.service.analytics import track_link_email
from backend.apps.service.analytics.client import track_link_email
track_link_email(body.user_email)
await save_settings_async(body)
+1
View File
@@ -140,6 +140,7 @@
"backend/apps/agents/manager/streaming",
"backend/apps/outputs",
"backend/apps/tools_lib",
"backend/apps/service",
"backend/tests",
"frontend/src/shared",
"frontend/src/shared/state",