From 86adf88351e17c6a11cac253714b169eac0db233 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Sun, 17 May 2026 01:41:16 +0300 Subject: feat: add terminal identity and agent cli facade --- src/terminal/id.rs | 29 +++++++++++++++++++++++++++++ src/terminal/mod.rs | 3 +++ 2 files changed, 32 insertions(+) create mode 100644 src/terminal/id.rs create mode 100644 src/terminal/mod.rs (limited to 'src/terminal') diff --git a/src/terminal/id.rs b/src/terminal/id.rs new file mode 100644 index 00000000..53ef6786 --- /dev/null +++ b/src/terminal/id.rs @@ -0,0 +1,29 @@ +use std::fmt; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::{SystemTime, UNIX_EPOCH}; + +/// Opaque identity for a server-owned terminal. +/// +/// During the pane-backed transition this is stored one-to-one beside panes, +/// but callers must not derive it from a pane id or layout position. +#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] +pub struct TerminalId(String); + +static NEXT_TERMINAL_ID: AtomicU64 = AtomicU64::new(1); + +impl TerminalId { + pub fn alloc() -> Self { + let micros = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_micros()) + .unwrap_or(0); + let counter = NEXT_TERMINAL_ID.fetch_add(1, Ordering::Relaxed); + Self(format!("term_{micros:x}{counter:x}")) + } +} + +impl fmt::Display for TerminalId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} diff --git a/src/terminal/mod.rs b/src/terminal/mod.rs new file mode 100644 index 00000000..489f7876 --- /dev/null +++ b/src/terminal/mod.rs @@ -0,0 +1,3 @@ +mod id; + +pub use id::TerminalId; -- cgit v1.2.3