# Kova §13 Tokenized Shell Aliases
# Sourced by .zshrc (macOS) and .bashrc (Debian workers)
# k=kova, ks=serve, kg=gui, kc=chat, kx=cargo, kn=node, kt=test

# Path tokens — shorten output and prompts
export W="$HOME"
export K="$HOME/kova"
export KS="$HOME/kova/src"

# Reload aliases
alias ka='. "$HOME/.kova-aliases" && echo "aliases reloaded"'

# Base
alias k='kova'
alias ks='kova s'
alias ksd='kova s -d'
alias kg='kova gui'
alias kgd='kova gui --demo'
alias kc='kova chat'
alias kt='kova test'
alias kb='kova bootstrap'
alias kr='kova recent'
alias km='kova model'
alias kmi='kova model install'
alias kml='kova model list'
alias kp='kova prompts'

# New commands
alias ktk='kova tokens'
alias kci='kova ci'
alias kciw='kova ci watch'
alias krv='kova review'
alias krvs='kova review staged'
alias krvb='kova review branch'
alias kfb='kova feedback'
alias kfbs='kova feedback stats'
alias kex='kova export'
alias kexj='kova export --format jsonl'
alias kmcp='kova mcp'
alias ktr='kova traces'
alias ktrs='kova traces stats'
alias kf='kova factory'
alias kga='kova gauntlet'
alias kmoe='kova moe'
alias kcl='kova cluster'
alias krag='kova rag'

# xN = cargo tokens
alias kx='kova x'
alias kx0='kova x build'
alias kx1='kova x check'
alias kx2='kova x test'
alias kx3='kova x clippy'
alias kx4='kova x run'
alias kx5='kova x build-rel'
alias kx6='kova x clean'
alias kx7='kova x doc'
alias kx8='kova x fmt-chk'
alias kx9='kova x bench'

# cN = node tokens (via c2 ncmd)
alias kn='kova c2 ncmd'
alias kn1='kova c2 ncmd c1'
alias kn2='kova c2 ncmd c2'
alias kn3='kova c2 ncmd c3'
alias kn4='kova c2 ncmd c4'
alias kn5='kova c2 ncmd c5'
alias kn6='kova c2 ncmd c6'
alias kn7='kova c2 ncmd c7'
alias kn8='kova c2 ncmd c8'
alias kn9='kova c2 ncmd c9'
alias kni='kova c2 ncmd ci'
alias kni1='kova c2 ncmd ci --oneline'
alias knct='kova c2 ncmd ct --idle'

# c2 operations
alias kc2='kova c2'
alias kc2n='kova c2 nodes'
alias kc2i='kova c2 inspect'
alias kc2r='kova c2 recommend'
alias kc2b='kova c2 build --broadcast'
alias kc2s='kova c2 sync --all'

# gN = git tokens
alias kg0='kova git g0'
alias kg1='kova git g1'
alias kg2='kova git g2'
alias kg3='kova git g3'
alias kg4='kova git g4'
alias kg5='kova git g5'
alias kg6='kova git g6'
alias kg7='kova git g7'
alias kg8='kova git g8'
alias kg9='kova git g9'

# pN = project jump + ops (cd, build, check, test, run)
# Detect home: /Users/mcochran (macOS) or /home/mcochran (Debian)
_KH="${HOME}"

# p0=kova
alias p0='cd "${_KH}/kova"'
alias p0b='cd "${_KH}/kova" && cargo build'
alias p0c='cd "${_KH}/kova" && cargo check'
alias p0t='cd "${_KH}/kova" && cargo test'
alias p0te='cd "${_KH}/kova" && cargo run -p kova --bin kova-test --features tests'
alias p0r='cd "${_KH}/kova" && cargo run --bin kova'
alias p0x='cd "${_KH}/kova" && cargo clippy'

# p1=approuter
alias p1='cd "${_KH}/approuter/approuter"'
alias p1b='cd "${_KH}/approuter/approuter" && cargo build'
alias p1c='cd "${_KH}/approuter/approuter" && cargo check'
alias p1t='cd "${_KH}/approuter/approuter" && cargo test'
alias p1te='cd "${_KH}/approuter" && cargo run -p approuter --bin approuter-test --features tests'
alias p1r='cd "${_KH}/approuter/approuter" && cargo run'
alias p1x='cd "${_KH}/approuter/approuter" && cargo clippy'

# p2=cochranblock
alias p2='cd "${_KH}/cochranblock"'
alias p2b='cd "${_KH}/cochranblock" && cargo build'
alias p2c='cd "${_KH}/cochranblock" && cargo check'
alias p2t='cd "${_KH}/cochranblock" && cargo test'
alias p2te='cd "${_KH}/cochranblock" && cargo run -p cochranblock --bin cochranblock-test --features tests'
alias p2r='cd "${_KH}/cochranblock" && cargo run'
alias p2x='cd "${_KH}/cochranblock" && cargo clippy'

# p3=oakilydokily
alias p3='cd "${_KH}/oakilydokily"'
alias p3b='cd "${_KH}/oakilydokily" && cargo build'
alias p3c='cd "${_KH}/oakilydokily" && cargo check'
alias p3t='cd "${_KH}/oakilydokily" && cargo test'
alias p3te='cd "${_KH}/oakilydokily" && cargo run -p oakilydokily --bin oakilydokily-test --features tests'
alias p3r='cd "${_KH}/oakilydokily" && cargo run'
alias p3x='cd "${_KH}/oakilydokily" && cargo clippy'

# p4=rogue-repo
alias p4='cd "${_KH}/rogue-repo"'
alias p4b='cd "${_KH}/rogue-repo" && cargo build'
alias p4c='cd "${_KH}/rogue-repo" && cargo check'
alias p4t='cd "${_KH}/rogue-repo" && cargo test'
alias p4r='cd "${_KH}/rogue-repo" && cargo run'
alias p4x='cd "${_KH}/rogue-repo" && cargo clippy'

# p5=ronin-sites (Rust backend + Node frontend)
alias p5='cd "${_KH}/ronin-sites"'
alias p5b='cd "${_KH}/ronin-sites/rs" && cargo build'
alias p5c='cd "${_KH}/ronin-sites/rs" && cargo check'
alias p5t='cd "${_KH}/ronin-sites/rs" && cargo test'
alias p5r='cd "${_KH}/ronin-sites/rs" && cargo run'
alias p5x='cd "${_KH}/ronin-sites/rs" && cargo clippy'
alias p5f='cd "${_KH}/ronin-sites/frontend"'
alias p5fi='cd "${_KH}/ronin-sites/frontend" && npm install'
alias p5fd='cd "${_KH}/ronin-sites/frontend" && npm run dev'
alias p5fb='cd "${_KH}/ronin-sites/frontend" && npm run build'

# p6=kova-core (absorbed into kova — removed)

# p7=exopack (inside kova)
alias p7='cd "${_KH}/kova/exopack"'
alias p7b='cd "${_KH}/kova/exopack" && cargo build'
alias p7c='cd "${_KH}/kova/exopack" && cargo check'
alias p7t='cd "${_KH}/kova/exopack" && cargo test'

# p8=whyyoulying
alias p8='cd "${_KH}/whyyoulying"'
alias p8b='cd "${_KH}/whyyoulying" && cargo build'
alias p8c='cd "${_KH}/whyyoulying" && cargo check'
alias p8t='cd "${_KH}/whyyoulying" && cargo test'
alias p8r='cd "${_KH}/whyyoulying" && cargo run'

# p9=wowasticker
alias p9='cd "${_KH}/wowasticker"'
alias p9b='cd "${_KH}/wowasticker" && cargo build'
alias p9c='cd "${_KH}/wowasticker" && cargo check'
alias p9t='cd "${_KH}/wowasticker" && cargo test'
alias p9r='cd "${_KH}/wowasticker" && cargo run'

# p10=pixel-forge
alias p10='cd "${_KH}/pixel-forge"'
alias p10b='cd "${_KH}/pixel-forge" && cargo build --release'
alias p10c='cd "${_KH}/pixel-forge" && cargo check'
alias p10t='cd "${_KH}/pixel-forge" && cargo test'
alias p10r='cd "${_KH}/pixel-forge" && cargo run --release'
alias p10x='cd "${_KH}/pixel-forge" && cargo clippy'

# dN = deploy tokens: sync source → build on bt → copy binary → restart on gd
# Pattern: d<project>s = sync, d<project>b = build, d<project>d = deploy (full), d<project>r = restart

# d3 = oakilydokily deploy pipeline (build on bt, deploy to gd)
d3s() { rsync -aq --exclude target --exclude .git "${_KH}/oakilydokily/" bt:/home/mcochran/oakilydokily/; }
d3b() { ssh bt 'export PATH="$HOME/.cargo/bin:$PATH"; cd /home/mcochran && cargo build -p oakilydokily --release --features approuter' 2>&1 | tail -1; }
d3c() { scp -q bt:/home/mcochran/target/release/oakilydokily /tmp/oakilydokily-release && scp -q /tmp/oakilydokily-release gd:/home/mcochran/bin/oakilydokily; }
d3r() { ssh gd 'systemctl --user restart oakilydokily'; }
d3d() { d3s && echo "sync:ok" && d3b && echo "build:ok" && d3c && echo "copy:ok" && d3r && echo "d3:ok" || echo "d3:err"; }
d3dp() { (cd "${_KH}/oakilydokily" && git push 2>&1 | tail -1) && d3d; }

# d0 = kova deploy pipeline (build on bt, deploy to all nodes)
d0s() { rsync -aq --exclude target --exclude .git "${_KH}/kova/" bt:/home/mcochran/kova/; }
d0b() { ssh bt 'export PATH="$HOME/.cargo/bin:$PATH"; cd /home/mcochran && cargo build -p kova --release --features serve' 2>&1 | tail -1; }

# d1 = approuter deploy pipeline
d1s() { rsync -aq --exclude target --exclude .git "${_KH}/approuter/" bt:/home/mcochran/approuter/; }
d1b() { ssh bt 'export PATH="$HOME/.cargo/bin:$PATH"; cd /home/mcochran && cargo build -p approuter --release' 2>&1 | tail -1; }
d1c() { scp -q bt:/home/mcochran/target/release/approuter /tmp/approuter-release && scp -q /tmp/approuter-release gd:/home/mcochran/bin/approuter; }
d1dp() { (cd "${_KH}/approuter" && git push 2>&1 | tail -1) && d1s && echo "sync:ok" && d1b && echo "build:ok" && d1c && echo "d1:ok" || echo "d1:err"; }

# d2 = cochranblock deploy pipeline (sync→bt build→copy→gd restart)
d2s() { rsync -aq --exclude target --exclude .git "${_KH}/cochranblock/" bt:/home/mcochran/cochranblock/; }
d2b() { ssh bt 'export PATH="$HOME/.cargo/bin:$PATH"; cd /home/mcochran && cargo build -p cochranblock --release --features approuter' 2>&1 | tail -1; }
d2c() { scp -q bt:/home/mcochran/target/release/cochranblock /tmp/cochranblock-release && scp -q /tmp/cochranblock-release gd:/home/mcochran/bin/cochranblock; }
d2r() { ssh gd 'pkill -f cochranblock 2>/dev/null; cd /home/mcochran/bin && nohup ./cochranblock </dev/null >>/tmp/cochranblock.log 2>&1 &'; }
d2d() { d2s && echo "sync:ok" && d2b && echo "build:ok" && d2c && echo "copy:ok" && d2r && echo "d2:ok" || echo "d2:err"; }
d2dp() { (cd "${_KH}/cochranblock" && git push 2>&1 | tail -1) && d2d; }
alias redeploy='d2d'   # cochranblock: rebuild via ssh (bt) + redeploy to gd

# d10 = pixel-forge deploy pipeline (sync→build on bt→copy to all nodes)
d10s() { rsync -aq --exclude target --exclude .git --exclude data "${_KH}/pixel-forge/" bt:/home/mcochran/pixel-forge/; }
d10b() { ssh bt 'export PATH="$HOME/.cargo/bin:$PATH"; cd /home/mcochran/pixel-forge && cargo build --release' 2>&1 | tail -1; }
d10c() { for h in lf gd bt st; do scp -q bt:/home/mcochran/pixel-forge/target/release/pixel-forge "$h":/home/mcochran/bin/pixel-forge 2>/dev/null && echo "$h:ok" || echo "$h:err"; done; }
d10d() { d10s && echo "sync:ok" && d10b && echo "build:ok" && d10c && echo "d10:ok" || echo "d10:err"; }
d10dp() { (cd "${_KH}/pixel-forge" && git push 2>&1 | tail -1) && d10d; }

# dw = sync workspace (Cargo.toml, lock, vendor) to bt
dws() { rsync -aq "${_KH}/Cargo.toml" "${_KH}/Cargo.lock" bt:/home/mcochran/ && rsync -aq "${_KH}/vendor/" bt:/home/mcochran/vendor/ && echo "dws:ok" || echo "dws:err"; }

# dm = build mural-wasm (local only — needs wasm32 target)
dm() { cargo build --target wasm32-unknown-unknown -p mural-wasm --release && cp "${_KH}/target/wasm32-unknown-unknown/release/mural-wasm.wasm" "${_KH}/oakilydokily/assets/mural-wasm.wasm" && echo "mural-wasm built"; }

# micro = tournament + bench + training
alias kmt='kova micro tournament'
alias kmb='kova micro bench'
alias kmbr='kova micro bench --registry'
alias kme='kova micro export'
alias kmed='kova micro export --format dpo'
alias kmes='kova micro export --format sft'
alias kmts='kova micro train-stats'
alias kmtn='kova micro train'
alias kmtns='kova micro train --format sft'
alias kmtnd='kova micro train --format dpo'
alias kmtna='kova micro train-all'
alias kma='kova micro academy'
alias kmm='kova micro mine'
alias kmme='kova micro mine-export'

# c2 wake (Wake-on-LAN)
alias kwlf='kova c2 wake lf'
alias kwgd='kova c2 wake gd'
alias kwbt='kova c2 wake bt'
alias kwall='kova c2 wake lf && kova c2 wake gd && kova c2 wake bt'

# SSH tunnels (autossh to kova serve on worker nodes, port 3002)
# _at = autossh tunnel shorthand
_at() { AUTOSSH_GATETIME=0 autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=5 -L "$1:localhost:3002" "$2"; }
# per-node tunnels (local ports 3003-3006 → remote 3002)
alias ktgd='_at 3003 gd && echo "gd=3003"'
alias ktbt='_at 3004 bt && echo "bt=3004"'
alias ktst='_at 3005 st && echo "st=3005"'
alias ktlf='_at 3006 lf && echo "lf=3006"'
# all tunnels
ktun() { pkill -f "autossh.*300[3-6]" 2>/dev/null; sleep 1; _at 3003 gd; _at 3004 bt; _at 3005 st; _at 3006 lf; echo "tunnels: gd=3003 bt=3004 st=3005 lf=3006"; }
alias ktunk='pkill -f "autossh.*300[3-6]" && echo "tunnels killed"'
# status (kova serve uses /v1/models, OpenAI-compat)
_tp() { curl -s --max-time 3 "http://localhost:$1/v1/models" 2>/dev/null | grep -q '"data"' && echo "$1($2): OK" || echo "$1($2): DOWN"; }
ktuns() { _tp 3003 gd; _tp 3004 bt; _tp 3005 st; _tp 3006 lf; }
# Legacy ollama tunnels (keep until migration complete)
_at_legacy() { AUTOSSH_GATETIME=0 autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=5 -L "$1:localhost:11434" "$2"; }
alias ktgd_ollama='_at_legacy 11435 gd && echo "gd=11435 (ollama)"'
alias ktun_ollama='pkill -f "autossh.*1143" 2>/dev/null; sleep 1; _at_legacy 11435 gd; _at_legacy 11436 bt; _at_legacy 11437 st; _at_legacy 11438 lf; echo "ollama tunnels: gd=11435 bt=11436 st=11437 lf=11438"'

# Deploy aliases to all nodes (/etc/profile.d/)
kad() {
    for h in gd st lf bt; do
        scp -q "$HOME/.kova-aliases" "$h":~/.kova-aliases 2>/dev/null
        ssh -o ConnectTimeout=5 "$h" "su -c 'cp /home/mcochran/.kova-aliases /etc/profile.d/kova-aliases.sh'" 2>/dev/null && echo "$h: deployed" || echo "$h: FAILED"
    done
}

# Parallel SSH (kept from original)
sshall() {
    if [ $# -eq 0 ]; then
        echo -e "\033[38;5;202m[ x ] No command.\033[0m"
        return 1
    fi
    for node in lf gd bt st; do
        echo -e "\033[38;5;226m[ > ] $node\033[0m"
        ssh "$node" "$@"
    done
    echo -e "\033[38;5;135m[ ok ] done\033[0m"
}

sshallp() {
    if [ $# -eq 0 ]; then
        echo -e "\033[38;5;202m[ x ] No command.\033[0m"
        return 1
    fi
    for node in lf gd bt st; do
        echo -e "\033[38;5;226m[ > ] $node\033[0m"
        ssh "$node" "$@" &
    done
    wait
    echo -e "\033[38;5;135m[ ok ] done\033[0m"
}

# squeeze aliases
alias ksq='kova squeeze'
alias ksqa='kova squeeze --apply'
alias ksqr='kova squeeze --remote'

# tf = tmuxisfree tokens (fleet orchestration)
alias tf='tmuxisfree'
alias tf0='tmuxisfree status'
alias tf1='tmuxisfree dispatch'
alias tf2='tmuxisfree broadcast'
alias tf3='tmuxisfree sponge'
alias tf4='tmuxisfree peek'
alias tf5='tmuxisfree unblock'
alias tf6='tmuxisfree qa'
alias tf7='tmuxisfree layout'
alias tf8='tmuxisfree mobile'
alias tf9='tmuxisfree desktop'
alias tff='tmuxisfree focus'
alias tfh='tmuxisfree home'
alias tfi='tmuxisfree init'
alias tfp='tmuxisfree push'
alias tfpp='tmuxisfree pop'
alias tfb='tmuxisfree backlog'
alias tfbc='tmuxisfree clear'
alias tfdr='tmuxisfree drain'
