@@ -4390,6 +4390,23 @@ impl EventLoop {
43904390 self . handle_config_list ( ) ;
43914391 }
43924392
4393+ // === CUSTOM COMMANDS ===
4394+ "commands:list" => {
4395+ self . handle_commands_list ( ) ;
4396+ }
4397+ "agents:list" => {
4398+ self . handle_agents_list ( ) ;
4399+ }
4400+ "init" => {
4401+ self . handle_init ( false ) ;
4402+ }
4403+ "init:force" => {
4404+ self . handle_init ( true ) ;
4405+ }
4406+ "share" => {
4407+ self . handle_share ( None ) . await ;
4408+ }
4409+
43934410 // === PATTERN-MATCHED COMMANDS ===
43944411 _ => {
43954412 // Handle commands with parameters
@@ -4428,9 +4445,14 @@ impl EventLoop {
44284445 self . handle_dump ( file) ?;
44294446 } else if let Some ( expr) = cmd. strip_prefix ( "eval:" ) {
44304447 self . handle_eval ( expr) ;
4448+ } else if let Some ( duration) = cmd. strip_prefix ( "share:" ) {
4449+ self . handle_share ( Some ( duration) ) . await ;
44314450 } else {
44324451 tracing:: debug!( "Unhandled async command: {}" , cmd) ;
4433- self . add_system_message ( & format ! ( "Command not yet implemented: {}" , cmd) ) ;
4452+ // Show as warning toast (orange, no emoji)
4453+ self . app_state
4454+ . toasts
4455+ . warning ( & format ! ( "Command not yet implemented: {}" , cmd) ) ;
44344456 }
44354457 }
44364458 }
@@ -6844,6 +6866,135 @@ impl EventLoop {
68446866 self . add_system_message ( & format ! ( "MCP logs for {}:\n \n (Log viewing not yet implemented. Check ~/.cortex/logs/ for log files.)" , server_name) ) ;
68456867 }
68466868
6869+ // ========================================================================
6870+ // CUSTOM COMMANDS HANDLERS
6871+ // ========================================================================
6872+
6873+ /// Handles the /commands command - lists all custom commands.
6874+ fn handle_commands_list ( & mut self ) {
6875+ use cortex_commands:: builtin:: CommandsCommand ;
6876+
6877+ let cwd = std:: env:: current_dir ( ) . ok ( ) ;
6878+ let cmd = CommandsCommand :: new ( ) ;
6879+
6880+ match cmd. execute ( cwd. as_deref ( ) ) {
6881+ Ok ( result) => {
6882+ let output = cmd. format_result ( & result) ;
6883+ self . add_system_message ( & output) ;
6884+ }
6885+ Err ( e) => {
6886+ self . add_system_message ( & format ! ( "Failed to list commands: {}" , e) ) ;
6887+ }
6888+ }
6889+ }
6890+
6891+ /// Handles the /agents command - lists all custom agents.
6892+ fn handle_agents_list ( & mut self ) {
6893+ use cortex_commands:: builtin:: AgentsCommand ;
6894+
6895+ let cwd = std:: env:: current_dir ( ) . ok ( ) ;
6896+ let cmd = AgentsCommand :: new ( ) ;
6897+
6898+ match cmd. execute ( cwd. as_deref ( ) ) {
6899+ Ok ( result) => {
6900+ let output = cmd. format_result ( & result) ;
6901+ self . add_system_message ( & output) ;
6902+ }
6903+ Err ( e) => {
6904+ self . add_system_message ( & format ! ( "Failed to list agents: {}" , e) ) ;
6905+ }
6906+ }
6907+ }
6908+
6909+ /// Handles the /init command - initializes AGENTS.md.
6910+ fn handle_init ( & mut self , force : bool ) {
6911+ use cortex_commands:: builtin:: { InitCommand , InitResult } ;
6912+
6913+ let cwd = match std:: env:: current_dir ( ) {
6914+ Ok ( path) => path,
6915+ Err ( e) => {
6916+ self . add_system_message ( & format ! ( "Failed to get current directory: {}" , e) ) ;
6917+ return ;
6918+ }
6919+ } ;
6920+
6921+ let cmd = InitCommand :: new ( ) . force ( force) ;
6922+
6923+ match cmd. execute ( & cwd) {
6924+ Ok ( result) => {
6925+ let message: String = result. message ( ) ;
6926+ self . add_system_message ( & message) ;
6927+ match & result {
6928+ InitResult :: Created ( _) => {
6929+ self . app_state . toasts . success ( "AGENTS.md created" ) ;
6930+ }
6931+ InitResult :: AlreadyExists ( _) => {
6932+ self . app_state . toasts . info ( "AGENTS.md already exists" ) ;
6933+ }
6934+ InitResult :: Updated ( _) => {
6935+ self . app_state . toasts . success ( "AGENTS.md updated" ) ;
6936+ }
6937+ }
6938+ }
6939+ Err ( e) => {
6940+ self . add_system_message ( & format ! ( "Failed to initialize: {}" , e) ) ;
6941+ self . app_state . toasts . error ( "Init failed" ) ;
6942+ }
6943+ }
6944+ }
6945+
6946+ /// Handles the /share command - generates a share link for the current session.
6947+ async fn handle_share ( & mut self , duration : Option < & str > ) {
6948+ use cortex_commands:: builtin:: { DEFAULT_SHARE_DURATION , format_duration, parse_duration} ;
6949+
6950+ // Ensure we have an active session
6951+ let Some ( ref session) = self . cortex_session else {
6952+ self . add_system_message ( "No active session to share." ) ;
6953+ self . app_state . toasts . warning ( "No session to share" ) ;
6954+ return ;
6955+ } ;
6956+
6957+ // Parse duration if provided
6958+ let share_duration = match duration {
6959+ Some ( d) => match parse_duration ( d) {
6960+ Ok ( dur) => dur. unwrap_or ( DEFAULT_SHARE_DURATION ) ,
6961+ Err ( e) => {
6962+ self . add_system_message ( & format ! ( "Invalid duration: {}" , e) ) ;
6963+ return ;
6964+ }
6965+ } ,
6966+ None => DEFAULT_SHARE_DURATION ,
6967+ } ;
6968+
6969+ // For now, generate a local share link (actual backend integration would go here)
6970+ let session_id = session. id ( ) ;
6971+ let short_id = if session_id. len ( ) >= 8 {
6972+ & session_id[ ..8 ]
6973+ } else {
6974+ & session_id
6975+ } ;
6976+
6977+ let expires_str = format_duration ( Some ( share_duration) ) ;
6978+
6979+ // TODO: In a real implementation, this would call a backend API to generate a share URL
6980+ // For now, we'll show a placeholder message
6981+ let output = format ! (
6982+ "Share Link Generated:\n \n \
6983+ Session: {}\n \
6984+ Expires: {}\n \n \
6985+ Note: Session sharing requires backend integration.\n \
6986+ The session ID is: {}",
6987+ session. title( ) ,
6988+ expires_str,
6989+ session_id
6990+ ) ;
6991+
6992+ self . add_system_message ( & output) ;
6993+ self . app_state
6994+ . toasts
6995+ . info ( & format ! ( "Share expires in {}" , expires_str) ) ;
6996+ }
6997+
68476998 // ========================================================================
68486999 // DEBUG/SYSTEM COMMAND HANDLERS
68497000 // ========================================================================
0 commit comments