fase(25-26): keyboard shortcuts, mobile responsive, enterprise SSO/audit

- Phase 25.4: N shortcut for new exploration on dashboard (react-hotkeys-hook)
- Phase 25.5: overflow-x-auto on tables, responsive padding (p-4 md:p-6)
- Phase 26: SAML/OIDC/LDAP providers (build-fixed), TOTP/MFA service
- Phase 26: KyselySSOConfigRepository + KyselyTOTPRepository
- Phase 26: SSO HTTP controller (config CRUD + MFA setup/verify/disable)
- Phase 26: Audit module index.ts + SSO module index.ts
- Phase 26: Session management endpoints (findByUserId, deleteById, list/revoke)
- Phase 26: SSO and audit routes feature-gated (auth:sso, audit:logs)
- Phase 26: Frontend SSOSection (SAML/OIDC/LDAP config + TOTP setup)
- Phase 26: Frontend SessionsSection (list/revoke active sessions)
- Phase 26: Settings navigation updated with SSO & Sessions sections

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
debian
2026-03-08 13:38:25 -04:00
parent c3911bafe8
commit 08011d22d5
58 changed files with 2689 additions and 23 deletions

View File

@@ -242,6 +242,36 @@ export interface WebhookDeliveryTable {
attempted_at: number;
}
export interface SSOConfigTable {
id: string;
organization_id: string;
provider: string;
enabled: number;
config_json: string;
created_at: number;
}
export interface TOTPSecretTable {
id: string;
user_id: string;
secret: string;
verified: number;
created_at: number;
}
export interface AuditLogTable {
id: string;
user_id: string | null;
organization_id: string | null;
action: string;
resource: string;
resource_id: string | null;
ip_address: string | null;
user_agent: string | null;
details_json: string;
occurred_at: number;
}
export interface Database {
sessions: SessionTable;
states: StateTable;
@@ -263,6 +293,9 @@ export interface Database {
integrations: IntegrationTable;
webhook_endpoints: WebhookEndpointTable;
webhook_deliveries: WebhookDeliveryTable;
sso_configs: SSOConfigTable;
totp_secrets: TOTPSecretTable;
audit_logs: AuditLogTable;
}
export function createDatabase(config: { driver: string; path: string; url?: string }): Kysely<Database> {