feat(desktop): squelette Electron (C1) : daemon enfant + auth auto
Some checks failed
CI / Build & test (Node 24) (push) Has been cancelled
CI / Pack & boot smoke (Node 22) (push) Has been cancelled
CI / No em/en dashes (push) Has been cancelled
CI / Build & test (Node 22) (push) Has been cancelled

Nouveau paquet packages/desktop (Electron, autonome, HORS des workspaces racine pour ne pas alourdir la CI du daemon). Process principal : lance le daemon en enfant (Node), lit le handshake token sur le fd 3, pose le cookie de session server-to-server (session.fetch) puis charge la SPA sur 127.0.0.1 (aucun écran de login). Fenêtre sûre (contextIsolation, sandbox, nodeIntegration off, preload minimal), instance unique, liens externes vers le navigateur, permissions limitées aux notifications, état de fenêtre persistant, arrêt propre du daemon (SIGTERM puis SIGKILL).

Vérifié ici : tsc contre l'API Electron réelle + bundle esbuild (main/preload). Le run GUI et le packaging se font sur une machine avec affichage (C2+). Racine workspaces passée en liste explicite (5 paquets) pour exclure desktop du npm ci racine.
This commit is contained in:
2026-07-17 17:51:12 +02:00
parent de066abb54
commit ae7ede6684
14 changed files with 1692 additions and 2 deletions

View File

@@ -0,0 +1,26 @@
import { app } from 'electron';
import { join } from 'node:path';
// Résolution des chemins runtime : dev (depuis le repo) vs packagé (extraResources).
// __dirname pointe sur dist/ (bundle esbuild) une fois construit.
/** Entrée du serveur daemon (son dist/index.js). */
export function resolveServerEntry(): string {
if (app.isPackaged) {
// packagé : le tarball du daemon est extrait sous resources/server/package/
return join(process.resourcesPath, 'server', 'package', 'dist', 'index.js');
}
// dev : packages/desktop/dist/main.js -> packages/server/dist/index.js
return join(__dirname, '..', '..', 'server', 'dist', 'index.js');
}
/** Binaire Node qui exécute le daemon (>= 22.16 : node:sqlite + ABI node-pty maîtrisé). */
export function resolveNodeBin(): string {
if (app.isPackaged) {
return process.platform === 'win32'
? join(process.resourcesPath, 'node', 'node.exe')
: join(process.resourcesPath, 'node', 'bin', 'node');
}
// dev : node du PATH (mêmes prebuilds node-pty que le repo).
return process.platform === 'win32' ? 'node.exe' : 'node';
}