PR-B5-B — Control Center Interaction Admin View - #33
Merged
Conversation
PR-B5-B: Control Center backend proxy + frontend admin page for
omnibioai-auth's already-merged GET /platform/interactions[/{id}]
(PR-B5-A #39). auth-service remains the sole authorization boundary
(require_permission(manage_all_orgs), unmodified, reused) -- no
Gateway involvement, no new permission, no JWT/session changes, no
schema changes, no new producer/worker changes.
Backend: routes_platform_interactions_proxy.py, mirroring
routes_audit_proxy.py/routes_sessions_proxy.py's exact thin-relay
shape -- forwards Authorization header and query params unchanged,
forwards upstream status/body unchanged, 503 on connection failure,
no authorization/RBAC/transformation/enrichment/redaction of its own.
No nginx change needed: docker/nginx/api-proxy.conf's existing generic
/platform location already covers it.
Frontend: InteractionsPage.tsx follows AuditLogsPage.tsx's governing
precedent (paginated, filtered, platform-admin-gated, free-form JSON
metadata) rather than SessionsPage.tsx's self-service/unpaginated
shape -- see this PR's own discovery report for why. Free-text filters
for service/interaction_type/status (Interaction has no fixed,
backend-enforced vocabulary for these, unlike AuditEvent.event_type),
dropdown for organization (reuses existing fetchPlatformOrgs), page-
local detail modal with the same client-side defense-in-depth metadata
masking convention audit.ts already established (ported, not
reinvented) -- never a substitute for the backend's own guarantee.
Nav/route gating reuses hasPlatformAdminAccess() exactly as Audit Logs
does -- no new permission helper.
Tests: 17 new backend proxy tests, 18 new frontend page tests, plus
navigation.test.ts/AdminApp.test.tsx coverage for the new nav item and
render case. Full suites: backend 924 passed (99.79% coverage, gate
98%), frontend 405 passed across 33 files, 0 failures either side.
Deferred (see report): self-service/org-scoped interaction history,
display-name enrichment, clickable trace/interaction IDs, a fixed
status vocabulary, URL-persisted filters.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the Control Center half of B5: a backend proxy and a platform-admin
frontend page exposing omnibioai-auth's already-merged
PR-B5-A #39
(
GET /platform/interactions[/{interaction_id}]).require_permission(manage_all_orgs),unmodified, is the only real authorization check. This proxy makes no
authorization/RBAC decision of its own.
(
routes_audit_proxy.py,routes_sessions_proxy.py): Control Center'sbackend talks directly to
auth-serviceviaIAM_URL.producer/worker changes.
-- B5-A's contract (paginated, filtered,
manage_all_orgs-gated) matchesAudit Events' shape exactly, not Sessions' self-service/unpaginated one.
See this PR's own prior discovery report for the full reasoning.
(
maskSensitiveFields, ported verbatim fromaudit.ts) -- not asubstitute for the backend's own redaction guarantee, an additional
layer on top of it, matching this codebase's existing convention for
any free-form JSON field reaching the DOM.
deferred -- same open question Sessions' own precedent defers too.
Scope
11 files.
docker/nginx/api-proxy.confnot touched -- its existinggeneric
/platformlocation (added forroutes_audit_proxy.py) alreadycovers
/platform/interactions. No other repository touched.Validation
99.79% coverage (gate 98%), 0 failures.
frontend suite: 405 passed across 33 files, 0 failures.
tsc -b: clean, 0 errors.docker compose build(
control-center,control-center-web) -- the frontend build is areal Vite production build, not just
tsc/vitest.isolated, throwaway container (never touching the live stack) on the
studio network;
/healthreturned 200, and the new route matchedcorrectly end-to-end -- confirmed via server logs that the proxy
forwarded to
http://auth-service:8001/platform/interactionsexactlyas designed. That specific live smoke test returned a 404 from
auth-service itself, not from this PR's code: the currently
running
auth-servicecontainer predates PR-B5-A's merge (lastrebuilt during the B4 deployment task, before B5-A existed) and
genuinely lacks
routes_platform_interactions.py-- confirmeddirectly. This is a pre-existing deployment-lag issue in the shared
dev environment, unrelated to and unaffected by this PR; redeploying
auth-serviceis outside this PR's scope (omnibioai-authisexplicitly not touched here).
git diff --check: clean. Scope verified exact -- no other repositorymodified.
🤖 Generated with Claude Code