Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
5a6e327
fix(frontend): keep evaluator chain connected on app-revision change
ardaerzin May 29, 2026
dd0afda
Merge branch 'main' into fe-fix/evaluator-chain-run-reliability
ardaerzin May 29, 2026
d4d1263
fix(frontend): split provider and models columns in custom providers …
ardaerzin May 29, 2026
6c7f3e3
fix(frontend): mask provider API key/secret fields and disable browse…
ardaerzin May 29, 2026
4f3186d
fix(frontend): rename settings sidebar item from Models to Providers …
ardaerzin May 29, 2026
81e10cb
fix(frontend): align settings page title and e2e helper to Providers …
ardaerzin May 29, 2026
a01d74d
Merge branch 'main' into fe-fix/providers-and-models-table-improvements
ardaerzin May 29, 2026
752d3db
Merge branch 'main' into fe-fix/evaluator-chain-run-reliability
ardaerzin May 29, 2026
1d4ae76
fix(frontend): align secrets breadcrumb label and use new-password au…
ardaerzin May 29, 2026
8bb3c72
[AGE-3790] fix(frontend): drop entity id from URL when switching proj…
ardaerzin May 29, 2026
9555c70
[AGE-3789] fix(frontend): show evaluator names not slugs in observabi…
ardaerzin May 29, 2026
7da8c77
fix(frontend): align archived evaluators page layout with active page
ardaerzin May 29, 2026
cc97d62
feat(frontend): add dark mode
ardaerzin May 30, 2026
cccd86f
feat(frontend): unify dark colors via antd cssVar tokens
ardaerzin May 30, 2026
8f70e56
fix(frontend): dark-mode polish + light-lossless reference chips
ardaerzin May 30, 2026
3e51435
chore(frontend): remove dead JSS hook + dead re-export shim
ardaerzin May 30, 2026
e7f352c
docs: add JSS-to-Tailwind migration inventory
ardaerzin May 30, 2026
89ec447
refactor(frontend): migrate Tier-1 JSS components to Tailwind
ardaerzin May 30, 2026
cfe27ff
refactor(frontend): migrate Tier-2 JSS components to Tailwind
ardaerzin May 30, 2026
53a68f0
feat(frontend): add 5 missing semantic token vars (success/warning/er…
ardaerzin May 30, 2026
81cc010
refactor(frontend): migrate var-gated Tier-2 JSS components to Tailwind
ardaerzin May 30, 2026
3c43f9e
fix(frontend): adapt deployment environment tags to dark mode
ardaerzin May 30, 2026
9a9ae7c
fix(frontend): keep antd component token overrides in dark mode
ardaerzin May 30, 2026
8453be9
fix(frontend): use a dark Shiki theme for code blocks in dark mode
ardaerzin May 30, 2026
4032baf
fix(frontend): apply the dark Shiki theme to the code node itself
ardaerzin May 30, 2026
a41aef8
fix(frontend): adapt playground variable-token chips to dark mode
ardaerzin May 31, 2026
9775521
feat(frontend): give the sidebar a darker chrome shade in dark mode
ardaerzin May 31, 2026
085d66b
fix(frontend): make sidebar menu background transparent
ardaerzin May 31, 2026
d0ea39b
feat(frontend): support dark mode on the auth page
ardaerzin May 31, 2026
39a0056
feat(frontend): default the theme to System
ardaerzin May 31, 2026
9e1ec74
fix(frontend): neutralize the get-started Skip link color
ardaerzin May 31, 2026
b197996
fix(frontend): neutral surfaces + visible progress in onboarding widg…
ardaerzin May 31, 2026
12720ca
fix(frontend): give the onboarding widget a visible edge in dark mode
ardaerzin May 31, 2026
2ec230a
fix(frontend): vertically center IVT cell skeletons
ardaerzin May 31, 2026
6485bd6
fix(frontend): legible variant/revision name display in dark mode
ardaerzin May 31, 2026
b26f809
feat(frontend): tune the dark-mode link color foundationally
ardaerzin May 31, 2026
9291159
refactor(frontend): dedupe SkeletonLine to the @agenta/ui package
ardaerzin May 31, 2026
c1d5554
docs: add dark/light mode architecture + contributor guide
ardaerzin May 31, 2026
b0ca167
fix(frontend): dark-mode fixes across evaluation run views
ardaerzin May 31, 2026
5a64775
fix(frontend): dark-mode compare-row tints + chart tooltips
ardaerzin May 31, 2026
009aea1
fix(frontend): improve LabelValuePill legibility in dark mode
ardaerzin May 31, 2026
ea24229
fix(frontend): give LabelValuePill value half a surface in dark
ardaerzin May 31, 2026
1b4a74f
fix(frontend): make dark overlays read as a distinct layer
ardaerzin May 31, 2026
dece66a
fix(frontend): unify entity revision/version chips in dark mode
ardaerzin May 31, 2026
0b41a90
fix(frontend): route arbitrary rgba() classes through theme vars (dar…
ardaerzin May 31, 2026
3b5fabf
fix(frontend): make neutral/slate Tailwind scales theme-aware (dark m…
ardaerzin May 31, 2026
e3feec0
fix(frontend): route adaptive inline-style colors through theme vars …
ardaerzin May 31, 2026
cfc2fb7
fix(frontend): remove the double-surface band in the metric popover (…
ardaerzin May 31, 2026
36b54b6
fix(frontend): restore skeletons broken by var-backed scale opacity m…
ardaerzin May 31, 2026
9fdf847
fix(frontend): invert navy-alpha codemod vars so they show on dark
ardaerzin May 31, 2026
07bd4a2
fix(frontend): legible Kind chips in dark mode
ardaerzin May 31, 2026
69a2376
fix(frontend): more legible input placeholders in dark mode
ardaerzin May 31, 2026
c0b3e85
v0.100.9
junaway May 31, 2026
afabbb5
Merge branch 'main' into release/v0.100.9
junaway May 31, 2026
40e4078
fix(frontend): improve drill-in component styling in dark mode
ardaerzin May 31, 2026
67a215f
fix(frontend): fix drill-in/drawer surface hierarchy in dark mode
ardaerzin May 31, 2026
f292562
fix(frontend): elevate drill-in fallback mapping popover in dark mode
ardaerzin May 31, 2026
97a28b2
fix(frontend): keep BeautifiedJsonView light colors unchanged
ardaerzin May 31, 2026
dc4d9c3
fix(frontend): keep evaluation runs table query key stable when navig…
ardaerzin May 31, 2026
9b917c0
fix(frontend): scope Kind chip dark fix to dark mode only
ardaerzin May 31, 2026
615c035
fix(frontend): measure IVT container height before paint to avoid hal…
ardaerzin May 31, 2026
ed6dd9b
fix(frontend): guard routeChangeError args in eval run details tab fr…
ardaerzin May 31, 2026
ed3fb5b
fix(frontend): restore muted text grays flattened to a dark surface i…
ardaerzin May 31, 2026
ecb547b
fix(frontend): cleaner column-visibility buttons in dark mode
ardaerzin May 31, 2026
ab2c026
fix(frontend): fix white-box surfaces from static zinc-50/100 in dark…
ardaerzin May 31, 2026
6bc39b9
fix(frontend): restore BeautifiedJsonView light colors (re-apply)
ardaerzin May 31, 2026
305ca23
Merge branch 'main' into fe-feat/ui-dark-mode
ardaerzin May 31, 2026
d12cadb
chore(frontend): remove evaluators playground pages; add IVT scroll d…
ardaerzin May 31, 2026
e6b7cef
fix(frontend): consistent full-screen table page header height
ardaerzin May 31, 2026
5336c71
Merge branch 'main' into fe-fix/archived-evaluators-page-layout-fix
ardaerzin May 31, 2026
c2a2453
Merge branch 'main' into fe-fix/age-3789-observability-table-shows-ev…
ardaerzin May 31, 2026
db8b5e8
Merge branch 'main' into fe-fix/age-3790-switching-projects-keeps-eva…
ardaerzin May 31, 2026
1652075
Merge branch 'main' into fe-fix/providers-and-models-table-improvements
ardaerzin May 31, 2026
635730b
Merge branch 'main' into fe-fix/evaluator-chain-run-reliability
ardaerzin May 31, 2026
23cc411
fix(frontend): foundational dark fix for default antd buttons
ardaerzin May 31, 2026
122c068
[fix] Resolve audit log placement
jp-agenta Jun 1, 2026
06fe65d
Merge branch 'release/v0.100.9' into fix/move-audit-log-to-ee
junaway Jun 1, 2026
488bcdd
Merge branch 'main' into fe-fix/age-3789-observability-table-shows-ev…
bekossy Jun 1, 2026
7af5fe9
Merge branch 'main' into fe-fix/age-3790-switching-projects-keeps-eva…
bekossy Jun 1, 2026
275512c
Merge branch 'main' into fe-fix/evaluator-chain-run-reliability
bekossy Jun 1, 2026
1d049f9
Merge branch 'main' into fe-fix/providers-and-models-table-improvements
bekossy Jun 1, 2026
7d7201e
Merge branch 'main' into release/v0.100.9
bekossy Jun 1, 2026
f544866
Merge branch 'release/v0.100.9' into fe-fix/age-3789-observability-ta…
bekossy Jun 1, 2026
299ad76
Merge branch 'release/v0.100.9' into fe-fix/age-3790-switching-projec…
bekossy Jun 1, 2026
a8886cc
Merge branch 'release/v0.100.9' into fe-fix/providers-and-models-tabl…
bekossy Jun 1, 2026
0e379e2
Merge branch 'release/v0.100.9' into fe-fix/evaluator-chain-run-relia…
bekossy Jun 1, 2026
31947b6
Merge pull request #4507 from Agenta-AI/fix/move-audit-log-to-ee
bekossy Jun 1, 2026
4ab2c85
Merge pull request #4499 from Agenta-AI/fe-fix/age-3789-observability…
bekossy Jun 1, 2026
ee7a2b1
Merge pull request #4500 from Agenta-AI/fe-fix/archived-evaluators-pa…
bekossy Jun 1, 2026
ba5cacb
Merge branch 'release/v0.100.9' into fe-fix/age-3790-switching-projec…
bekossy Jun 1, 2026
ef4ef84
Merge remote-tracking branch 'origin/main' into fe-feat/ui-dark-mode
ardaerzin Jun 1, 2026
077ef3c
fix(frontend): dark-mode fixes for run overlay + chart tooltips
ardaerzin Jun 1, 2026
5649180
feat(frontend): theme-reactive Crisp accent in dark mode
ardaerzin Jun 1, 2026
f957b52
Merge pull request #4498 from Agenta-AI/fe-fix/age-3790-switching-pro…
bekossy Jun 1, 2026
63dcb40
Merge branch 'release/v0.100.9' into fe-fix/providers-and-models-tabl…
bekossy Jun 1, 2026
f0f4edf
Merge branch 'release/v0.100.9' into fe-fix/evaluator-chain-run-relia…
bekossy Jun 1, 2026
2a58ed0
Merge pull request #4497 from Agenta-AI/fe-fix/providers-and-models-t…
mmabrouk Jun 1, 2026
2fba561
fix(frontend): address CR — restore evaluator playground page + drop …
ardaerzin Jun 1, 2026
61e4b04
fix(frontend): address CR dark-mode UI bugs
ardaerzin Jun 1, 2026
25e71fb
Merge pull request #4489 from Agenta-AI/fe-fix/evaluator-chain-run-re…
mmabrouk Jun 1, 2026
e89e045
Merge pull request #4502 from Agenta-AI/fe-feat/ui-dark-mode
mmabrouk Jun 2, 2026
f788307
fix api acceptance tests
jp-agenta Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
74 changes: 69 additions & 5 deletions api/ee/src/apis/fastapi/events/router.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,31 @@
"""Admin-only events retention router.
"""EE events routers.

Mounts at ``/admin/events/flush``. Independent from spans retention — own
Mounts user-facing audit-log querying at ``/events/query`` and admin retention
at ``/admin/events/flush``. Retention is independent from spans retention: own
lock namespace, own cron schedule, own failure mode.
"""

from fastapi import APIRouter, status
from uuid import UUID
from typing import Union

from fastapi import APIRouter, Request, status
from fastapi.responses import JSONResponse

from oss.src.utils.logging import get_module_logger
from oss.src.utils.exceptions import intercept_exceptions
from oss.src.utils.caching import acquire_lock, release_lock
from oss.src.core.events.service import EventsService

from ee.src.core.events.service import EventsService
from ee.src.apis.fastapi.events.models import EventQueryRequest, EventsQueryResponse
from ee.src.core.events.service import EventsRetentionService
from ee.src.models.shared_models import Permission
from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION
from ee.src.utils.entitlements import (
check_entitlements,
NOT_ENTITLED_RESPONSE,
Flag,
Tracker,
)


log = get_module_logger(__name__)
Expand All @@ -24,6 +38,56 @@ def __init__(
):
self.events_service = events_service

self.router = APIRouter()

self.router.add_api_route(
"/query",
self.query_events,
methods=["POST"],
operation_id="query_events_rpc",
status_code=status.HTTP_200_OK,
response_model=EventsQueryResponse,
response_model_exclude_none=True,
)

@intercept_exceptions()
async def query_events(
self,
request: Request,
*,
query_request: EventQueryRequest,
) -> Union[EventsQueryResponse, JSONResponse]:
if not await check_action_access(
user_uid=request.state.user_id,
project_id=request.state.project_id,
permission=Permission.VIEW_EVENTS,
):
raise FORBIDDEN_EXCEPTION

check, _, _ = await check_entitlements(
key=Flag.AUDIT,
)
if not check:
return NOT_ENTITLED_RESPONSE(Tracker.FLAGS)

events = await self.events_service.query(
project_id=UUID(request.state.project_id),
event=query_request.event,
windowing=query_request.windowing,
)
return EventsQueryResponse(
count=len(events),
events=events,
)


class EventsRetentionRouter:
def __init__(
self,
events_retention_service: EventsRetentionService,
):
self.events_retention_service = events_retention_service

self.admin_router = APIRouter()

self.admin_router.add_api_route(
Expand Down Expand Up @@ -59,7 +123,7 @@ async def flush(self):

try:
log.info("[flush-events] [endpoint] Retention started")
await self.events_service.flush_events()
await self.events_retention_service.flush_events()
log.info("[flush-events] [endpoint] Retention completed")

return JSONResponse(
Expand Down
10 changes: 5 additions & 5 deletions api/ee/src/apis/fastapi/spans/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@
from oss.src.utils.exceptions import intercept_exceptions
from oss.src.utils.caching import acquire_lock, release_lock

from ee.src.core.tracing.service import TracingService
from ee.src.core.tracing.service import TracingRetentionService


log = get_module_logger(__name__)


class SpansRouter:
class SpansRetentionRouter:
def __init__(
self,
tracing_service: TracingService,
tracing_retention_service: TracingRetentionService,
):
self.tracing_service = tracing_service
self.tracing_retention_service = tracing_retention_service

self.admin_router = APIRouter()

Expand Down Expand Up @@ -60,7 +60,7 @@ async def flush(self):

try:
log.info("[flush-spans] [endpoint] Retention started")
await self.tracing_service.flush_spans()
await self.tracing_retention_service.flush_spans()
log.info("[flush-spans] [endpoint] Retention completed")

return JSONResponse(
Expand Down
15 changes: 7 additions & 8 deletions api/ee/src/core/events/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
``Counter.EVENTS_INGESTED.retention``, deletes events older than the
retention cutoff for projects whose org subscribes to that plan.

Parallel to ``ee.src.core.tracing.service.TracingService`` (same shape,
different counter and DAO). Both names live in EE; the OSS counterparts
(``oss.src.core.events.service.EventsService`` and
``oss.src.core.tracing.service.TracingService``) own ingest/query.
Parallel to ``ee.src.core.tracing.service.TracingRetentionService`` (same shape,
different counter and DAO). The OSS counterpart
(``oss.src.core.events.service.EventsService``) owns ingest/query.
"""

from datetime import datetime, timezone, timedelta
Expand All @@ -16,18 +15,18 @@

from ee.src.core.entitlements.types import Tracker, Counter
from ee.src.core.entitlements.controls import get_plans
from ee.src.dbs.postgres.events.dao import EventsDAO
from ee.src.dbs.postgres.events.dao import EventsRetentionDAO


log = get_module_logger(__name__)


class EventsService:
class EventsRetentionService:
def __init__(
self,
events_dao: EventsDAO,
events_retention_dao: EventsRetentionDAO,
):
self.events_dao = events_dao
self.events_dao = events_retention_dao

async def flush_events(
self,
Expand Down
8 changes: 4 additions & 4 deletions api/ee/src/core/tracing/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@

from ee.src.core.entitlements.types import Tracker, Counter
from ee.src.core.entitlements.controls import get_plans
from ee.src.dbs.postgres.tracing.dao import TracingDAO
from ee.src.dbs.postgres.tracing.dao import TracingRetentionDAO


log = get_module_logger(__name__)


class TracingService:
class TracingRetentionService:
def __init__(
self,
tracing_dao: TracingDAO,
tracing_retention_dao: TracingRetentionDAO,
):
self.tracing_dao = tracing_dao
self.tracing_dao = tracing_retention_dao

async def flush_spans(
self,
Expand Down
9 changes: 4 additions & 5 deletions api/ee/src/dbs/postgres/events/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Walks ``projects ⋈ subscriptions`` to find projects on a given plan, then
deletes events older than a cutoff from the ``events`` table. Lives in EE
because the project-to-plan join goes through the EE ``SubscriptionDBE``
table — same reason ``ee.src.dbs.postgres.tracing.dao.TracingDAO`` is
table — same reason ``ee.src.dbs.postgres.tracing.dao.TracingRetentionDAO`` is
EE-side.

The OSS counterpart (``oss.src.dbs.postgres.events.dao.EventsDAO``) owns
Expand Down Expand Up @@ -31,12 +31,11 @@
log = get_module_logger(__name__)


class EventsDAO:
class EventsRetentionDAO:
"""EE events DAO (retention).

Same-name OSS class exists at ``oss.src.dbs.postgres.events.dao.EventsDAO``
for ingest/query — both are imported by their full path so they never
collide. Matches the EE/OSS tracing pattern.
``oss.src.dbs.postgres.events.dao.EventsDAO`` owns ingest/query; this class
owns retention only.
"""

async def fetch_projects_with_plan(
Expand Down
2 changes: 1 addition & 1 deletion api/ee/src/dbs/postgres/tracing/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
)


class TracingDAO:
class TracingRetentionDAO:
# ---------------- #
# Raw-SQL versions
# ---------------- #
Expand Down
50 changes: 33 additions & 17 deletions api/ee/src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,28 @@

from oss.src.utils.env import env
from oss.src.utils.logging import get_module_logger
from oss.src.dbs.postgres.events.dao import EventsDAO
from oss.src.core.events.service import EventsService

from ee.src.routers import (
workspace_router,
organization_router as _organization_router,
)

from ee.src.dbs.postgres.meters.dao import MetersDAO
from ee.src.dbs.postgres.tracing.dao import TracingDAO
from ee.src.dbs.postgres.tracing.dao import TracingRetentionDAO
from ee.src.dbs.postgres.subscriptions.dao import SubscriptionsDAO
from ee.src.dbs.postgres.events.dao import EventsDAO
from ee.src.dbs.postgres.events.dao import EventsRetentionDAO

from ee.src.core.meters.service import MetersService
from ee.src.core.tracing.service import TracingService
from ee.src.core.tracing.service import TracingRetentionService
from ee.src.core.subscriptions.service import SubscriptionsService
from ee.src.core.events.service import EventsService
from ee.src.core.events.service import EventsRetentionService

from ee.src.apis.fastapi.access.router import AccessRouter
from ee.src.apis.fastapi.billing.router import BillingRouter
from ee.src.apis.fastapi.spans.router import SpansRouter
from ee.src.apis.fastapi.events.router import EventsRouter
from ee.src.apis.fastapi.spans.router import SpansRetentionRouter
from ee.src.apis.fastapi.events.router import EventsRouter, EventsRetentionRouter
from ee.src.apis.fastapi.organizations.router import (
router as organization_router,
)
Expand All @@ -32,24 +34,28 @@

meters_dao = MetersDAO()

tracing_dao = TracingDAO()
tracing_retention_dao = TracingRetentionDAO()

subscriptions_dao = SubscriptionsDAO()

events_dao = EventsDAO()
events_retention_dao = EventsRetentionDAO()
query_events_dao = EventsDAO()

# CORE -------------------------------------------------------------------------

meters_service = MetersService(
meters_dao=meters_dao,
)

tracing_service = TracingService(
tracing_dao=tracing_dao,
tracing_retention_service = TracingRetentionService(
tracing_retention_dao=tracing_retention_dao,
)

events_service = EventsService(
events_dao=events_dao,
events_retention_service = EventsRetentionService(
events_retention_dao=events_retention_dao,
)
query_events_service = EventsService(
events_dao=query_events_dao,
)

subscription_service = SubscriptionsService(
Expand All @@ -73,12 +79,16 @@
meters_service=meters_service,
)

spans_router = SpansRouter(
tracing_service=tracing_service,
spans_retention_router = SpansRetentionRouter(
tracing_retention_service=tracing_retention_service,
)

events_router = EventsRouter(
events_service=events_service,
events_service=query_events_service,
)

events_retention_router = EventsRetentionRouter(
events_retention_service=events_retention_service,
)


Expand Down Expand Up @@ -108,19 +118,25 @@ def extend_main(app: FastAPI):
)

app.include_router(
router=spans_router.admin_router,
router=spans_retention_router.admin_router,
prefix="/admin/spans",
tags=["Admin"],
include_in_schema=False,
)

app.include_router(
router=events_router.admin_router,
router=events_retention_router.admin_router,
prefix="/admin/events",
tags=["Admin"],
include_in_schema=False,
)

app.include_router(
router=events_router.router,
prefix="/events",
tags=["Events"],
)

# ROUTES (more) ------------------------------------------------------------

app.include_router(
Expand Down
Loading
Loading