Skip to content

Commit 471feae

Browse files
committed
adds content extraction logic for legacy mode
1 parent 4f52090 commit 471feae

File tree

4 files changed

+280
-26
lines changed

4 files changed

+280
-26
lines changed

crates/chat-cli-ui/src/conduit.rs

Lines changed: 259 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use std::io::Write as _;
22
use std::marker::PhantomData;
33

4+
use crossterm::execute;
5+
use crossterm::style::Print;
6+
47
use crate::protocol::{
58
Event,
69
LegacyPassThroughOutput,
@@ -40,8 +43,8 @@ impl ViewEnd {
4043
mut stdout: std::io::Stdout,
4144
) -> Result<(), ConduitError> {
4245
while let Ok(event) = self.receiver.recv() {
43-
if let Event::LegacyPassThrough(content) = event {
44-
match content {
46+
match event {
47+
Event::LegacyPassThrough(content) => match content {
4548
LegacyPassThroughOutput::Stderr(content) => {
4649
stderr.write_all(&content)?;
4750
stderr.flush()?;
@@ -50,7 +53,260 @@ impl ViewEnd {
5053
stdout.write_all(&content)?;
5154
stdout.flush()?;
5255
},
53-
}
56+
},
57+
Event::RunStarted(run_started) => {
58+
let _ = execute!(
59+
stderr,
60+
Print(format!(
61+
"Run started - Thread: {}, Run: {}\n",
62+
run_started.thread_id, run_started.run_id
63+
))
64+
);
65+
},
66+
Event::RunFinished(run_finished) => {
67+
let result_info = run_finished
68+
.result
69+
.as_ref()
70+
.map(|r| format!(" with result: {:?}", r))
71+
.unwrap_or_default();
72+
let _ = execute!(
73+
stderr,
74+
Print(format!(
75+
"Run finished - Thread: {}, Run: {}{}\n",
76+
run_finished.thread_id, run_finished.run_id, result_info
77+
))
78+
);
79+
},
80+
Event::RunError(run_error) => {
81+
let code_info = run_error
82+
.code
83+
.as_ref()
84+
.map(|c| format!(" (Code: {})", c))
85+
.unwrap_or_default();
86+
let _ = execute!(
87+
stderr,
88+
Print(format!("Run error{}: {}\n", code_info, run_error.message))
89+
);
90+
},
91+
Event::StepStarted(step_started) => {
92+
let _ = execute!(stderr, Print(format!("Step started: {}\n", step_started.step_name)));
93+
},
94+
Event::StepFinished(step_finished) => {
95+
let _ = execute!(stderr, Print(format!("Step finished: {}\n", step_finished.step_name)));
96+
},
97+
Event::TextMessageStart(text_message_start) => {
98+
let _ = execute!(
99+
stderr,
100+
Print(format!(
101+
"Text message started - ID: {}, Role: {:?}\n",
102+
text_message_start.message_id, text_message_start.role
103+
))
104+
);
105+
},
106+
Event::TextMessageContent(text_message_content) => {
107+
let _ = execute!(
108+
stderr,
109+
Print(format!(
110+
"Text content ({}): {}\n",
111+
text_message_content.message_id, text_message_content.delta
112+
))
113+
);
114+
},
115+
Event::TextMessageEnd(text_message_end) => {
116+
let _ = execute!(
117+
stderr,
118+
Print(format!("Text message ended - ID: {}\n", text_message_end.message_id))
119+
);
120+
},
121+
Event::TextMessageChunk(text_message_chunk) => {
122+
let message_id = text_message_chunk
123+
.message_id
124+
.as_ref()
125+
.map(|id| format!(" ID: {}", id))
126+
.unwrap_or_default();
127+
let role = text_message_chunk
128+
.role
129+
.as_ref()
130+
.map(|r| format!(" Role: {:?}", r))
131+
.unwrap_or_default();
132+
let delta = text_message_chunk
133+
.delta
134+
.as_ref()
135+
.map(|d| format!(" Content: {}", d))
136+
.unwrap_or_default();
137+
let _ = execute!(
138+
stderr,
139+
Print(format!("Text message chunk{}{}{}\n", message_id, role, delta))
140+
);
141+
},
142+
Event::ToolCallStart(tool_call_start) => {
143+
let parent_info = tool_call_start
144+
.parent_message_id
145+
.as_ref()
146+
.map(|p| format!(" (Parent: {})", p))
147+
.unwrap_or_default();
148+
let _ = execute!(
149+
stderr,
150+
Print(format!(
151+
"Tool call started - ID: {}, Tool: {}{}\n",
152+
tool_call_start.tool_call_id, tool_call_start.tool_call_name, parent_info
153+
))
154+
);
155+
},
156+
Event::ToolCallArgs(tool_call_args) => {
157+
let _ = execute!(
158+
stderr,
159+
Print(format!(
160+
"Tool call args ({}): {}\n",
161+
tool_call_args.tool_call_id, tool_call_args.delta
162+
))
163+
);
164+
},
165+
Event::ToolCallEnd(tool_call_end) => {
166+
let _ = execute!(
167+
stderr,
168+
Print(format!("Tool call ended - ID: {}\n", tool_call_end.tool_call_id))
169+
);
170+
},
171+
Event::ToolCallResult(tool_call_result) => {
172+
let role_info = tool_call_result
173+
.role
174+
.as_ref()
175+
.map(|r| format!(" Role: {:?}", r))
176+
.unwrap_or_default();
177+
let _ = execute!(
178+
stderr,
179+
Print(format!(
180+
"Tool call result - Message: {}, Tool: {}{}\nContent: {}\n",
181+
tool_call_result.message_id,
182+
tool_call_result.tool_call_id,
183+
role_info,
184+
tool_call_result.content
185+
))
186+
);
187+
},
188+
Event::StateSnapshot(state_snapshot) => {
189+
let _ = execute!(
190+
stderr,
191+
Print(format!("State snapshot: {:?}\n", state_snapshot.snapshot))
192+
);
193+
},
194+
Event::StateDelta(state_delta) => {
195+
let _ = execute!(stderr, Print(format!("State delta: {:?}\n", state_delta.delta)));
196+
},
197+
Event::MessagesSnapshot(messages_snapshot) => {
198+
let _ = execute!(
199+
stderr,
200+
Print(format!(
201+
"Messages snapshot: {} messages\n",
202+
messages_snapshot.messages.len()
203+
))
204+
);
205+
},
206+
Event::Raw(raw) => {
207+
let source_info = raw.source.as_ref().map(|s| format!(" from {}", s)).unwrap_or_default();
208+
let _ = execute!(stderr, Print(format!("Raw event{}: {:?}\n", source_info, raw.event)));
209+
},
210+
Event::Custom(custom) => {
211+
let _ = execute!(
212+
stderr,
213+
Print(format!(
214+
"Custom event - Name: {}, Value: {:?}\n",
215+
custom.name, custom.value
216+
))
217+
);
218+
},
219+
Event::ActivitySnapshotEvent(activity_snapshot_event) => {
220+
let _ = execute!(
221+
stderr,
222+
Print(format!(
223+
"Activity snapshot - Message: {}, Type: {}, Content: {:?}\n",
224+
activity_snapshot_event.message_id,
225+
activity_snapshot_event.activity_type,
226+
activity_snapshot_event.content
227+
))
228+
);
229+
},
230+
Event::ActivityDeltaEvent(activity_delta_event) => {
231+
let _ = execute!(
232+
stderr,
233+
Print(format!(
234+
"Activity delta - Message: {}, Type: {}, Patch: {:?}\n",
235+
activity_delta_event.message_id,
236+
activity_delta_event.activity_type,
237+
activity_delta_event.patch
238+
))
239+
);
240+
},
241+
Event::ReasoningStart(reasoning_start) => {
242+
if let Some(info) = reasoning_start.encrypted_content.as_deref() {
243+
let _ = execute!(
244+
stderr,
245+
Print(format!(
246+
"Reasoning started - Message: {}{}\n",
247+
reasoning_start.message_id, info
248+
))
249+
);
250+
}
251+
},
252+
Event::ReasoningMessageStart(reasoning_message_start) => {
253+
let _ = execute!(
254+
stderr,
255+
Print(format!(
256+
"Reasoning message started - ID: {}, Role: {:?}\n",
257+
reasoning_message_start.message_id, reasoning_message_start.role
258+
))
259+
);
260+
},
261+
Event::ReasoningMessageContent(reasoning_message_content) => {
262+
let _ = execute!(
263+
stderr,
264+
Print(format!(
265+
"Reasoning content ({}): {}\n",
266+
reasoning_message_content.message_id, reasoning_message_content.delta
267+
))
268+
);
269+
},
270+
Event::ReasoningMessageEnd(reasoning_message_end) => {
271+
let _ = execute!(
272+
stderr,
273+
Print(format!(
274+
"Reasoning message ended - ID: {}\n",
275+
reasoning_message_end.message_id
276+
))
277+
);
278+
},
279+
Event::ReasoningMessageChunk(reasoning_message_chunk) => {
280+
let message_id = reasoning_message_chunk
281+
.message_id
282+
.as_ref()
283+
.map(|id| format!(" ID: {}", id))
284+
.unwrap_or_default();
285+
let delta = reasoning_message_chunk
286+
.delta
287+
.as_ref()
288+
.map(|d| format!(" Content: {}", d))
289+
.unwrap_or_default();
290+
let _ = execute!(
291+
stderr,
292+
Print(format!("Reasoning message chunk{}{}\n", message_id, delta))
293+
);
294+
},
295+
Event::ReasoningEnd(reasoning_end) => {
296+
let _ = execute!(
297+
stderr,
298+
Print(format!("Reasoning ended - Message: {}\n", reasoning_end.message_id))
299+
);
300+
},
301+
Event::MetaEvent(meta_event) => {
302+
let _ = execute!(
303+
stderr,
304+
Print(format!(
305+
"Meta event - Type: {}, Payload: {:?}\n",
306+
meta_event.meta_type, meta_event.payload
307+
))
308+
);
309+
},
54310
}
55311
}
56312

crates/chat-cli-ui/src/ui.rs

Whitespace-only changes.

crates/chat-cli/src/cli/chat/mod.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -192,29 +192,6 @@ use crate::util::{
192192
ui,
193193
};
194194

195-
const LIMIT_REACHED_TEXT: &str = color_print::cstr! { "You've used all your free requests for this month. You have two options:
196-
1. Upgrade to a paid subscription for increased limits. See our Pricing page for what's included> <blue!>https://aws.amazon.com/q/developer/pricing/</blue!>
197-
2. Wait until next month when your limit automatically resets." };
198-
199-
pub const EXTRA_HELP: &str = color_print::cstr! {"
200-
<cyan,em>MCP:</cyan,em>
201-
<black!>You can now configure the Amazon Q CLI to use MCP servers. \nLearn how: https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/qdev-mcp.html</black!>
202-
203-
<cyan,em>Tips:</cyan,em>
204-
<em>!{command}</em> <black!>Quickly execute a command in your current session</black!>
205-
<em>Ctrl(^) + j</em> <black!>Insert new-line to provide multi-line prompt</black!>
206-
<black!>Alternatively, [Alt(⌥) + Enter(⏎)]</black!>
207-
<em>Ctrl(^) + s</em> <black!>Fuzzy search commands and context files</black!>
208-
<black!>Use Tab to select multiple items</black!>
209-
<black!>Change the keybind using: q settings chat.skimCommandKey x</black!>
210-
<em>Ctrl(^) + t</em> <black!>Toggle tangent mode for isolated conversations</black!>
211-
<black!>Change the keybind using: q settings chat.tangentModeKey x</black!>
212-
<em>Ctrl(^) + d</em> <black!>Start delegate command for task delegation</black!>
213-
<black!>Change the keybind using: q settings chat.delegateModeKey x</black!>
214-
<em>chat.editMode</em> <black!>The prompt editing mode (vim or emacs)</black!>
215-
<black!>Change using: q settings chat.skimCommandKey x</black!>
216-
"};
217-
218195
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
219196
pub enum WrapMode {
220197
/// Always wrap at terminal width

crates/chat-cli/src/util/ui.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@ use crossterm::style::{
66
Attribute,
77
};
88
use eyre::Result;
9+
use serde::{
10+
Deserialize,
11+
Serialize,
12+
};
913

1014
use crate::cli::feed::Feed;
1115
use crate::constants::ui_text;
16+
use crate::database::settings::Setting;
17+
use crate::os::Os;
1218
use crate::theme::StyledText;
1319

1420
/// Render changelog content from feed.json with manual formatting
@@ -151,3 +157,18 @@ fn print_with_bold(output: &mut impl Write, segments: &[(String, bool)]) -> Resu
151157
}
152158
Ok(())
153159
}
160+
161+
#[derive(Default, Debug, Serialize, Deserialize)]
162+
#[serde(rename_all = "camelCase")]
163+
pub enum UiMode {
164+
#[default]
165+
Structured,
166+
Passthrough,
167+
New,
168+
}
169+
170+
pub fn should_send_structured_message(os: &Os) -> bool {
171+
let ui_mode = os.database.settings.get_string(Setting::UiMode);
172+
173+
ui_mode.as_deref().is_some_and(|mode| mode == "structured")
174+
}

0 commit comments

Comments
 (0)