fix(server, desktop): plus de transcript perdu, et la mise à jour s'applique toute seule
Deux défauts vécus sur le poste, tous deux « invisibles » jusqu'à ce qu'on regarde. 1. Une console Claude ouverte depuis l'app affichait « Transcript saving is off, inherited CLAUDE_CODE_CHILD_SESSION marker ». Le daemon avait été lancé depuis une session Claude Code, il héritait donc de ses marqueurs d'exécution et les repassait à CHAQUE session qu'il lance. Le CLI se croyait sous-session et coupait la sauvegarde de son transcript : plus d'historique, plus de --resume, claudeSessionId restant null (et avec lui l'état fin busy/waiting/idle, ce qui explique les sessions sans activité détectée). L'environnement des PTY est desormais assaini de ces marqueurs, pour `claude` comme pour les shells (un `claude` tapé à la main en héritait aussi). La configuration légitime de l'utilisateur (CLAUDE_CONFIG_DIR, ANTHROPIC_*, proxies) passe intacte. Vérifié par acceptance-p17 : le daemon de test est lancé avec un environnement volontairement pollué, et le PTY n'en voit plus rien. 2. Une mise à jour installée à chaud demandait encore une manipulation. La 0.2.4 détectait le remplacement du binaire et proposait un dialogue « Restart now » : le travail restait à la charge de l'utilisateur. L'app redémarre maintenant d'elle-même quand cela ne coûte rien, c'est-à-dire le cas courant, et ne demande que s'il y a quelque chose à perdre : des sessions vivantes à interrompre (le dialogue dit combien) ou un daemon injoignable. Un « Later » reste définitif pour cette version : rien ne redémarre dans le dos de personne. La détection ne dépend plus d'un retour par le tray ou le Dock : un `stat` toutes les 30 s la couvre même fenêtre ouverte, par poll et non par `fs.watch`, qui ne voit souvent rien quand un paquet remplace un binaire ou tout un répertoire.
This commit is contained in:
@@ -29,8 +29,20 @@ const check = (name, ok, detail = '') => {
|
||||
};
|
||||
|
||||
const tmp = mkdtempSync(join(tmpdir(), 'arb-p17-'));
|
||||
// Daemon lancé avec un environnement POLLUÉ, exactement comme lorsqu'il est démarré depuis une
|
||||
// session Claude Code (cas vécu : l'app de bureau lancée par un agent). Ces marqueurs ne doivent
|
||||
// JAMAIS atteindre les sessions qu'il lance, sinon le CLI se croit sous-session et coupe la
|
||||
// sauvegarde de son transcript (plus d'historique, plus de --resume).
|
||||
const srv = spawn('node', [join(serverDir, 'dist', 'index.js'), '--port', String(PORT), '--db', join(tmp, 'a.db'), '--no-discover'], {
|
||||
env: { ...process.env, ARBORETUM_LOG: 'warn' },
|
||||
env: {
|
||||
...process.env,
|
||||
ARBORETUM_LOG: 'warn',
|
||||
CLAUDECODE: '1',
|
||||
CLAUDE_CODE_CHILD_SESSION: '1',
|
||||
CLAUDE_CODE_SESSION_ID: 'parent-session-id',
|
||||
CLAUDE_PID: '424242',
|
||||
ARB_MARQUEUR_LEGITIME: 'conserve-moi',
|
||||
},
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
});
|
||||
let srvOut = '';
|
||||
@@ -181,7 +193,22 @@ try {
|
||||
check('épilogue : le code de sortie est écrit dans le terminal', epilogue.includes('[arboretum]') && epilogue.includes('exited with code 3'), epilogue.slice(-60).replace(/[\r\n]+/g, ' '));
|
||||
check('épilogue reçu AVANT le detached', !!detached5);
|
||||
|
||||
// --- 6. Le PTY n'a pas été redimensionné par les attaches sans écran ---
|
||||
// --- 6. L'environnement du PTY est assaini des marqueurs de la session parente ---
|
||||
// Le nom du marqueur est CONCATÉNÉ dans la commande ('EN' + 'V:') pour que l'écho local du terminal
|
||||
// ne ressemble pas au résultat : sinon on relit sa propre frappe et le test passe toujours.
|
||||
c2.send({ type: 'stdin', channel: att2.channel, data: 'echo "EN""V:[$CLAUDECODE][$CLAUDE_CODE_CHILD_SESSION][$CLAUDE_CODE_SESSION_ID][$CLAUDE_PID]"\r' });
|
||||
await sleep(900);
|
||||
const envLine = /ENV:\[[^\]]*\]\[[^\]]*\]\[[^\]]*\]\[[^\]]*\]/.exec(c2.outputOf(att2.channel).replace(/\r?\n/g, ''))?.[0] ?? '';
|
||||
check('les marqueurs de session parente ne sont pas transmis au PTY', envLine === 'ENV:[][][][]', envLine || 'non observé');
|
||||
|
||||
c2.send({ type: 'stdin', channel: att2.channel, data: 'echo "GARDE:[$ARB_MARQUEUR_LEGITIME]"\r' });
|
||||
await sleep(900);
|
||||
check(
|
||||
'le reste de l’environnement est bien transmis',
|
||||
c2.outputOf(att2.channel).includes('GARDE:[conserve-moi]'),
|
||||
);
|
||||
|
||||
// --- 7. Le PTY n'a pas été redimensionné par les attaches sans écran ---
|
||||
const listed = await (await api('/api/v1/sessions')).json();
|
||||
check('session toujours vivante après tout ça', listed.sessions.some((s) => s.id === sid && s.live));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user