From 5c67bc77148ae089bc491d7e5ad9bc60908dbe1e Mon Sep 17 00:00:00 2001 From: kvtodev Date: Mon, 13 Jul 2026 19:57:17 +0800 Subject: [PATCH] add status field for persistence result in chat doc --- .../shared-contracts/src/editor_agent.rs | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/server-rs/crates/shared-contracts/src/editor_agent.rs b/server-rs/crates/shared-contracts/src/editor_agent.rs index da29519d1..90697f92a 100644 --- a/server-rs/crates/shared-contracts/src/editor_agent.rs +++ b/server-rs/crates/shared-contracts/src/editor_agent.rs @@ -23,6 +23,20 @@ pub enum EditorAgentAttachmentSource { LibraryAsset, } +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum EditorAgentToolCallStatus { + #[serde(alias = "pending_confirmation", alias = "executing")] + NotCompleted, + Completed, + Failed, + Cancelled, +} + +fn default_editor_agent_tool_call_status() -> EditorAgentToolCallStatus { + EditorAgentToolCallStatus::NotCompleted +} + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct EditorAgentAttachmentRef { @@ -140,13 +154,13 @@ pub struct EditorAgentToolCallImageRef { #[serde(rename_all = "camelCase")] pub struct EditorAgentToolCall { pub tool_name: String, + #[serde(default = "default_editor_agent_tool_call_status")] + pub status: EditorAgentToolCallStatus, pub args: serde_json::Value, pub display_args: EditorAgentToolCallDisplayArgs, #[serde(default)] pub external_job_id: Option, #[serde(default)] - pub cancelled_at: Option, - #[serde(default)] pub images: Vec, #[serde(default)] pub videos: Vec, @@ -267,6 +281,7 @@ mod tests { let tool_call = EditorAgentToolCall { tool_name: "generate-video".to_string(), + status: EditorAgentToolCallStatus::Completed, args: json!({}), display_args: EditorAgentToolCallDisplayArgs { string_args: vec![EditorAgentToolCallStringArg { @@ -292,7 +307,6 @@ mod tests { }, }, external_job_id: Some("task-editor-agent-1".to_string()), - cancelled_at: None, images: Vec::new(), videos: vec![EditorAgentGeneratedVideo { resource_id: Some("resource-video-1".to_string()), @@ -314,7 +328,7 @@ mod tests { let payload = serde_json::to_value(tool_call).expect("tool call should serialize"); assert_eq!(payload["videos"][0]["videoSrc"], "/generated-video.mp4"); assert_eq!(payload["externalJobId"], "task-editor-agent-1"); - assert!(payload.get("status").is_none()); + assert_eq!(payload["status"], "completed"); assert_eq!(payload["audios"][0]["audioSrc"], "/generated-audio.mp3"); assert_eq!( payload["displayArgs"]["stringArgs"][0]["value"], @@ -332,7 +346,7 @@ mod tests { } #[test] - fn legacy_tool_call_status_is_ignored_on_read() { + fn legacy_tool_call_status_maps_to_not_completed_on_read() { let tool_call = serde_json::from_value::(json!({ "toolName": "generate-image", "status": "executing", @@ -347,6 +361,6 @@ mod tests { .expect("legacy status should not break persisted OSS documents"); let payload = serde_json::to_value(tool_call).expect("tool call should serialize"); - assert!(payload.get("status").is_none()); + assert_eq!(payload["status"], "not_completed"); } }