feat: onglets Réglages & Aide + icône Gitea

Réglages : préférences (langue, notifications push + test), gestion complète des tokens d'accès (liste/création/révocation, garde anti lock-out sur le dernier token), URL Gitea configurable, infos serveur en lecture seule (port/bind/origines/VAPID + flags CLI). Aide : documentation bilingue EN/FR de toutes les fonctionnalités, avec recherche. Icône Gitea (lien externe) dans la nav (sidebar + MoreSheet mobile).

Backend : routes /api/v1/auth/tokens (GET/POST/DELETE) + tokenId dans /me ; routes/settings.ts (GET/PATCH, allow-list stricte gitea_url, aucun secret exposé, URL validée http/https anti-XSS) ; AuthService.listTokens/revokeToken (transaction). Front : NavItem gère les liens externes, nav primaire/secondaire, store settings, vues SettingsView/HelpView.

236 tests verts (+15 nouveaux : auth-tokens, settings-routes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Johan LEROY
2026-06-18 14:16:53 +02:00
parent 0fd1d1f55c
commit 8cce1dc1e4
23 changed files with 1469 additions and 24 deletions

View File

@@ -14,10 +14,34 @@ export interface LoginResponse {
}
export interface MeResponse {
ok: true;
/** id du token de la session courante — sert à marquer « courant » dans la liste des tokens. */
tokenId: string;
tokenLabel: string;
serverVersion: string;
}
// ---- Gestion des tokens d'accès (onglet Réglages) ----
export interface TokenInfo {
id: string;
label: string;
createdAt: string;
lastUsedAt: string | null;
/** true pour le token de la session courante. */
current: boolean;
}
export interface TokensListResponse {
tokens: TokenInfo[];
}
export interface CreateTokenRequest {
label: string;
}
export interface CreateTokenResponse {
id: string;
label: string;
/** valeur en clair — affichée une seule fois, jamais re-récupérable. */
token: string;
}
export interface CreateSessionRequest {
cwd: string;
/** binaire à lancer — défaut "claude" ; "bash" sert aux tests d'acceptation sans quota */
@@ -146,3 +170,25 @@ export interface PushSubscribeRequest {
export interface PushUnsubscribeRequest {
endpoint: string;
}
// ---- Réglages & info serveur (onglet Réglages) ----
/** Config runtime non sensible du daemon — lecture seule (changée via flags CLI + redémarrage). */
export interface ServerInfo {
version: string;
port: number;
bind: string;
allowedOrigins: string[];
dataDir: string;
/** clé publique VAPID (sûre à exposer) ; null si push indisponible. */
vapidPublicKey: string | null;
vapidContact: string;
}
export interface SettingsResponse {
/** réglages modifiables à chaud (allow-list serveur — jamais les secrets). */
settings: { giteaUrl: string | null };
server: ServerInfo;
}
export interface UpdateSettingsRequest {
/** URL de l'instance Gitea (http/https) ; null ou '' pour effacer. */
giteaUrl?: string | null;
}