fix(sessions): reprendre/forker une session managée morte par UUID (résout le 404)
Le bouton « Reprendre » envoie l'UUID Arboretum, mais resume/fork ne résolvaient l'id que via la découverte (indexée par claudeSessionId, qui exclut justement les sessions managées) → 404 systématique après fermeture. Ajoute PtyManager.resumeTargetById (cwd d'origine + claudeSessionId + groupe lus en DB par UUID) et un résolveur unifié dans resume ET fork : session managée morte par UUID, sinon session claude externe découverte par claudeSessionId. Garde-fous anti-resume d'une session vivante conservés.
This commit is contained in:
@@ -187,6 +187,34 @@ describe('PtyManager (pty mocké)', () => {
|
||||
expect(listed).toMatchObject({ live: false, resumable: true, claudeSessionId: 'sid-known' });
|
||||
});
|
||||
|
||||
it('resumeTargetById : session claude morte → cwd + claudeSessionId + groupe ; null sinon', () => {
|
||||
const d1 = mkdtempSync(join(tmpdir(), 'arb-rt-'));
|
||||
try {
|
||||
const summary = manager.spawn({ cwd, command: 'claude', addDirs: [d1], groupId: 'grpR' });
|
||||
db.prepare('UPDATE sessions SET claude_session_id = ? WHERE id = ?').run('cs-resume', summary.id);
|
||||
// vivante → null (resume direct interdit ; fork passe par le même chemin)
|
||||
expect(manager.resumeTargetById(summary.id)).toBeNull();
|
||||
lastPty().emitExit(0);
|
||||
// morte avec claudeSessionId connu → cible complète
|
||||
expect(manager.resumeTargetById(summary.id)).toEqual({
|
||||
cwd,
|
||||
claudeSessionId: 'cs-resume',
|
||||
addedDirs: [d1],
|
||||
groupId: 'grpR',
|
||||
});
|
||||
// id inconnu → null
|
||||
expect(manager.resumeTargetById('nope')).toBeNull();
|
||||
} finally {
|
||||
rmSync(d1, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
it('resumeTargetById : session bash morte (sans claudeSessionId) → null', () => {
|
||||
const { summary, pty } = spawnBash();
|
||||
pty.emitExit(0);
|
||||
expect(manager.resumeTargetById(summary.id)).toBeNull();
|
||||
});
|
||||
|
||||
it('capture le claudeSessionId via le registre (poll par pid) → findLiveByClaudeSessionId', () => {
|
||||
vi.useFakeTimers();
|
||||
const sessDir = mkdtempSync(join(tmpdir(), 'arb-sess-'));
|
||||
|
||||
Reference in New Issue
Block a user