feat(terminals): reprise de conversation par cellule + fix ordre d'écriture
Permet de recharger la conversation CLI précédente de chaque cellule à la
réouverture du projet, de façon universelle (indépendant du modèle/CLI).
- profil AgentRuntime: bloc déclaratif optionnel `session { assignFlag, resumeFlag }`
- LeafCell: `conversationId` (persistant, distinct du SessionId PTY) + `agentWasRunning`
- runtime: SessionPlan (None/Assign/Resume) + composition pure des args
- LaunchAgent: décide Assign vs Resume, génère l'UUID, remonte l'id assigné
(persistance par l'appelant via setCellConversation — découplage SRP)
- close: SnapshotRunningAgents fige `agentWasRunning` avant le kill-all
(statut clot/en cours universel, sans parsing CLI)
- SessionInspector: port optionnel best-effort + adapter ClaudeTranscriptInspector
- popup de reprise par cellule (statut + sujet/tokens si dispo), intercalée
avant le Resume auto, jamais sur le chemin reattach
fix(terminals): sérialise les écritures PTY (file FIFO par handle) — corrige
les caractères mélangés/accents dus au réordonnancement des invoke Tauri concurrents
fix(layout): l'opération `move` préservait mal les champs du leaf (perdait `agent`)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -62,11 +62,17 @@ export interface GatewayError {
|
||||
export type Direction = "row" | "column";
|
||||
|
||||
/** A terminal-hosting leaf cell. `session` is the hosted SessionId, if any.
|
||||
* `agent` is the agent id if an agent is pinned to this cell (absent = plain terminal). */
|
||||
* `agent` is the agent id if an agent is pinned to this cell (absent = plain terminal).
|
||||
* `conversationId` is the persistent CLI conversation id (survives PTY close/reopen,
|
||||
* lets the agent resume); omitted when absent (mirrors the backend `skip_serializing_if`).
|
||||
* `agentWasRunning` records whether the cell's agent process was running at close time;
|
||||
* omitted when `false`. */
|
||||
export interface LeafCell {
|
||||
id: string;
|
||||
session?: string | null;
|
||||
agent?: string;
|
||||
conversationId?: string;
|
||||
agentWasRunning?: boolean;
|
||||
}
|
||||
|
||||
/** A weighted child of a split. `weight` is a relative (`> 0`) share. */
|
||||
@ -129,7 +135,9 @@ export type LayoutOperation =
|
||||
| { type: "resize"; container: string; weights: number[] }
|
||||
| { type: "move"; from: string; to: string }
|
||||
| { type: "setSession"; target: string; session?: string | null }
|
||||
| { type: "setCellAgent"; target: string; agent: string | null };
|
||||
| { type: "setCellAgent"; target: string; agent: string | null }
|
||||
| { type: "setCellConversation"; target: string; conversationId: string | null }
|
||||
| { type: "setAgentRunning"; target: string; running: boolean };
|
||||
|
||||
/** The kind of a named layout. */
|
||||
export type LayoutKind = "terminal" | "gitGraph";
|
||||
@ -197,6 +205,9 @@ export interface AgentProfile {
|
||||
contextInjection: ContextInjection;
|
||||
detect: string | null;
|
||||
cwdTemplate: string;
|
||||
/** Optional CLI flags for agent-session continuity: `assignFlag` to bind a
|
||||
* conversation id at launch, `resumeFlag` to resume an existing conversation. */
|
||||
session?: { assignFlag?: string; resumeFlag: string };
|
||||
}
|
||||
|
||||
/** Availability of a candidate profile after detection (mirror of the DTO). */
|
||||
|
||||
Reference in New Issue
Block a user