P2: découverte & reprise des sessions Claude
Arboretum découvre désormais toutes les sessions Claude de la machine (scan ~/.claude/projects + registre ~/.claude/sessions), distingue vivantes/mortes par pid+procStart, et permet de reprendre une morte (--resume dans son cwd d'origine) ou forker une vivante sans la corrompre. - shared: SessionSummary enrichi (source, claudeSessionId, pid, resumable, attachable, registryStatus) — additif, PROTOCOL_VERSION inchangé ; types REST resume/fork. - db: migration id:2 (claude_session_id, resumed_from). - core: jsonl-discovery (parseur tolérant, scan asynchrone non bloquant), session-registry (vivacité pid+procStart), discovery-service (cache + refresh périodique + diff/broadcast), pty-manager (resume/fork + capture du claudeSessionId via le registre). - routes: /sessions/:id/resume (garde-fou 409 anti-corruption sur session vivante) et /fork ; GET fusionné managées + découvertes ; relais WS. - web: badges managed/discovered + busy/idle/waiting, actions conditionnelles (Open/Observe/Kill vs Fork/View vs Resume/Fork), vue read-only des sessions externes, i18n EN/FR. - tests: jsonl-discovery, session-registry, discovery-service + resume/fork (130 verts) ; acceptation E2E acceptance-p2.mjs (sans quota) ALL GREEN. Conforme aux verdicts S1 (resume dans cwd d'origine, vivacité pid+procStart) et S4 (munge cwd, parseur tête+queue, priorité de titre). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -29,3 +29,8 @@ export interface SessionsListResponse {
|
||||
export interface SessionResponse {
|
||||
session: SessionSummary;
|
||||
}
|
||||
|
||||
// POST /sessions/:id/resume et /sessions/:id/fork (P2) : aucun corps — cwd et command
|
||||
// sont TOUJOURS dérivés du :id (lu sur disque), jamais fournis par le client (cf. spike S1).
|
||||
export type ResumeSessionRequest = Record<string, never>;
|
||||
export type ForkSessionRequest = Record<string, never>;
|
||||
|
||||
@@ -60,6 +60,14 @@ export type SessionRuntimeStatus =
|
||||
| 'running' // P1 : pas encore de distinction busy/waiting/idle (P3 via claude-adapter)
|
||||
| 'exited';
|
||||
|
||||
/** Origine d'une session listée par Arboretum. */
|
||||
export type SessionSource =
|
||||
| 'managed' // PTY lancé par Arboretum (vit dans le PtyManager)
|
||||
| 'discovered'; // session Claude externe lue sur disque (~/.claude)
|
||||
|
||||
/** Statut brut tel qu'écrit par le CLI dans ~/.claude/sessions (interprété finement en P3). */
|
||||
export type SessionRegistryStatus = 'busy' | 'idle' | 'waiting';
|
||||
|
||||
export interface SessionSummary {
|
||||
id: string;
|
||||
cwd: string;
|
||||
@@ -71,6 +79,19 @@ export interface SessionSummary {
|
||||
endedAt: string | null;
|
||||
exitCode: number | null;
|
||||
clients: number;
|
||||
// ---- P2 : découverte & reprise (additif) ----
|
||||
/** 'managed' = PtyManager ; 'discovered' = lue sur disque. */
|
||||
source: SessionSource;
|
||||
/** ID interne du CLI claude (clé de corrélation managé↔découvert) ; null pour bash ou claude pas encore prêt. */
|
||||
claudeSessionId: string | null;
|
||||
/** pid du process claude (découvertes vivantes & managées vivantes) ; null sinon. */
|
||||
pid: number | null;
|
||||
/** true si un `--resume` direct est sûr (session morte) ; false pour une vivante (corruption). */
|
||||
resumable: boolean;
|
||||
/** true si Arboretum tient le PTY (managée vivante) ; jamais pour une découverte. */
|
||||
attachable: boolean;
|
||||
/** statut brut du registre ~/.claude/sessions (P2) ; interprété finement en P3 (claude-adapter). */
|
||||
registryStatus: SessionRegistryStatus | null;
|
||||
}
|
||||
|
||||
// ---- Messages client → serveur ----
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user