Skip to main content

symbi_runtime/toolclad/
session_state.rs

1//! Session state types for interactive CLI tool sessions.
2
3use serde::{Deserialize, Serialize};
4use std::time::Instant;
5
6/// Unique session identifier.
7pub type SessionId = String;
8
9/// Session lifecycle status.
10#[derive(Debug, Clone, PartialEq)]
11pub enum SessionStatus {
12    Spawning,
13    Ready,
14    Busy,
15    TimedOut,
16    Terminated,
17}
18
19/// Current state of a session.
20#[derive(Debug, Clone)]
21pub struct SessionState {
22    pub status: SessionStatus,
23    pub prompt: String,
24    pub inferred_state: String,
25    pub interaction_count: u32,
26    pub started_at: Instant,
27    pub last_interaction_at: Instant,
28    pub session_id: SessionId,
29}
30
31/// Direction of a transcript entry.
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub enum TranscriptDirection {
34    Command,
35    Response,
36    PolicyDenied,
37    System,
38}
39
40/// A single entry in the session transcript.
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct TranscriptEntry {
43    pub timestamp_ms: u64,
44    pub direction: TranscriptDirection,
45    pub content: String,
46    pub command_name: Option<String>,
47    pub duration_ms: Option<u64>,
48}
49
50/// Full session transcript for evidence.
51#[derive(Debug, Clone, Default, Serialize, Deserialize)]
52pub struct SessionTranscript {
53    pub entries: Vec<TranscriptEntry>,
54}
55
56impl SessionTranscript {
57    pub fn append(
58        &mut self,
59        direction: TranscriptDirection,
60        content: &str,
61        command_name: Option<&str>,
62    ) {
63        self.entries.push(TranscriptEntry {
64            timestamp_ms: std::time::SystemTime::now()
65                .duration_since(std::time::UNIX_EPOCH)
66                .unwrap_or_default()
67                .as_millis() as u64,
68            direction,
69            content: content.to_string(),
70            command_name: command_name.map(String::from),
71            duration_ms: None,
72        });
73    }
74}