use super::*;
pub(super) fn reject_protocol_command_in_pane(backend: &str, command: &[String]) -> Result<()> {
if !matches!(backend, "herdr" | "orca" | "zellij") {
return Ok(());
}
let token = command.iter().enumerate().find_map(|(index, arg)| {
if arg == "--acp" || arg == "--mode=rpc" {
Some(arg.as_str())
} else if arg == "--mode" && command.get(index + 1).is_some_and(|next| next == "rpc") {
Some("--mode rpc")
} else {
None
}
});
if let Some(token) = token {
return Err(anyhow!(
"{backend} backend cannot host a protocol session: {token} speaks JSON-RPC on its own stdio and the pane would print the frames; set backend = \"exec\" or backend = \"acp\" in the workspace config"
));
}
Ok(())
}
pub(super) fn served_socket(workspace: &Path) -> PathBuf {
RoleWorkspace::resolve(workspace).socket_path()
}
pub(super) fn session_env(
role: &str,
session_id: &str,
task_id: &str,
relay_required: &[String],
relay_count: Option<u32>,
topology: &str,
adapter_socket: &Path,
) -> BTreeMap<String, String> {
let mut env = BTreeMap::new();
env.insert("ONLYNE_SESSION_ID".into(), session_id.to_string());
env.insert("ONLYNE_TASK_ID".into(), task_id.to_string());
env.insert("ONLYNE_ROLE".into(), role.to_string());
if !adapter_socket.as_os_str().is_empty() {
env.insert(
"ONLYNE_SOCKET".into(),
adapter_socket.to_string_lossy().into_owned(),
);
}
if !topology.is_empty() {
env.insert("ONLYNE_CLUSTER".into(), topology.to_string());
}
if !relay_required.is_empty() {
env.insert("ONLYNE_RELAY_REQUIRED".into(), relay_required.join(","));
}
if let Some(count) = relay_count {
env.insert("ONLYNE_RELAY_COUNT".into(), count.to_string());
}
env
}
pub fn missing_capability(capabilities: &[Capability], capability: Capability) -> bool {
!capabilities.contains(&capability)
}
pub fn plugin_gap(capabilities: &[Capability]) -> Vec<onlyne_adapter::HostGap> {
onlyne_adapter::degrade_for(
&[Capability::Recycle, Capability::Report, Capability::Inject]
.iter()
.copied()
.filter(|cap| missing_capability(capabilities, *cap))
.collect::<Vec<_>>(),
)
}
pub(super) const AGENT: &str = "onlyne-client";
pub const REQUEST_TIMEOUT: Duration = Duration::from_secs(30);
pub const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(10);
pub const HEARTBEAT_SILENCE_MARGIN: u32 = 3;
#[cfg(test)]
mod tests;