codetether_agent/tui/app/
settings.rs1use crate::session::Session;
2use crate::tui::app::commands::set_auto_apply_edits;
3use crate::tui::app::state::App;
4
5fn on_off_label(enabled: bool) -> &'static str {
6 if enabled { "ON" } else { "OFF" }
7}
8
9pub fn network_access_status_message(enabled: bool) -> String {
10 format!("TUI network access: {}", on_off_label(enabled))
11}
12
13pub async fn set_network_access(app: &mut App, session: &mut Session, next: bool) {
14 app.state.allow_network = next;
15 session.metadata.allow_network = next;
16
17 if next {
18 unsafe {
19 std::env::set_var("CODETETHER_SANDBOX_BASH_ALLOW_NETWORK", "1");
20 }
21 } else {
22 unsafe {
23 std::env::remove_var("CODETETHER_SANDBOX_BASH_ALLOW_NETWORK");
24 }
25 }
26
27 match session.save().await {
28 Ok(()) => {
29 app.state.status = network_access_status_message(next);
30 }
31 Err(error) => {
32 app.state.status = format!(
33 "{} (not persisted: {error})",
34 network_access_status_message(next)
35 );
36 }
37 }
38}
39
40pub async fn toggle_network_access(app: &mut App, session: &mut Session) {
41 set_network_access(app, session, !app.state.allow_network).await;
42}
43
44pub fn autocomplete_status_message(enabled: bool) -> String {
45 format!("TUI slash autocomplete: {}", on_off_label(enabled))
46}
47
48pub async fn set_slash_autocomplete(app: &mut App, session: &mut Session, next: bool) {
49 app.state.slash_autocomplete = next;
50 session.metadata.slash_autocomplete = next;
51
52 match session.save().await {
53 Ok(()) => {
54 app.state.status = autocomplete_status_message(next);
55 }
56 Err(error) => {
57 app.state.status = format!(
58 "{} (not persisted: {error})",
59 autocomplete_status_message(next)
60 );
61 }
62 }
63}
64
65pub async fn toggle_slash_autocomplete(app: &mut App, session: &mut Session) {
66 set_slash_autocomplete(app, session, !app.state.slash_autocomplete).await;
67}
68
69pub fn worktree_status_message(enabled: bool) -> String {
70 format!("TUI worktree isolation: {}", on_off_label(enabled))
71}
72
73pub async fn set_use_worktree(app: &mut App, session: &mut Session, next: bool) {
74 app.state.use_worktree = next;
75 session.metadata.use_worktree = next;
76
77 match session.save().await {
78 Ok(()) => {
79 app.state.status = worktree_status_message(next);
80 }
81 Err(error) => {
82 app.state.status =
83 format!("{} (not persisted: {error})", worktree_status_message(next));
84 }
85 }
86}
87
88pub async fn toggle_selected_setting(app: &mut App, session: &mut Session) {
89 match app.state.selected_settings_index {
90 0 => set_auto_apply_edits(app, session, !app.state.auto_apply_edits).await,
91 1 => set_network_access(app, session, !app.state.allow_network).await,
92 2 => set_slash_autocomplete(app, session, !app.state.slash_autocomplete).await,
93 3 => set_use_worktree(app, session, !app.state.use_worktree).await,
94 _ => {}
95 }
96}