Repository navigation
feat(agents): add identity registration and dashboard controls - #43723
Conversation
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
5b10f6b to
0fd4e93
Compare
60915a7 to
1cdc436
Compare
|
@greptileai @cursor review Please review 1cdc436: configuration preservation, cardless editing, and provider recovery. Local tests and screenshots pass; independent verification is pending. |
|
@greptileai Please review a168eaa: deliberate card edits now persist while identity-only edits remain cardless. Regression, live screenshots, build and lint comparison pass. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
|
bugbot run. Please review a168eaa for configuration preservation, intentional card edits, and tenant-provider recovery; local regression and live checks pass. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
|
@greptileai Please review d6c1a92: the focused registry typing change removes the LIT002 increase; canonical local gates and ownership checks pass. |
TLDR
Problem this solves:
How it solves it:
Identity history keeps retired or deleted clients owned by their original agent. The owner can reactivate its binding; another agent cannot claim it
User Flow
Before: at merge base
657bb777fa, administrators cannot configure Entra identity through the dashboardhttp://localhost:3000/agents/and click Add New AgentAfter: at
d6c1a9210b, administrators can register and edit an Entra identity without creating a runtime cardhttp://localhost:3000/agents/and click Add New AgentThe unfixed PR at
a4492b9b3calso exposed identity controls, but step 5 synthesized an A2A card. Matching edits on the same agent now leave its display name and runtime card emptyRelevant issues
Part of the approved split of #43149. The complete stack replaces #43149, #43229, #43230 and #43459; this PR covers registration and dashboard identity controls only
PRs #43720, #43721 and #43722 are merged. This PR targets
main, headlitellm_agent_split_identity_registration. Open descendants remain ordered: #43724 budgets, #43725 SCIM contracts, #43726 SCIM operations, #43727 SCIM activation, #43728 SCIM dashboard, each targeting its immediate predecessor. A trial replay of #43724 has budget/authorization conflicts, so its remote branch was left unchanged pending its own repair. Descendant verification is separateLinear ticket
Resolves LIT-8959
Pre-Submission checklist
Verification
Candidate
d6c1a9210b78cba182980edacc349e77f35db317, merge base657bb777fa557f7089c56fedb42f3056d7b55847. Only this PR's two commits were replayed; the final diff contains 28 filesLocal checks: 200 backend tests; 187 dashboard tests across 18 files; production dashboard build; full-source and test-tree Ruff, formatting, strict-rule, test-quality, basedpyright, circular/import checks, API schema generation and lazy snapshot sync. No new or worsened dashboard lint/build warnings
Changed executable-line coverage: Python 142/142 (100%); measured UI statement-start lines 90/93 (96.8%). Touched-function branches: Python 115/140 (82.1%), UI 579/788 (73.5%). These are affected-test measurements, not repository-wide coverage; existing broader branches and three UI handlers remain uncovered. The repaired preservation and recovery paths are covered
The latest follow-up replaces the identity-history lookup with its existing Prisma input type and freezes the filtered return mapping. This removes three LIT002 constructions, bringing the PR back to the merge-base count without changing budgets or adding suppressions. All canonical local lint/type gates and 200 affected backend tests passed; live registration, foreign-claim rejection, and original-owner PATCH/PUT reactivation passed
All 10 required GitHub checks pass at
d6c1a9210b, including lint. Greptile is 5/5, Veria reports no security findings, and all four review threads remain resolved. Independent Devin verification passed at this candidate, including 247 backend tests, the type-discipline gate, dashboard flows, real Entra authentication and original-owner reactivation through PATCH and both PUT formsCompleted current-tip Codecov and the uploaded CI XML both cover 142/142 changed Python lines. Local touched-function branch coverage remains 115/140; measured UI changed lines are 90/93 and touched-function branches 579/788. Repository-wide coverage at this snapshot is 81.65% and can change as unrelated uploads finish
Bugbot is unavailable because its on-demand spend limit was reached; the author plans human review. Unrelated non-required failures concern ClickHouse environment-variable documentation, tracing API schema/route allowlists, batch metadata validation, and the previously identified vendor OpenAPI tests. They are unchanged by this PR. Non-required MCP integration and benchmark checks were still running at the last snapshot
The final-candidate screenshots below were refreshed at
d6c1a9210bwith headless Chromium. Registration, identity-only edits, deliberate card edits and provider recovery all passed against the source proxyDevin independently reproduced the original defects against the unfixed PR and refreshed final-candidate execution. It verified intentional card edits, full-PUT clearing, normal A2A updates, and retired/deleted identity ownership controls. The final run reused the byte-identical dashboard build from
a168eaa98b; its backend source/process was freshly started atd6c1a9210b. Local screenshots use the final checkout. Dashboard registration with a real Entra application produced a working identity: its token received 200 on GET/v1/agents, and persisted authentication time changed from null. The same token received 403 after disabling execution through the dashboard. This verifies discovery authentication, without an LLM call or SQL-seeded registrationScreenshots / Proof of Fix
Shared setup: source proxy
http://localhost:4019, dashboard dev serverhttp://localhost:3000, disposable PostgreSQL,STORE_MODEL_IN_DB=True, and configured JWT issuer/audience. Browser execution was headless. UUIDs shown are synthetic registration inputs; no actual Entra authentication is claimed by these local screenshotsUse tenant
11111111-1111-4111-8111-111111111111, an unused client UUID and Enterprise Application Object ID. Final registration/edit captures use clientbbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbband principalcccccccc-cccc-4ccc-8ccc-cccccccccccc. Historical unfixed captures use client22222222-2222-4222-8222-222222222222and principal33333333-3333-4333-8333-333333333333; fresh fixture IDs avoid the intentional ownership-reuse rejectionBefore (657bb77)
Dashboard registration and identity edit
a4492b9b3c85cf201d39c0a01435f7b5c9c944e8; register Custom / Other with Entra and no keyAgent.Invokeand Execution to Disabled, then saveurl: "", generated skills and version; the screenshot above shows the new display nameIdentity-only PUT preservation
/v1/agentswith an A2A card,litellm_params.model,static_headersandextra_headers/v1/agents/{id}with only{"agent_name":"<same name>","enabled":false}Provider recovery
/v1/agents/identity/providerswhile selecting Microsoft Entra IDIntentional card editing
1cdc43665c130af8fe0f74e3a453c4381e20b5dc, open the same cardless agent's Settings > Edit SettingsConfigured runtimeand URL tohttps://runtime.example/a2a, then saveAfter (d6c1a92)
Dashboard registration and identity edit
Agent.Invokeand Execution to Disabled{}; see the matching User Flow screenshotIdentity-only PUT preservation
/v1/agents/{id}with only the same name andenabled:falseProvider recovery
Intentional card editing
Configured runtimeand URL tohttps://runtime.example/a2a, then saveType
New Feature and Bug Fix
Final Attestation