From 35999d49f3d68d0eff87934cdc237928747de09b Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Fri, 26 Jun 2026 09:03:31 -0700 Subject: [PATCH] add ACP+ handlers for prompt editing (#10031) --- crates/goose-sdk-types/src/custom_requests.rs | 64 ++ crates/goose/acp-meta.json | 20 + crates/goose/acp-schema.json | 195 ++++ crates/goose/src/acp/server.rs | 1 + .../goose/src/acp/server/custom_dispatch.rs | 32 + crates/goose/src/acp/server/prompts.rs | 81 ++ .../goose/tests/acp_custom_requests_test.rs | 94 ++ ui/desktop/src/acp/prompts.ts | 29 + .../settings/PromptsSettingsSection.tsx | 97 +- ui/sdk/src/generated/client.gen.ts | 56 ++ ui/sdk/src/generated/index.ts | 22 +- ui/sdk/src/generated/types.gen.ts | 59 +- ui/sdk/src/generated/zod.gen.ts | 846 +++++------------- 13 files changed, 915 insertions(+), 681 deletions(-) create mode 100644 crates/goose/src/acp/server/prompts.rs create mode 100644 ui/desktop/src/acp/prompts.ts diff --git a/crates/goose-sdk-types/src/custom_requests.rs b/crates/goose-sdk-types/src/custom_requests.rs index baa4601ea..91950d549 100644 --- a/crates/goose-sdk-types/src/custom_requests.rs +++ b/crates/goose-sdk-types/src/custom_requests.rs @@ -246,6 +246,70 @@ pub struct DiagnosticsGetResponse { pub report: serde_json::Value, } +/// Information about a prompt template, including its default content and customization status. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct PromptTemplateEntry { + pub name: String, + pub description: String, + pub default_content: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub user_content: Option, + pub is_customized: bool, +} + +/// List all available Goose prompt templates. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] +#[request(method = "_goose/unstable/config/prompts/list", response = ListPromptsResponse)] +#[serde(rename_all = "camelCase")] +pub struct ListPromptsRequest {} + +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcResponse)] +#[serde(rename_all = "camelCase")] +pub struct ListPromptsResponse { + pub prompts: Vec, +} + +/// Read a Goose prompt template. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] +#[request(method = "_goose/unstable/config/prompts/get", response = GetPromptResponse)] +#[serde(rename_all = "camelCase")] +pub struct GetPromptRequest { + pub name: String, +} + +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcResponse)] +#[serde(rename_all = "camelCase")] +pub struct GetPromptResponse { + pub name: String, + pub content: String, + pub default_content: String, + pub is_customized: bool, +} + +/// Save a custom Goose prompt template. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] +#[request(method = "_goose/unstable/config/prompts/save", response = PromptOperationResponse)] +#[serde(rename_all = "camelCase")] +pub struct SavePromptRequest { + pub name: String, + pub content: String, +} + +/// Reset a Goose prompt template to its default content. +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] +#[request(method = "_goose/unstable/config/prompts/reset", response = PromptOperationResponse)] +#[serde(rename_all = "camelCase")] +pub struct ResetPromptRequest { + pub name: String, +} + +#[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcResponse)] +#[serde(rename_all = "camelCase")] +pub struct PromptOperationResponse { + pub message: String, +} + /// Delete a session. #[derive(Debug, Default, Clone, Serialize, Deserialize, JsonSchema, JsonRpcRequest)] #[request(method = "session/delete", response = EmptyResponse)] diff --git a/crates/goose/acp-meta.json b/crates/goose/acp-meta.json index 254521a49..af5fd271c 100644 --- a/crates/goose/acp-meta.json +++ b/crates/goose/acp-meta.json @@ -65,6 +65,26 @@ "requestType": "DiagnosticsGetRequest_unstable", "responseType": "DiagnosticsGetResponse_unstable" }, + { + "method": "_goose/unstable/config/prompts/list", + "requestType": "ListPromptsRequest_unstable", + "responseType": "ListPromptsResponse_unstable" + }, + { + "method": "_goose/unstable/config/prompts/get", + "requestType": "GetPromptRequest_unstable", + "responseType": "GetPromptResponse_unstable" + }, + { + "method": "_goose/unstable/config/prompts/save", + "requestType": "SavePromptRequest_unstable", + "responseType": "PromptOperationResponse_unstable" + }, + { + "method": "_goose/unstable/config/prompts/reset", + "requestType": "ResetPromptRequest_unstable", + "responseType": "PromptOperationResponse_unstable" + }, { "method": "session/delete", "requestType": "DeleteSessionRequest", diff --git a/crates/goose/acp-schema.json b/crates/goose/acp-schema.json index 36921967a..28e08ce01 100644 --- a/crates/goose/acp-schema.json +++ b/crates/goose/acp-schema.json @@ -1180,6 +1180,141 @@ "x-side": "agent", "x-method": "_goose/unstable/diagnostics/get" }, + "ListPromptsRequest_unstable": { + "type": "object", + "description": "List all available Goose prompt templates.", + "x-side": "agent", + "x-method": "_goose/unstable/config/prompts/list" + }, + "ListPromptsResponse_unstable": { + "type": "object", + "properties": { + "prompts": { + "type": "array", + "items": { + "$ref": "#/$defs/PromptTemplateEntry" + } + } + }, + "required": [ + "prompts" + ], + "x-side": "agent", + "x-method": "_goose/unstable/config/prompts/list" + }, + "PromptTemplateEntry": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "defaultContent": { + "type": "string" + }, + "userContent": { + "type": [ + "string", + "null" + ] + }, + "isCustomized": { + "type": "boolean" + } + }, + "required": [ + "name", + "description", + "defaultContent", + "isCustomized" + ], + "description": "Information about a prompt template, including its default content and customization status." + }, + "GetPromptRequest_unstable": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "description": "Read a Goose prompt template.", + "x-side": "agent", + "x-method": "_goose/unstable/config/prompts/get" + }, + "GetPromptResponse_unstable": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "content": { + "type": "string" + }, + "defaultContent": { + "type": "string" + }, + "isCustomized": { + "type": "boolean" + } + }, + "required": [ + "name", + "content", + "defaultContent", + "isCustomized" + ], + "x-side": "agent", + "x-method": "_goose/unstable/config/prompts/get" + }, + "SavePromptRequest_unstable": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "content": { + "type": "string" + } + }, + "required": [ + "name", + "content" + ], + "description": "Save a custom Goose prompt template.", + "x-side": "agent", + "x-method": "_goose/unstable/config/prompts/save" + }, + "PromptOperationResponse_unstable": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "x-side": "agent" + }, + "ResetPromptRequest_unstable": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "description": "Reset a Goose prompt template to its default content.", + "x-side": "agent", + "x-method": "_goose/unstable/config/prompts/reset" + }, "DeleteSessionRequest": { "type": "object", "properties": { @@ -5406,6 +5541,42 @@ "description": "Params for _goose/unstable/diagnostics/get", "title": "DiagnosticsGetRequest_unstable" }, + { + "allOf": [ + { + "$ref": "#/$defs/ListPromptsRequest_unstable" + } + ], + "description": "Params for _goose/unstable/config/prompts/list", + "title": "ListPromptsRequest_unstable" + }, + { + "allOf": [ + { + "$ref": "#/$defs/GetPromptRequest_unstable" + } + ], + "description": "Params for _goose/unstable/config/prompts/get", + "title": "GetPromptRequest_unstable" + }, + { + "allOf": [ + { + "$ref": "#/$defs/SavePromptRequest_unstable" + } + ], + "description": "Params for _goose/unstable/config/prompts/save", + "title": "SavePromptRequest_unstable" + }, + { + "allOf": [ + { + "$ref": "#/$defs/ResetPromptRequest_unstable" + } + ], + "description": "Params for _goose/unstable/config/prompts/reset", + "title": "ResetPromptRequest_unstable" + }, { "allOf": [ { @@ -6200,6 +6371,30 @@ ], "title": "DiagnosticsGetResponse_unstable" }, + { + "allOf": [ + { + "$ref": "#/$defs/ListPromptsResponse_unstable" + } + ], + "title": "ListPromptsResponse_unstable" + }, + { + "allOf": [ + { + "$ref": "#/$defs/GetPromptResponse_unstable" + } + ], + "title": "GetPromptResponse_unstable" + }, + { + "allOf": [ + { + "$ref": "#/$defs/PromptOperationResponse_unstable" + } + ], + "title": "PromptOperationResponse_unstable" + }, { "allOf": [ { diff --git a/crates/goose/src/acp/server.rs b/crates/goose/src/acp/server.rs index 7eef66058..ee83fa0e4 100644 --- a/crates/goose/src/acp/server.rs +++ b/crates/goose/src/acp/server.rs @@ -97,6 +97,7 @@ mod load_session; mod manage_sessions; mod new_session; mod onboarding; +mod prompts; mod providers; mod recipe; mod resources; diff --git a/crates/goose/src/acp/server/custom_dispatch.rs b/crates/goose/src/acp/server/custom_dispatch.rs index de88979ce..9bc6627c1 100644 --- a/crates/goose/src/acp/server/custom_dispatch.rs +++ b/crates/goose/src/acp/server/custom_dispatch.rs @@ -122,6 +122,38 @@ impl GooseAcpAgent { self.on_get_diagnostics(req).await } + #[custom_method(ListPromptsRequest)] + async fn dispatch_list_prompts( + &self, + req: ListPromptsRequest, + ) -> Result { + self.on_list_prompts(req).await + } + + #[custom_method(GetPromptRequest)] + async fn dispatch_get_prompt( + &self, + req: GetPromptRequest, + ) -> Result { + self.on_get_prompt(req).await + } + + #[custom_method(SavePromptRequest)] + async fn dispatch_save_prompt( + &self, + req: SavePromptRequest, + ) -> Result { + self.on_save_prompt(req).await + } + + #[custom_method(ResetPromptRequest)] + async fn dispatch_reset_prompt( + &self, + req: ResetPromptRequest, + ) -> Result { + self.on_reset_prompt(req).await + } + #[custom_method(DeleteSessionRequest)] async fn dispatch_delete_session( &self, diff --git a/crates/goose/src/acp/server/prompts.rs b/crates/goose/src/acp/server/prompts.rs new file mode 100644 index 000000000..7051f792a --- /dev/null +++ b/crates/goose/src/acp/server/prompts.rs @@ -0,0 +1,81 @@ +use super::*; +use crate::prompt_template::{get_template, list_templates, reset_template, save_template}; + +impl GooseAcpAgent { + pub(super) async fn on_list_prompts( + &self, + _req: ListPromptsRequest, + ) -> Result { + let prompts = list_templates() + .into_iter() + .map(prompt_template_to_entry) + .collect(); + + Ok(ListPromptsResponse { prompts }) + } + + pub(super) async fn on_get_prompt( + &self, + req: GetPromptRequest, + ) -> Result { + let template = get_template(&req.name).ok_or_else(|| prompt_not_found(&req.name))?; + let content = template + .user_content + .as_ref() + .unwrap_or(&template.default_content) + .clone(); + + Ok(GetPromptResponse { + name: template.name, + content, + default_content: template.default_content, + is_customized: template.is_customized, + }) + } + + pub(super) async fn on_save_prompt( + &self, + req: SavePromptRequest, + ) -> Result { + save_template(&req.name, &req.content).map_err(|err| prompt_io_error(&req.name, err))?; + + Ok(PromptOperationResponse { + message: format!("Saved prompt: {}", req.name), + }) + } + + pub(super) async fn on_reset_prompt( + &self, + req: ResetPromptRequest, + ) -> Result { + reset_template(&req.name).map_err(|err| prompt_io_error(&req.name, err))?; + + Ok(PromptOperationResponse { + message: format!("Reset prompt to default: {}", req.name), + }) + } +} + +fn prompt_template_to_entry(template: crate::prompt_template::Template) -> PromptTemplateEntry { + PromptTemplateEntry { + name: template.name, + description: template.description, + default_content: template.default_content, + user_content: template.user_content, + is_customized: template.is_customized, + } +} + +fn prompt_not_found(name: &str) -> agent_client_protocol::Error { + agent_client_protocol::Error::invalid_params() + .data(format!("Prompt template '{name}' not found")) +} + +fn prompt_io_error(name: &str, err: std::io::Error) -> agent_client_protocol::Error { + if err.kind() == std::io::ErrorKind::NotFound { + prompt_not_found(name) + } else { + agent_client_protocol::Error::internal_error() + .data(format!("Failed to update prompt '{name}': {err}")) + } +} diff --git a/crates/goose/tests/acp_custom_requests_test.rs b/crates/goose/tests/acp_custom_requests_test.rs index c69ea6dd0..cf5ec0569 100644 --- a/crates/goose/tests/acp_custom_requests_test.rs +++ b/crates/goose/tests/acp_custom_requests_test.rs @@ -441,6 +441,100 @@ fn test_custom_get_available_extensions() { }); } +#[test] +#[serial] +fn test_custom_prompt_methods() { + let _guard = env_lock::lock_env([("EXTENSIONS", None::<&str>)]); + write_acp_global_config(DEFAULT_ACP_TEST_CONFIG); + + run_test(async move { + let openai = OpenAiFixture::new(vec![], Arc::new(EnforceSessionId::default())).await; + let conn = AcpServerConnection::new(TestConnectionConfig::default(), openai).await; + + let list_response = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/list", + serde_json::json!({}), + ) + .await + .expect("list prompts should succeed"); + let prompts = list_response["prompts"] + .as_array() + .expect("prompts should be an array"); + assert!( + prompts.iter().any(|prompt| prompt["name"] == "system.md"), + "system.md should be listed" + ); + + let get_response = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/get", + serde_json::json!({ "name": "system.md" }), + ) + .await + .expect("get prompt should succeed"); + assert_eq!(get_response["name"], "system.md"); + assert!(get_response["content"] + .as_str() + .is_some_and(|s| !s.is_empty())); + assert_eq!(get_response["isCustomized"], false); + + let content = "custom acp system prompt"; + let save_response = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/save", + serde_json::json!({ "name": "system.md", "content": content }), + ) + .await + .expect("save prompt should succeed"); + assert_eq!(save_response["message"], "Saved prompt: system.md"); + + let get_response = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/get", + serde_json::json!({ "name": "system.md" }), + ) + .await + .expect("get saved prompt should succeed"); + assert_eq!(get_response["content"], content); + assert_eq!(get_response["isCustomized"], true); + + let reset_response = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/reset", + serde_json::json!({ "name": "system.md" }), + ) + .await + .expect("reset prompt should succeed"); + assert_eq!( + reset_response["message"], + "Reset prompt to default: system.md" + ); + + let get_response = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/get", + serde_json::json!({ "name": "system.md" }), + ) + .await + .expect("get reset prompt should succeed"); + assert_eq!(get_response["isCustomized"], false); + assert_ne!(get_response["content"], content); + + let missing = send_custom( + conn.cx(), + "_goose/unstable/config/prompts/get", + serde_json::json!({ "name": "missing.md" }), + ) + .await + .expect_err("unknown prompt should fail"); + assert_eq!( + missing.code, + agent_client_protocol::ErrorCode::InvalidParams + ); + }); +} + #[test] #[serial] fn test_steer_session_adds_input_to_active_prompt() { diff --git a/ui/desktop/src/acp/prompts.ts b/ui/desktop/src/acp/prompts.ts new file mode 100644 index 000000000..8a3a7329f --- /dev/null +++ b/ui/desktop/src/acp/prompts.ts @@ -0,0 +1,29 @@ +import type { + GetPromptResponse_unstable, + PromptTemplateEntry, +} from '@aaif/goose-sdk'; +import { getAcpClient } from './acpConnection'; + +export type PromptTemplate = PromptTemplateEntry; +export type PromptContent = GetPromptResponse_unstable; + +export async function acpListPrompts(): Promise { + const client = await getAcpClient(); + const response = await client.goose.configPromptsList_unstable({}); + return response.prompts; +} + +export async function acpGetPrompt(name: string): Promise { + const client = await getAcpClient(); + return client.goose.configPromptsGet_unstable({ name }); +} + +export async function acpSavePrompt(name: string, content: string): Promise { + const client = await getAcpClient(); + await client.goose.configPromptsSave_unstable({ name, content }); +} + +export async function acpResetPrompt(name: string): Promise { + const client = await getAcpClient(); + await client.goose.configPromptsReset_unstable({ name }); +} diff --git a/ui/desktop/src/components/settings/PromptsSettingsSection.tsx b/ui/desktop/src/components/settings/PromptsSettingsSection.tsx index 610fb4032..dee3a0171 100644 --- a/ui/desktop/src/components/settings/PromptsSettingsSection.tsx +++ b/ui/desktop/src/components/settings/PromptsSettingsSection.tsx @@ -1,12 +1,12 @@ import { useState, useEffect, useCallback } from 'react'; import { - getPrompt, - getPrompts, - PromptContentResponse, - Template, - resetPrompt, - savePrompt, -} from '../../api'; + acpGetPrompt, + acpListPrompts, + acpResetPrompt, + acpSavePrompt, + type PromptContent, + type PromptTemplate, +} from '../../acp/prompts'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Button } from '../ui/button'; import { AlertTriangle, RotateCcw, ArrowLeft } from 'lucide-react'; @@ -24,7 +24,8 @@ const i18n = defineMessages({ }, confirmResetAll: { id: 'promptsSettings.confirmResetAll', - defaultMessage: 'Are you sure you want to reset all prompts to their defaults? This cannot be undone.', + defaultMessage: + 'Are you sure you want to reset all prompts to their defaults? This cannot be undone.', }, allPromptsReset: { id: 'promptsSettings.allPromptsReset', @@ -44,7 +45,8 @@ const i18n = defineMessages({ }, confirmResetOne: { id: 'promptsSettings.confirmResetOne', - defaultMessage: 'Are you sure you want to reset this prompt to its default? This cannot be undone.', + defaultMessage: + 'Are you sure you want to reset this prompt to its default? This cannot be undone.', }, promptResetToDefault: { id: 'promptsSettings.promptResetToDefault', @@ -84,7 +86,8 @@ const i18n = defineMessages({ }, templateTip: { id: 'promptsSettings.templateTip', - defaultMessage: 'Template variables like {extensionsExample} or {forExample} are replaced with actual values at runtime. Be careful not to remove required variables.', + defaultMessage: + 'Template variables like {extensionsExample} or {forExample} are replaced with actual values at runtime. Be careful not to remove required variables.', }, editingLabel: { id: 'promptsSettings.editingLabel', @@ -108,7 +111,8 @@ const i18n = defineMessages({ }, promptEditingDescription: { id: 'promptsSettings.promptEditingDescription', - defaultMessage: "Customize the prompts that define goose's behavior in different contexts. These prompts use Jinja2 templating syntax. Be careful when modifying template variables, as incorrect changes can break functionality. Please share any improvements with the community.", + defaultMessage: + "Customize the prompts that define goose's behavior in different contexts. These prompts use Jinja2 templating syntax. Be careful when modifying template variables, as incorrect changes can break functionality. Please share any improvements with the community.", }, resetAll: { id: 'promptsSettings.resetAll', @@ -122,18 +126,16 @@ const i18n = defineMessages({ export default function PromptsSettingsSection() { const intl = useIntl(); - const [prompts, setPrompts] = useState([]); + const [prompts, setPrompts] = useState([]); const [selectedPrompt, setSelectedPrompt] = useState(null); - const [promptData, setPromptData] = useState(null); + const [promptData, setPromptData] = useState(null); const [content, setContent] = useState(''); const [hasChanges, setHasChanges] = useState(false); const fetchPrompts = useCallback(async () => { try { - const response = await getPrompts(); - if (response.data) { - setPrompts(response.data.prompts); - } + const prompts = await acpListPrompts(); + setPrompts(prompts); } catch (error) { console.error('Failed to fetch prompts:', error); toast.error(intl.formatMessage(i18n.failedToLoadPrompts)); @@ -148,11 +150,9 @@ export default function PromptsSettingsSection() { if (selectedPrompt) { const fetchPrompt = async () => { try { - const response = await getPrompt({ path: { name: selectedPrompt } }); - if (response.data) { - setPromptData(response.data); - setContent(response.data.content); - } + const prompt = await acpGetPrompt(selectedPrompt); + setPromptData(prompt); + setContent(prompt.content); } catch (error) { console.error('Failed to fetch prompt:', error); toast.error(intl.formatMessage(i18n.failedToLoadPrompt)); @@ -169,18 +169,14 @@ export default function PromptsSettingsSection() { }, [content, promptData]); const handleResetAll = async () => { - if ( - !window.confirm( - intl.formatMessage(i18n.confirmResetAll) - ) - ) { + if (!window.confirm(intl.formatMessage(i18n.confirmResetAll))) { return; } try { - const customizedPrompts = prompts.filter((p) => p.is_customized); + const customizedPrompts = prompts.filter((p) => p.isCustomized); for (const prompt of customizedPrompts) { - await resetPrompt({ path: { name: prompt.name } }); + await acpResetPrompt(prompt.name); } toast.success(intl.formatMessage(i18n.allPromptsReset)); fetchPrompts(); @@ -193,12 +189,9 @@ export default function PromptsSettingsSection() { const handleSave = async () => { if (!selectedPrompt) return; try { - await savePrompt({ - path: { name: selectedPrompt }, - body: { content }, - }); + await acpSavePrompt(selectedPrompt, content); toast.success(intl.formatMessage(i18n.promptSaved)); - setPromptData((prev) => (prev ? { ...prev, content, is_customized: true } : null)); + setPromptData((prev) => (prev ? { ...prev, content, isCustomized: true } : null)); fetchPrompts(); } catch (error) { console.error('Failed to save prompt:', error); @@ -208,19 +201,15 @@ export default function PromptsSettingsSection() { const handleReset = async () => { if (!selectedPrompt) return; - if ( - !window.confirm( - intl.formatMessage(i18n.confirmResetOne) - ) - ) { + if (!window.confirm(intl.formatMessage(i18n.confirmResetOne))) { return; } try { - await resetPrompt({ path: { name: selectedPrompt } }); + await acpResetPrompt(selectedPrompt); if (promptData) { - setContent(promptData.default_content); - setPromptData({ ...promptData, content: promptData.default_content, is_customized: false }); + setContent(promptData.defaultContent); + setPromptData({ ...promptData, content: promptData.defaultContent, isCustomized: false }); } fetchPrompts(); toast.success(intl.formatMessage(i18n.promptResetToDefault)); @@ -237,7 +226,7 @@ export default function PromptsSettingsSection() { return; } } - setContent(promptData.default_content); + setContent(promptData.defaultContent); } }; @@ -252,7 +241,7 @@ export default function PromptsSettingsSection() { setContent(''); }; - const hasCustomizedPrompts = prompts.some((p) => p.is_customized); + const hasCustomizedPrompts = prompts.some((p) => p.isCustomized); if (selectedPrompt) { return ( @@ -270,7 +259,7 @@ export default function PromptsSettingsSection() { {intl.formatMessage(i18n.backToList)}
- {promptData?.is_customized && ( + {promptData?.isCustomized && (
- {intl.formatMessage(i18n.editPromptTitle, { name: selectedPrompt })} - {promptData?.is_customized && ( + + {intl.formatMessage(i18n.editPromptTitle, { name: selectedPrompt })} + + {promptData?.isCustomized && ( {intl.formatMessage(i18n.customized)} @@ -307,8 +298,10 @@ export default function PromptsSettingsSection() {
- - {promptData?.is_customized && content !== promptData.default_content && ( + + {promptData?.isCustomized && content !== promptData.defaultContent && (