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:
@@ -146,11 +146,43 @@ export function resolvePlainShell(platform: NodeJS.Platform = process.platform):
|
||||
return { file: 'bash', args: ['--norc'] };
|
||||
}
|
||||
|
||||
/**
|
||||
* Marqueurs d'EXÉCUTION que le CLI claude pose dans l'environnement de ses processus enfants. Si le
|
||||
* daemon a lui-même été lancé depuis une session Claude Code (ce qui arrive : `arboretum` démarré
|
||||
* depuis un terminal Claude, ou l'app de bureau lancée par un agent), il les hérite et les
|
||||
* retransmettait à CHAQUE session qu'il lance. Conséquences observées :
|
||||
* - `CLAUDE_CODE_CHILD_SESSION=1` fait croire au CLI qu'il est une sous-session : il DÉSACTIVE la
|
||||
* sauvegarde du transcript (« Transcript saving is off »), donc plus d'historique, plus de
|
||||
* `--resume`, et `claudeSessionId` reste null (l'état fin busy/waiting/idle tombe avec lui) ;
|
||||
* - `CLAUDE_CODE_SESSION_ID` / `CLAUDE_PID` désignent la session PARENTE, pas celle qu'on lance.
|
||||
* On ne retire QUE ces marqueurs : la configuration légitime de l'utilisateur (`CLAUDE_CONFIG_DIR`,
|
||||
* `ANTHROPIC_*`, proxies...) doit passer telle quelle, sinon on casserait son installation.
|
||||
*/
|
||||
export const INHERITED_CLAUDE_MARKERS = [
|
||||
'CLAUDECODE',
|
||||
'CLAUDE_CODE_CHILD_SESSION',
|
||||
'CLAUDE_CODE_SESSION_ID',
|
||||
'CLAUDE_CODE_ENTRYPOINT',
|
||||
'CLAUDE_CODE_EXECPATH',
|
||||
'CLAUDE_PID',
|
||||
'CLAUDE_EFFORT',
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Environnement assaini pour un PTY : pur et testable. Appliqué aussi au shell (`bash`), car un
|
||||
* `claude` lancé à la main dans ce terminal hériterait des mêmes marqueurs.
|
||||
*/
|
||||
export function sanitizeInheritedEnv(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
||||
const env: NodeJS.ProcessEnv = { ...source };
|
||||
for (const key of INHERITED_CLAUDE_MARKERS) delete env[key];
|
||||
return env;
|
||||
}
|
||||
|
||||
/** Module volontairement abstrait : le plan B « BYO API key / Agent SDK » se brancherait ici. */
|
||||
export function buildSpawnSpec(opts: SpawnOptions): SpawnSpec {
|
||||
const platform = opts.platform ?? process.platform;
|
||||
const env: NodeJS.ProcessEnv = {
|
||||
...process.env,
|
||||
...sanitizeInheritedEnv(process.env),
|
||||
TERM: 'xterm-256color',
|
||||
COLORTERM: 'truecolor',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user