symbi_runtime/toolclad/
session_state.rs1use serde::{Deserialize, Serialize};
4use std::time::Instant;
5
6pub type SessionId = String;
8
9#[derive(Debug, Clone, PartialEq)]
11pub enum SessionStatus {
12 Spawning,
13 Ready,
14 Busy,
15 TimedOut,
16 Terminated,
17}
18
19#[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#[derive(Debug, Clone, Serialize, Deserialize)]
33pub enum TranscriptDirection {
34 Command,
35 Response,
36 PolicyDenied,
37 System,
38}
39
40#[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#[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}