@@ -5,7 +5,9 @@ mod session;
5
5
6
6
pub use self :: agent:: { list_agents, Agent } ;
7
7
pub use self :: input:: Input ;
8
- pub use self :: role:: { Role , RoleLike , CODE_ROLE , EXPLAIN_SHELL_ROLE , SHELL_ROLE } ;
8
+ pub use self :: role:: {
9
+ Role , RoleLike , CODE_ROLE , CREATE_TITLE_ROLE , EXPLAIN_SHELL_ROLE , SHELL_ROLE ,
10
+ } ;
9
11
use self :: session:: Session ;
10
12
11
13
use crate :: client:: {
@@ -37,6 +39,10 @@ use std::{
37
39
} ;
38
40
use syntect:: highlighting:: ThemeSet ;
39
41
42
+ pub const TEMP_ROLE_NAME : & str = "%%" ;
43
+ pub const TEMP_RAG_NAME : & str = "temp" ;
44
+ pub const TEMP_SESSION_NAME : & str = "temp" ;
45
+
40
46
/// Monokai Extended
41
47
const DARK_THEME : & [ u8 ] = include_bytes ! ( "../../assets/monokai-extended.theme.bin" ) ;
42
48
const LIGHT_THEME : & [ u8 ] = include_bytes ! ( "../../assets/monokai-extended-light.theme.bin" ) ;
@@ -52,10 +58,6 @@ const FUNCTIONS_FILE_NAME: &str = "functions.json";
52
58
const FUNCTIONS_BIN_DIR_NAME : & str = "bin" ;
53
59
const AGENTS_DIR_NAME : & str = "agents" ;
54
60
55
- pub const TEMP_ROLE_NAME : & str = "%%" ;
56
- pub const TEMP_RAG_NAME : & str = "temp" ;
57
- pub const TEMP_SESSION_NAME : & str = "temp" ;
58
-
59
61
const CLIENTS_FIELD : & str = "clients" ;
60
62
61
63
const SERVE_ADDR : & str = "127.0.0.1:8000" ;
@@ -339,7 +341,10 @@ impl Config {
339
341
}
340
342
341
343
pub fn session_file ( & self , name : & str ) -> PathBuf {
342
- self . sessions_dir ( ) . join ( format ! ( "{name}.yaml" ) )
344
+ match name. split_once ( "/" ) {
345
+ Some ( ( dir, name) ) => self . sessions_dir ( ) . join ( dir) . join ( format ! ( "{name}.yaml" ) ) ,
346
+ None => self . sessions_dir ( ) . join ( format ! ( "{name}.yaml" ) ) ,
347
+ }
343
348
}
344
349
345
350
pub fn rag_file ( & self , name : & str ) -> PathBuf {
@@ -1081,7 +1086,10 @@ impl Config {
1081
1086
let session_name = match & self . session {
1082
1087
Some ( session) => match name {
1083
1088
Some ( v) => v. to_string ( ) ,
1084
- None => session. name ( ) . to_string ( ) ,
1089
+ None => session
1090
+ . autoname ( )
1091
+ . unwrap_or_else ( || session. name ( ) )
1092
+ . to_string ( ) ,
1085
1093
} ,
1086
1094
None => bail ! ( "No session" ) ,
1087
1095
} ;
@@ -1124,9 +1132,9 @@ impl Config {
1124
1132
Ok ( ( ) )
1125
1133
}
1126
1134
1127
- pub fn set_append_conversation ( & mut self ) -> Result < ( ) > {
1135
+ pub fn set_save_session_this_time ( & mut self ) -> Result < ( ) > {
1128
1136
if let Some ( session) = self . session . as_mut ( ) {
1129
- session. set_append_conversation ( ) ;
1137
+ session. set_save_session_this_time ( ) ;
1130
1138
} else {
1131
1139
bail ! ( "No session" )
1132
1140
}
@@ -1137,14 +1145,42 @@ impl Config {
1137
1145
list_file_names ( self . sessions_dir ( ) , ".yaml" )
1138
1146
}
1139
1147
1140
- pub fn should_compress_session ( & mut self ) -> bool {
1141
- if let Some ( session) = self . session . as_mut ( ) {
1142
- if session. need_compress ( self . compress_threshold ) {
1143
- session. set_compressing ( true ) ;
1144
- return true ;
1148
+ pub fn list_autoname_sessions ( & self ) -> Vec < String > {
1149
+ list_file_names ( self . sessions_dir ( ) . join ( "_" ) , ".yaml" )
1150
+ }
1151
+
1152
+ pub fn maybe_compress_session ( config : GlobalConfig ) {
1153
+ let mut need_compress = false ;
1154
+ {
1155
+ let mut config = config. write ( ) ;
1156
+ let compress_threshold = config. compress_threshold ;
1157
+ if let Some ( session) = config. session . as_mut ( ) {
1158
+ if session. need_compress ( compress_threshold) {
1159
+ session. set_compressing ( true ) ;
1160
+ need_compress = true ;
1161
+ }
1145
1162
}
1163
+ } ;
1164
+ if !need_compress {
1165
+ return ;
1146
1166
}
1147
- false
1167
+ let color = if config. read ( ) . light_theme {
1168
+ nu_ansi_term:: Color :: LightGray
1169
+ } else {
1170
+ nu_ansi_term:: Color :: DarkGray
1171
+ } ;
1172
+ print ! (
1173
+ "\n 📢 {}\n " ,
1174
+ color. italic( ) . paint( "Compressing the session." ) ,
1175
+ ) ;
1176
+ tokio:: spawn ( async move {
1177
+ if let Err ( err) = Config :: compress_session ( & config) . await {
1178
+ warn ! ( "Failed to compress the session: {err}" ) ;
1179
+ }
1180
+ if let Some ( session) = config. write ( ) . session . as_mut ( ) {
1181
+ session. set_compressing ( false ) ;
1182
+ }
1183
+ } ) ;
1148
1184
}
1149
1185
1150
1186
pub async fn compress_session ( config : & GlobalConfig ) -> Result < ( ) > {
@@ -1156,7 +1192,13 @@ impl Config {
1156
1192
}
1157
1193
None => bail ! ( "No session" ) ,
1158
1194
}
1159
- let input = Input :: from_str ( config, config. read ( ) . summarize_prompt ( ) , None ) ;
1195
+
1196
+ let prompt = config
1197
+ . read ( )
1198
+ . summarize_prompt
1199
+ . clone ( )
1200
+ . unwrap_or_else ( || SUMMARIZE_PROMPT . into ( ) ) ;
1201
+ let input = Input :: from_str ( config, & prompt, None ) ;
1160
1202
let client = input. create_client ( ) ?;
1161
1203
let summary = client. chat_completions ( input) . await ?. text ;
1162
1204
let summary_prompt = config
@@ -1171,21 +1213,58 @@ impl Config {
1171
1213
Ok ( ( ) )
1172
1214
}
1173
1215
1174
- pub fn summarize_prompt ( & self ) -> & str {
1175
- self . summarize_prompt . as_deref ( ) . unwrap_or ( SUMMARIZE_PROMPT )
1176
- }
1177
-
1178
1216
pub fn is_compressing_session ( & self ) -> bool {
1179
1217
self . session
1180
1218
. as_ref ( )
1181
1219
. map ( |v| v. compressing ( ) )
1182
1220
. unwrap_or_default ( )
1183
1221
}
1184
1222
1185
- pub fn end_compressing_session ( & mut self ) {
1186
- if let Some ( session) = self . session . as_mut ( ) {
1187
- session. set_compressing ( false ) ;
1223
+ pub fn maybe_autoname_session ( config : GlobalConfig ) {
1224
+ let mut need_autoname = false ;
1225
+ if let Some ( session) = config. write ( ) . session . as_mut ( ) {
1226
+ if session. need_autoname ( ) {
1227
+ session. set_autonaming ( true ) ;
1228
+ need_autoname = true ;
1229
+ }
1230
+ }
1231
+ if !need_autoname {
1232
+ return ;
1233
+ }
1234
+ let color = if config. read ( ) . light_theme {
1235
+ nu_ansi_term:: Color :: LightGray
1236
+ } else {
1237
+ nu_ansi_term:: Color :: DarkGray
1238
+ } ;
1239
+ print ! ( "\n 📢 {}\n " , color. italic( ) . paint( "Autonaming the session." ) , ) ;
1240
+ tokio:: spawn ( async move {
1241
+ if let Err ( err) = Config :: autoname_session ( & config) . await {
1242
+ warn ! ( "Failed to autonaming the session: {err}" ) ;
1243
+ }
1244
+ if let Some ( session) = config. write ( ) . session . as_mut ( ) {
1245
+ session. set_autonaming ( false ) ;
1246
+ }
1247
+ } ) ;
1248
+ }
1249
+
1250
+ pub async fn autoname_session ( config : & GlobalConfig ) -> Result < ( ) > {
1251
+ let text = match config
1252
+ . read ( )
1253
+ . session
1254
+ . as_ref ( )
1255
+ . and_then ( |v| v. chat_history_for_autonaming ( ) )
1256
+ {
1257
+ Some ( v) => v,
1258
+ None => bail ! ( "No chat history" ) ,
1259
+ } ;
1260
+ let role = config. read ( ) . retrieve_role ( CREATE_TITLE_ROLE ) ?;
1261
+ let input = Input :: from_str ( config, & text, Some ( role) ) ;
1262
+ let client = input. create_client ( ) ?;
1263
+ let text = client. chat_completions ( input) . await ?. text ;
1264
+ if let Some ( session) = config. write ( ) . session . as_mut ( ) {
1265
+ session. set_autoname ( & text) ;
1188
1266
}
1267
+ Ok ( ( ) )
1189
1268
}
1190
1269
1191
1270
pub async fn use_rag (
@@ -1562,7 +1641,19 @@ impl Config {
1562
1641
. into_iter ( )
1563
1642
. map ( |v| ( v. id ( ) , Some ( v. description ( ) ) ) )
1564
1643
. collect ( ) ,
1565
- ".session" => map_completion_values ( self . list_sessions ( ) ) ,
1644
+ ".session" => {
1645
+ if args[ 0 ] . starts_with ( "_/" ) {
1646
+ map_completion_values (
1647
+ self . list_autoname_sessions ( )
1648
+ . iter ( )
1649
+ . rev ( )
1650
+ . map ( |v| format ! ( "_/{}" , v) )
1651
+ . collect :: < Vec < String > > ( ) ,
1652
+ )
1653
+ } else {
1654
+ map_completion_values ( self . list_sessions ( ) )
1655
+ }
1656
+ }
1566
1657
".rag" => map_completion_values ( Self :: list_rags ( ) ) ,
1567
1658
".agent" => map_completion_values ( list_agents ( ) ) ,
1568
1659
".starter" => match & self . agent {
@@ -1772,6 +1863,9 @@ impl Config {
1772
1863
}
1773
1864
if let Some ( session) = & self . session {
1774
1865
output. insert ( "session" , session. name ( ) . to_string ( ) ) ;
1866
+ if let Some ( autoname) = session. autoname ( ) {
1867
+ output. insert ( "session_autoname" , autoname. to_string ( ) ) ;
1868
+ }
1775
1869
output. insert ( "dirty" , session. dirty ( ) . to_string ( ) ) ;
1776
1870
let ( tokens, percent) = session. tokens_usage ( ) ;
1777
1871
output. insert ( "consume_tokens" , tokens. to_string ( ) ) ;
0 commit comments