diff options
Diffstat (limited to 'src/api/schema')
| -rw-r--r-- | src/api/schema/agents.rs | 32 | ||||
| -rw-r--r-- | src/api/schema/response.rs | 4 | ||||
| -rw-r--r-- | src/api/schema/tests.rs | 35 |
3 files changed, 58 insertions, 13 deletions
diff --git a/src/api/schema/agents.rs b/src/api/schema/agents.rs index 969383c4..8592e56b 100644 --- a/src/api/schema/agents.rs +++ b/src/api/schema/agents.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; -use super::common::{AgentStatus, ReadFormat, ReadSource, SplitDirection}; +use super::common::{AgentStatus, ReadFormat, ReadSource}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentReadParams { @@ -32,19 +32,19 @@ pub struct AgentRenameParams { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentStartParams { pub name: String, + pub kind: String, + pub pane_id: String, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub args: Vec<String>, + /// Startup timeout in milliseconds. Values must be greater than 3000 and at most 300000. #[serde(default, skip_serializing_if = "Option::is_none")] - pub cwd: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub workspace_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub tab_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub split: Option<SplitDirection>, - #[serde(default)] - pub focus: bool, - pub argv: Vec<String>, - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub env: HashMap<String, String>, + pub timeout_ms: Option<u64>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] +pub struct AgentPromptParams { + pub target: String, + pub text: String, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] @@ -76,6 +76,12 @@ pub struct AgentInfo { pub tab_id: String, pub pane_id: String, pub focused: bool, + #[serde(default, skip_serializing_if = "super::is_false")] + pub launch_pending: bool, + #[serde(default, skip_serializing_if = "super::is_false")] + pub interactive_ready: bool, + #[serde(default)] + pub state_change_seq: u64, #[serde(default, skip_serializing_if = "Option::is_none")] pub cwd: Option<String>, #[serde(default, skip_serializing_if = "Option::is_none")] diff --git a/src/api/schema/response.rs b/src/api/schema/response.rs index 129c8f91..ad058191 100644 --- a/src/api/schema/response.rs +++ b/src/api/schema/response.rs @@ -101,6 +101,10 @@ pub enum ResponseResult { agent: AgentInfo, argv: Vec<String>, }, + AgentPrompted { + agent: AgentInfo, + baseline_state_change_seq: u64, + }, AgentList { agents: Vec<AgentInfo>, }, diff --git a/src/api/schema/tests.rs b/src/api/schema/tests.rs index bc044ee9..232c2b73 100644 --- a/src/api/schema/tests.rs +++ b/src/api/schema/tests.rs @@ -62,6 +62,41 @@ fn request_uses_dot_method_names() { } #[test] +fn agent_start_and_prompt_requests_round_trip() { + let start = Request { + id: "start".into(), + method: Method::AgentStart(AgentStartParams { + name: "reviewer".into(), + kind: "pi".into(), + pane_id: "w1:p2".into(), + args: vec!["--no-session".into()], + timeout_ms: Some(30_000), + }), + }; + let start_json = serde_json::to_value(&start).unwrap(); + assert_eq!(start_json["method"], "agent.start"); + assert_eq!(start_json["params"]["pane_id"], "w1:p2"); + assert_eq!( + serde_json::from_value::<Request>(start_json).unwrap(), + start + ); + + let prompt = Request { + id: "prompt".into(), + method: Method::AgentPrompt(AgentPromptParams { + target: "reviewer".into(), + text: "review this".into(), + }), + }; + let prompt_json = serde_json::to_value(&prompt).unwrap(); + assert_eq!(prompt_json["method"], "agent.prompt"); + assert_eq!( + serde_json::from_value::<Request>(prompt_json).unwrap(), + prompt + ); +} + +#[test] fn bundled_protocol_schema_refs_resolve_inside_bundle() { fn assert_no_standalone_refs(value: &serde_json::Value) { match value { |
