aboutsummaryrefslogtreecommitdiff
path: root/src/terminal
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:16 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:16 +0300
commit86adf88351e17c6a11cac253714b169eac0db233 (patch)
tree883d32b0126e0b69449e0e9c0a7017d279c23935 /src/terminal
parentd2aa8865911ded97a67054fb2392a1c12fae018c (diff)
feat: add terminal identity and agent cli facade
Diffstat (limited to 'src/terminal')
-rw-r--r--src/terminal/id.rs29
-rw-r--r--src/terminal/mod.rs3
2 files changed, 32 insertions, 0 deletions
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;