diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index b25da24..a73775b 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { readFileSync } from 'node:fs'; +import { readFileSync, writeSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { loadConfig, type Config } from './config.js'; @@ -48,6 +48,20 @@ export async function runDaemon(config: Config): Promise { console.log('Tokens are stored hashed and cannot be re-printed. Create a new one from Settings (or reset the db).'); } + // Handshake pour un shell embarquant le daemon (app de bureau) : si ARBORETUM_EMIT_TOKEN_FD est + // fourni, on mint un token frais et on l'écrit en JSON sur ce descripteur (pipe stdio privé + // parent<->enfant). Additif : sans cette variable, comportement strictement inchangé. Le token ne + // transite jamais par le renderer et n'est pas affiché. + const emitFd = process.env.ARBORETUM_EMIT_TOKEN_FD; + if (emitFd) { + try { + const token = auth.createToken('desktop'); + writeSync(Number(emitFd), `${JSON.stringify({ token, url })}\n`); + } catch (err) { + app.log.warn(`token handshake failed: ${err instanceof Error ? err.message : String(err)}`); + } + } + let shuttingDown = false; const shutdown = (signal: string): void => { if (shuttingDown) return;