From 96523f0d77f0243321b2bc9dcd13bfa61314c52c Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Fri, 22 Aug 2025 17:21:48 +0530 Subject: [PATCH] schema for agent mode --- Cargo.lock | 1 + crates/agent_settings/Cargo.toml | 1 + crates/agent_settings/src/agent_settings.rs | 26 +++--- crates/vim_mode_setting/Cargo.toml | 1 + .../vim_mode_setting/src/vim_mode_setting.rs | 81 ++++++++++--------- 5 files changed, 57 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 789642ec07..7da54587d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18000,6 +18000,7 @@ dependencies = [ "gpui", "schemars", "serde", + "serde_json", "settings", "workspace-hack", ] diff --git a/crates/agent_settings/Cargo.toml b/crates/agent_settings/Cargo.toml index e0df5af0aa..07fbd74b4e 100644 --- a/crates/agent_settings/Cargo.toml +++ b/crates/agent_settings/Cargo.toml @@ -19,6 +19,7 @@ gpui.workspace = true language_model.workspace = true schemars.workspace = true serde.workspace = true +serde_json.workspace = true settings.workspace = true workspace-hack.workspace = true vim_mode_setting.workspace = true diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs index 9a02a77939..d4d1cd9dc0 100644 --- a/crates/agent_settings/src/agent_settings.rs +++ b/crates/agent_settings/src/agent_settings.rs @@ -90,23 +90,19 @@ impl JsonSchema for AgentEditorMode { "AgentEditorMode".into() } - fn json_schema(schema_gen: &mut schemars::SchemaGenerator) -> schemars::Schema { - let editor_mode_schema = EditorMode::json_schema(schema_gen); + fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema { + use vim_mode_setting::EditorMode; - // TODO: This schema is incorrect. Need to extend editor_mode_schema with `inherit` - let result = json_schema!({ - "oneOf": [ - { - "const": "inherit", - "description": "Inherit editor mode from global settings" - }, - editor_mode_schema - ], + let mut options = vec![serde_json::json!({ + "const": "inherit", + "description": "Inherit editor mode from global settings" + })]; + options.extend(EditorMode::get_schema_options()); + + json_schema!({ + "oneOf": options, "description": "Agent editor mode - either inherit from global settings or override with a specific mode" - }); - - dbg!(&result); - result + }) } } diff --git a/crates/vim_mode_setting/Cargo.toml b/crates/vim_mode_setting/Cargo.toml index ef4fde738f..562632d1db 100644 --- a/crates/vim_mode_setting/Cargo.toml +++ b/crates/vim_mode_setting/Cargo.toml @@ -18,3 +18,4 @@ schemars.workspace = true settings.workspace = true workspace-hack.workspace = true serde.workspace = true +serde_json.workspace = true diff --git a/crates/vim_mode_setting/src/vim_mode_setting.rs b/crates/vim_mode_setting/src/vim_mode_setting.rs index 46f67cb870..663b198bd0 100644 --- a/crates/vim_mode_setting/src/vim_mode_setting.rs +++ b/crates/vim_mode_setting/src/vim_mode_setting.rs @@ -38,45 +38,9 @@ impl JsonSchema for EditorMode { } fn json_schema(_gen: &mut schemars::SchemaGenerator) -> Schema { + let options = Self::get_schema_options(); json_schema!({ - "oneOf": [ - { - "const": "default", - "description": "Standard editing mode" - }, - { - "const": "vim", - "description": "Vim normal mode" - }, - { - "const": "vim_normal", - "description": "Vim normal mode" - }, - { - "const": "vim_insert", - "description": "Vim insert mode" - }, - { - "const": "vim_replace", - "description": "Vim replace mode" - }, - { - "const": "vim_visual", - "description": "Vim visual mode" - }, - { - "const": "vim_visual_line", - "description": "Vim visual line mode" - }, - { - "const": "vim_visual_block", - "description": "Vim visual block mode" - }, - { - "const": "helix_experimental", - "description": "Helix mode (experimental)" - } - ], + "oneOf": options, "description": "Editor mode" }) } @@ -192,4 +156,45 @@ impl EditorMode { pub fn vim() -> EditorMode { EditorMode::Vim(ModalMode::default()) } + + pub fn get_schema_options() -> Vec { + vec![ + serde_json::json!({ + "const": "default", + "description": "Standard editing mode" + }), + serde_json::json!({ + "const": "vim", + "description": "Vim normal mode" + }), + serde_json::json!({ + "const": "vim_normal", + "description": "Vim normal mode" + }), + serde_json::json!({ + "const": "vim_insert", + "description": "Vim insert mode" + }), + serde_json::json!({ + "const": "vim_replace", + "description": "Vim replace mode" + }), + serde_json::json!({ + "const": "vim_visual", + "description": "Vim visual mode" + }), + serde_json::json!({ + "const": "vim_visual_line", + "description": "Vim visual line mode" + }), + serde_json::json!({ + "const": "vim_visual_block", + "description": "Vim visual block mode" + }), + serde_json::json!({ + "const": "helix_experimental", + "description": "Helix mode (experimental)" + }), + ] + } }