advertise and enforce per-agent terminal session limits

This commit is contained in:
lda committed 2026-07-16 19:26:12 +07:00 Verified
1 parent 9a14410bed
commit 0e99a584a3
10 files changed
+174 -18

No files matched your search

+8 -2
View File
@@ -6,8 +6,9 @@ use serde::{Deserialize, Serialize};
use std::time::Instant;
use tracing::{info, info_span, warn};
use uuid::Uuid;
use wakey_agent::protocol::AgentCapability;
use wakey_agent::protocol::{AgentCommand, ErrorPayload, RequestId, ServerMessage};
use wakey_agent::protocol::{
AgentCapability, AgentCapabilityOptions, AgentCommand, ErrorPayload, RequestId, ServerMessage,
};
use crate::api::ApiError;
use crate::runtime::{AgentReply, AppState, SessionEvent};
@@ -19,6 +20,7 @@ pub struct AgentStatus {
pub connected: bool,
pub nickname: Option<String>,
pub capabilities: Vec<AgentCapability>,
pub capability_options: AgentCapabilityOptions,
}
#[derive(Debug, Deserialize)]
@@ -49,6 +51,10 @@ pub async fn list_agents(State(state): State<AppState>) -> Result<impl IntoRespo
.get(&agent_id)
.map(|session| session.capabilities.clone())
.unwrap_or_default(),
capability_options: sessions
.get(&agent_id)
.map(|session| session.capability_options.clone())
.unwrap_or_default(),
agent_id,
nickname,
})
+12 -5
View File
@@ -7,8 +7,8 @@ use futures_util::{SinkExt, StreamExt};
use serde::{Deserialize, Serialize};
use tracing::{info, warn};
use wakey_agent::protocol::{
AgentCapability, ServerMessage, TerminalAgentHandshake, TerminalControl, TerminalId,
TerminalOperatorHandshake,
AgentCapability, DEFAULT_TERMINAL_MAX_SESSIONS, ServerMessage, TerminalAgentHandshake,
TerminalControl, TerminalId, TerminalOperatorHandshake,
};
use crate::api::ApiError;
@@ -52,7 +52,7 @@ pub async fn create_terminal(
Json(request): Json<CreateTerminalRequest>,
) -> Result<(StatusCode, Json<TerminalSessionResponse>), ApiError> {
validate_size(request.rows, request.cols)?;
let agent_tx = {
let (agent_tx, max_sessions) = {
let sessions = state.sessions.read().await;
let session = sessions.get(&request.agent_id).ok_or_else(|| {
ApiError::new(
@@ -68,12 +68,19 @@ pub async fn create_terminal(
"agent has not advertised terminal capability",
));
}
session.tx.clone()
let max_sessions = session
.capability_options
.terminal
.as_ref()
.map(|terminal| terminal.max_sessions)
.unwrap_or(DEFAULT_TERMINAL_MAX_SESSIONS)
.max(1);
(session.tx.clone(), max_sessions)
};
let created = state
.terminals
.create(request.agent_id.clone())
.create_with_limit(request.agent_id.clone(), max_sessions)
.await
.map_err(registry_error)?;
let terminal_id = TerminalId::new(created.terminal_id.clone()).map_err(|message| {