Collapses the AI Connectors admin surface from a per-OAuth-client table plus five per-connector Generate tabs to a single flat Connections table listing one row per (user × connector) authorization on the server, sorted by most-recent join.
Ships as PR #33 / Feature 010. Planning doc: docs/plannings/010-per-user-connections-panel.md.
What changed
- Per-connector tabs removed (Claude / ChatGPT / Grok / Gemini / Others) — the identical "Generate credentials" panel behind each was noise post-DCR. ~150 LOC deleted.
- New Connections view — flat list of
(user × connector)rows sorted byMAX(created_at) DESC. A user with three assistants shows as three rows. - New aggregate query
AccessTokenRepository::group_by_user_and_connector_for_server()— LEFT JOINsoauth_tokenstooauth_clientsand groups in PHP with DCR-slug inference fallback viaConnectorProfileRegistry::matches_dcr_client()for legacy rows. - Per-row Revoke — user-scoped; other users of the same client_id stay untouched.
- Per-row Delete client — deletes the underlying client row unless it's shared with other users. Backend response gains a
revoked_only: trueflag; UI surfaces a notice when a client survived a delete because other users share it. - Optional
user_idparam onPOST /oauth/revoke-client-tokensandPOST /oauth/delete-client— omitting it preserves pre-F010 client-wide behavior. Backward-compatible with any external caller. - URL back-compat — legacy
?panel=claude/?panel=generate&connector=Xsilently redirect to?panel=connections. - Deleted-user fallback — rows whose
user_idno longer resolves render as(deleted user #N)instead of vanishing.
Data compat
No schema changes. No new options or meta keys. No new capabilities. Upgrade is a runtime no-op for OAuth, connector profiles, and admin/user surfaces.
Version sync
acrossai-ai-connectors.phpVersion:headerREADME.txtStable tagincludes/Main.phpACROSSAI_AI_CONNECTORS_VERSIONconstant
All three: 0.7.1 → 0.7.2.
Full Changelog: v0.7.1…v0.7.2