lash_remote_protocol/protocol/
turn_result.rs1#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
2#[serde(tag = "type", rename_all = "snake_case")]
3pub enum RemoteCausalRef {
4 Turn {
5 session_id: String,
6 turn_id: String,
7 },
8 Effect {
9 session_id: String,
10 #[serde(default, skip_serializing_if = "Option::is_none")]
11 turn_id: Option<String>,
12 effect_id: String,
13 },
14 ToolCall {
15 session_id: String,
16 call_id: String,
17 },
18 Process {
19 process_id: String,
20 },
21 ProcessEvent {
22 process_id: String,
23 sequence: u64,
24 },
25 TriggerOccurrence {
26 occurrence_id: String,
27 },
28 SessionNode {
29 session_id: String,
30 node_id: String,
31 },
32}
33
34#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
35#[serde(rename_all = "snake_case")]
36pub enum RemoteTurnStatus {
37 #[default]
38 Completed,
39 Failed,
40 Cancelled,
41 InProgress,
42}
43
44#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
45#[serde(tag = "type", rename_all = "snake_case")]
46pub enum RemoteTurnOutcome {
47 Finished { finish: RemoteTurnFinish },
48 AgentFrameSwitch { frame_id: String, task: String },
49 Stopped { stop: RemoteTurnStop },
50}
51
52impl Default for RemoteTurnOutcome {
53 fn default() -> Self {
54 Self::Stopped {
55 stop: RemoteTurnStop::Incomplete,
56 }
57 }
58}
59
60#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
61#[serde(tag = "type", rename_all = "snake_case")]
62pub enum RemoteTurnFinish {
63 AssistantMessage {
64 text: String,
65 },
66 SubmittedValue {
67 value: serde_json::Value,
68 },
69 ToolValue {
70 tool_name: String,
71 value: serde_json::Value,
72 },
73}
74
75#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
76#[serde(tag = "type", rename_all = "snake_case")]
77pub enum RemoteTurnStop {
78 Cancelled,
79 Incomplete,
80 InvalidInput,
81 MaxTurns,
82 ToolFailure,
83 ProviderError,
84 PluginAbort,
85 RuntimeError,
86 SubmittedError {
87 value: serde_json::Value,
88 },
89 ToolError {
90 tool_name: String,
91 value: serde_json::Value,
92 },
93}
94
95#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
96pub struct RemoteAssistantOutput {
97 #[serde(default)]
98 pub safe_text: String,
99 #[serde(default)]
100 pub raw_text: String,
101 #[serde(default)]
102 pub state: RemoteAssistantOutputState,
103}
104
105#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
106#[serde(rename_all = "snake_case")]
107pub enum RemoteAssistantOutputState {
108 #[default]
109 Usable,
110 EmptyOutput,
111 TracebackOnly,
112 RecoveredFromError,
113}
114
115#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
116pub struct RemoteTurnUsageSummary {
117 #[serde(default)]
118 pub parent: RemoteUsage,
119 #[serde(default, skip_serializing_if = "Vec::is_empty")]
120 pub children: Vec<RemoteTokenLedgerEntry>,
121 #[serde(default)]
122 pub total: RemoteUsage,
123}
124
125#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
126pub struct RemoteExecutionSummary {
127 #[serde(default)]
128 pub had_tool_calls: bool,
129 #[serde(default)]
130 pub had_code_execution: bool,
131}
132
133#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
134pub struct RemoteToolCallSummary {
135 #[serde(default, skip_serializing_if = "Option::is_none")]
136 pub call_id: Option<String>,
137 pub tool_name: String,
138 #[serde(default)]
139 pub args: serde_json::Value,
140 pub outcome: RemoteToolCallOutcome,
141 pub duration_ms: u64,
142}
143
144#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
145#[serde(tag = "status", content = "payload", rename_all = "snake_case")]
146pub enum RemoteToolCallOutcome {
147 Success(serde_json::Value),
148 Failure(serde_json::Value),
149 Cancelled(serde_json::Value),
150}
151
152#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)]
153pub struct RemoteTurnIssue {
154 pub kind: String,
155 #[serde(default, skip_serializing_if = "Option::is_none")]
156 pub code: Option<String>,
157 #[serde(default, skip_serializing_if = "Option::is_none")]
158 pub terminal_reason: Option<RemoteLlmTerminalReason>,
159 pub message: String,
160 #[serde(default, skip_serializing_if = "Option::is_none")]
161 pub raw: Option<String>,
162}