// Types REST partagés (préfixe /api/v1). import type { PostCreateHook, RepoSummary, SessionSummary, WorktreeSummary } from './protocol.js'; export interface ApiError { error: { code: string; message: string; details?: unknown }; } export interface LoginRequest { token: string; } export interface LoginResponse { ok: true; label: string; } export interface MeResponse { ok: true; tokenLabel: string; serverVersion: string; } export interface CreateSessionRequest { cwd: string; /** binaire à lancer — défaut "claude" ; "bash" sert aux tests d'acceptation sans quota */ command?: 'claude' | 'bash'; } export interface SessionsListResponse { sessions: SessionSummary[]; } export interface SessionResponse { session: SessionSummary; } // POST /sessions/:id/resume et /sessions/:id/fork (P2) : aucun corps — cwd et command // sont TOUJOURS dérivés du :id (lu sur disque), jamais fournis par le client (cf. spike S1). export type ResumeSessionRequest = Record; export type ForkSessionRequest = Record; // ---- Repos & worktrees (P3) ---- export interface ReposListResponse { repos: RepoSummary[]; } export interface RepoResponse { repo: RepoSummary; } export interface CreateRepoRequest { path: string; label?: string; postCreateHooks?: PostCreateHook[]; preTrust?: boolean; } export interface UpdateRepoRequest { label?: string; postCreateHooks?: PostCreateHook[]; preTrust?: boolean; } export interface WorktreesListResponse { worktrees: WorktreeSummary[]; } export interface WorktreeResponse { worktree: WorktreeSummary; } export interface HookRunResult { hookId: string; label: string; exitCode: number | null; output: string; durationMs: number; } export interface CreateWorktreeRequest { branch: string; /** true : créer la branche (`-b`) ; false : checkout d'une branche existante. */ newBranch: boolean; /** point de départ de la nouvelle branche (défaut : HEAD courant du repo). */ baseRef?: string; /** chemin cible du worktree (défaut : `/-wt-`). */ path?: string; runHooks?: boolean; preTrust?: boolean; /** lancer une session dans le worktree créé (défaut : aucune). */ startSession?: 'claude' | 'bash' | null; } export interface CreateWorktreeResponse { worktree: WorktreeSummary; hookResults: HookRunResult[]; session: SessionSummary | null; } export interface AdoptWorktreeRequest { path: string; runHooks?: boolean; preTrust?: boolean; } // ---- Navigateur de répertoires (sélecteur de dossier côté web) ---- export interface FsEntry { name: string; /** chemin absolu du dossier */ path: string; /** présent (true) uniquement en mode markRepos quand le dossier est un dépôt git */ isRepo?: boolean; } export interface FsListResponse { /** chemin absolu listé (normalisé) */ path: string; /** parent (null à la racine `/`) — pour le bouton « remonter » */ parent: string | null; /** home de l'utilisateur côté serveur — point de départ par défaut */ home: string; /** sous-dossiers uniquement, triés sans tenir compte de la casse */ entries: FsEntry[]; } // ---- Web Push (P4) ---- export interface VapidKeyResponse { /** clé publique VAPID (applicationServerKey côté navigateur). */ key: string; } export interface PushSubscribeRequest { endpoint: string; keys: { p256dh: string; auth: string }; } export interface PushUnsubscribeRequest { endpoint: string; }