@@ -3946,14 +3946,6 @@ impl LiveCli {
39463946 }
39473947
39483948 fn startup_banner ( & self ) -> String {
3949- let g = "\x1b [38;2;0;255;65m" ; // green
3950- let dg = "\x1b [38;2;0;140;30m" ; // dim green
3951- let b = "\x1b [1m" ; // bold
3952- let d = "\x1b [2m" ; // dim
3953- let r = "\x1b [0m" ; // reset
3954- let sc = "\x1b [38;2;0;255;65m" ; // skull color
3955- let ec = "\x1b [38;2;255;60;60m" ; // eye color
3956-
39573949 let cwd = env:: current_dir ( ) . map_or_else (
39583950 |_| "<unknown>" . to_string ( ) ,
39593951 |path| path. display ( ) . to_string ( ) ,
@@ -3962,101 +3954,40 @@ impl LiveCli {
39623954 let git_branch = status
39633955 . as_ref ( )
39643956 . and_then ( |context| context. git_branch . as_deref ( ) )
3965- . unwrap_or ( "– " ) ;
3957+ . unwrap_or ( "unknown " ) ;
39663958 let workspace = status. as_ref ( ) . map_or_else (
3967- || "–" . to_string ( ) ,
3968- |context| {
3969- let h = context. git_summary . headline ( ) ;
3970- if h. len ( ) > 20 { format ! ( "{}…" , & h[ ..19 ] ) } else { h }
3971- } ,
3959+ || "unknown" . to_string ( ) ,
3960+ |context| context. git_summary . headline ( ) ,
39723961 ) ;
3973-
3974- // Truncate cwd for display
3975- let short_cwd = if cwd. len ( ) > 30 {
3976- let parts: Vec < & str > = cwd. split ( '/' ) . collect ( ) ;
3977- if parts. len ( ) > 3 {
3978- format ! ( "…/{}/{}" , parts[ parts. len( ) - 2 ] , parts[ parts. len( ) - 1 ] )
3979- } else {
3980- format ! ( "…{}" , & cwd[ cwd. len( ) - 29 ..] )
3981- }
3982- } else {
3983- cwd. clone ( )
3984- } ;
3985-
3986- let model_short = if self . model . len ( ) > 22 {
3987- format ! ( "{}…" , & self . model[ ..21 ] )
3988- } else {
3989- self . model . clone ( )
3990- } ;
3991-
3992- let session_short = {
3993- let s = & self . session . id ;
3994- if s. len ( ) > 16 { format ! ( "{}…" , & s[ ..15 ] ) } else { s. clone ( ) }
3995- } ;
3996-
3997- let perm = self . permission_mode . as_str ( ) ;
3998-
3999- // Build banner as a simple two-column box.
4000- // Left column = 26 chars content, Right column = 28 chars content.
4001- // Total inner = 26 + 3 (divider) + 28 = 57 chars.
4002- let w: usize = 59 ; // total inner width (between │ and │)
4003- let lw: usize = 27 ; // left content width
4004- let rw: usize = 28 ; // right content width
4005-
4006- // Helper: pad plain text to width (for non-ANSI content width calculation)
4007- fn rpad ( text : & str , width : usize ) -> String {
4008- if text. len ( ) >= width { text[ ..width] . to_string ( ) }
4009- else { format ! ( "{}{}" , text, " " . repeat( width - text. len( ) ) ) }
4010- }
4011-
4012- // Build each row as: "│ {left_padded} │ {right_padded} │"
4013- // Colors are injected per-cell, reset at cell boundary.
4014- let rows: Vec < String > = vec ! [
4015- // Row 0: welcome + tips header
4016- format!( "{g}│{r} {b}Ready to hack.{r}{} {dg}│{r} {g}{b}Tips{r}{} {g}│{r}" ,
4017- " " . repeat( lw - 16 ) , " " . repeat( rw - 6 ) ) ,
4018- // Row 1: blank + /help
4019- format!( "{g}│{r}{} {dg}│{r} {d}/help{r} commands & usage{} {g}│{r}" ,
4020- " " . repeat( lw) , " " . repeat( rw - 26 ) ) ,
4021- // Row 2: skull line 1 + /tools
4022- format!( "{g}│{r} {sc} ▄▄███▄▄ {r}{} {dg}│{r} {d}/tools{r} security toolkit{} {g}│{r}" ,
4023- " " . repeat( lw - 17 ) , " " . repeat( rw - 27 ) ) ,
4024- // Row 3: skull line 2 (eyes) + Tab
4025- format!( "{g}│{r} {sc}█{ec}▀▀{sc}███{ec}▀▀{sc}█{r}{} {dg}│{r} {d}Tab{r} completions{} {g}│{r}" ,
4026- " " . repeat( lw - 17 ) , " " . repeat( rw - 22 ) ) ,
4027- // Row 4: skull line 3 + blank
4028- format!( "{g}│{r} {sc}██▄███▄██{r}{} {dg}│{r}{} {g}│{r}" ,
4029- " " . repeat( lw - 15 ) , " " . repeat( rw) ) ,
4030- // Row 5: skull line 4 + status header
4031- format!( "{g}│{r} {sc}▀█▀▀▀█▀ {r}{} {dg}│{r} {g}{b}Status{r}{} {g}│{r}" ,
4032- " " . repeat( lw - 17 ) , " " . repeat( rw - 8 ) ) ,
4033- // Row 6: blank + branch
4034- format!( "{g}│{r}{} {dg}│{r} {d}Branch{r} {} {g}│{r}" ,
4035- " " . repeat( lw) , rpad( git_branch, rw - 12 ) ) ,
4036- // Row 7: model + workspace
4037- format!( "{g}│{r} {d}Model{r} {} {dg}│{r} {d}Workspace{r} {} {g}│{r}" ,
4038- rpad( & model_short, lw - 9 ) , rpad( & workspace, rw - 12 ) ) ,
4039- // Row 8: perms + session
4040- format!( "{g}│{r} {d}Perms{r} {} {dg}│{r} {d}Session{r} {} {g}│{r}" ,
4041- rpad( perm, lw - 9 ) , rpad( & session_short, rw - 12 ) ) ,
4042- // Row 9: dir + blank
4043- format!( "{g}│{r} {d}Dir{r} {} {dg}│{r}{} {g}│{r}" ,
4044- rpad( & short_cwd, lw - 9 ) , " " . repeat( rw) ) ,
4045- ] ;
4046-
4047- let title = format ! ( " HackCode v{} " , env!( "CARGO_PKG_VERSION" ) ) ;
4048- let fill = w. saturating_sub ( title. len ( ) + 2 ) ;
4049- let top = format ! ( "{g}╭─{b}{title}{r}{g}{}╮{r}" , "─" . repeat( fill) ) ;
4050- let bottom = format ! ( "{g}╰{}╯{r}" , "─" . repeat( w) ) ;
4051-
4052- let mut out = format ! ( "{top}\n " ) ;
4053- for row in & rows {
4054- out. push_str ( row) ;
4055- out. push ( '\n' ) ;
4056- }
4057- out. push_str ( & bottom) ;
4058- out. push_str ( & format ! ( "\n {dg} >> 100% Local · No Cloud · No Censorship <<{r}" ) ) ;
4059- out
3962+ let session_path = self . session . path . strip_prefix ( Path :: new ( & cwd) ) . map_or_else (
3963+ |_| self . session . path . display ( ) . to_string ( ) ,
3964+ |path| path. display ( ) . to_string ( ) ,
3965+ ) ;
3966+ format ! (
3967+ "\x1b [38;2;0;255;65m\
3968+ ██╗ ██╗ █████╗ ██████╗██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗\n \
3969+ ██║ ██║██╔══██╗██╔════╝██║ ██╔╝██╔════╝██╔═══██╗██╔══██╗██╔════╝\n \
3970+ ███████║███████║██║ █████╔╝ ██║ ██║ ██║██║ ██║█████╗\n \
3971+ ██╔══██║██╔══██║██║ ██╔═██╗ ██║ ██║ ██║██║ ██║██╔══╝\n \
3972+ ██║ ██║██║ ██║╚██████╗██║ ██╗╚██████╗╚██████╔╝██████╔╝███████╗\n \
3973+ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝\x1b [0m\n \
3974+ \x1b [38;2;0;140;30m >> AI-Powered Hacking Terminal | 100% Local | No Censorship <<\x1b [0m\n \n \
3975+ \x1b [2mModel\x1b [0m {}\n \
3976+ \x1b [2mPermissions\x1b [0m {}\n \
3977+ \x1b [2mBranch\x1b [0m {}\n \
3978+ \x1b [2mWorkspace\x1b [0m {}\n \
3979+ \x1b [2mDirectory\x1b [0m {}\n \
3980+ \x1b [2mSession\x1b [0m {}\n \
3981+ \x1b [2mAuto-save\x1b [0m {}\n \n \
3982+ Type \x1b [1m/help\x1b [0m for commands · \x1b [1m/tools\x1b [0m for security tools · \x1b [2mTab\x1b [0m for completions · \x1b [2mShift+Enter\x1b [0m for newline",
3983+ self . model,
3984+ self . permission_mode. as_str( ) ,
3985+ git_branch,
3986+ workspace,
3987+ cwd,
3988+ self . session. id,
3989+ session_path,
3990+ )
40603991 }
40613992
40623993 fn repl_completion_candidates ( & self ) -> Result < Vec < String > , Box < dyn std:: error:: Error > > {
0 commit comments