Skip to main content

lash_remote_protocol/
prompt.rs

1//! Prompt-layer envelopes: templates, slots, and contributions.
2
3use std::collections::HashMap;
4
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7
8#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
9pub struct RemotePromptLayer {
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    pub template: Option<RemotePromptTemplate>,
12    #[serde(default, skip_serializing_if = "HashMap::is_empty")]
13    pub slots: HashMap<RemotePromptSlot, RemotePromptSlotLayer>,
14}
15
16impl RemotePromptLayer {
17    pub fn new() -> Self {
18        Self::default()
19    }
20
21    pub fn is_empty(&self) -> bool {
22        self.template.is_none() && self.slots.is_empty()
23    }
24}
25
26#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
27#[serde(rename_all = "snake_case")]
28pub enum RemotePromptBuiltin {
29    MainAgentIntro,
30    ExecutionInstructions,
31    CoreGuidance,
32}
33
34#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
35#[serde(rename_all = "snake_case")]
36pub enum RemotePromptSlot {
37    Intro,
38    Execution,
39    Guidance,
40    ProjectInstructions,
41    RuntimeContext,
42    Environment,
43}
44
45#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
46#[serde(tag = "kind", rename_all = "snake_case")]
47pub enum RemotePromptTemplateEntry {
48    Text { content: String },
49    Builtin { builtin: RemotePromptBuiltin },
50    Slot { slot: RemotePromptSlot },
51}
52
53#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
54pub struct RemotePromptTemplateSection {
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub title: Option<String>,
57    #[serde(default, skip_serializing_if = "Vec::is_empty")]
58    pub entries: Vec<RemotePromptTemplateEntry>,
59}
60
61#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
62pub struct RemotePromptTemplate {
63    pub sections: Vec<RemotePromptTemplateSection>,
64}
65
66#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
67pub struct RemotePromptSlotLayer {
68    #[serde(default)]
69    pub reset: bool,
70    #[serde(default, skip_serializing_if = "Vec::is_empty")]
71    pub contributions: Vec<RemotePromptContribution>,
72}
73
74#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
75pub struct RemotePromptContribution {
76    pub slot: RemotePromptSlot,
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub title: Option<String>,
79    #[serde(default)]
80    pub priority: i32,
81    #[serde(
82        default,
83        skip_serializing_if = "RemotePromptContributionGate::is_empty"
84    )]
85    pub gate: RemotePromptContributionGate,
86    pub content: String,
87}
88
89#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
90pub struct RemotePromptContributionGate {
91    #[serde(default, skip_serializing_if = "Vec::is_empty")]
92    pub tools: Vec<String>,
93}
94
95impl RemotePromptContributionGate {
96    pub fn is_empty(&self) -> bool {
97        self.tools.is_empty()
98    }
99}