From 6c4595279a2c65a14fb277660b701cc36f4d9cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Sat, 7 Mar 2026 00:52:20 +0000 Subject: [PATCH] fine tuning --- scripts/setup-desktop.sh | 7 ++- scripts/setup-dockers.sh | 9 +++- scripts/setup.sh | 47 ++++++++++++++----- .../ServerSettings/AIHarnessesSection.tsx | 20 +++----- src/servers/api/server-settings/pi-mono.ts | 4 ++ 5 files changed, 56 insertions(+), 31 deletions(-) diff --git a/scripts/setup-desktop.sh b/scripts/setup-desktop.sh index 0369f0cd..961b3f91 100755 --- a/scripts/setup-desktop.sh +++ b/scripts/setup-desktop.sh @@ -11,11 +11,10 @@ echo "" # --- Step 1: Install system packages --- echo "[1/4] Installing system packages..." sudo apt update -qq -sudo apt install -y -qq \ +sudo DEBIAN_FRONTEND=noninteractive apt install -y -qq \ xfce4 xfce4-goodies \ tigervnc-standalone-server tigervnc-common \ - dbus-x11 \ - > /dev/null 2>&1 + dbus-x11 echo " Done." # --- Step 2: Install Brave browser (native .deb, not snap) --- @@ -26,7 +25,7 @@ if ! command -v brave-browser-stable > /dev/null 2>&1; then echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main" \ | sudo tee /etc/apt/sources.list.d/brave-browser-release.list > /dev/null sudo apt update -qq - sudo apt install -y -qq brave-browser > /dev/null 2>&1 + sudo DEBIAN_FRONTEND=noninteractive apt install -y -qq brave-browser fi # Fix launcher symlink if [ -f /opt/brave.com/brave/brave-browser ]; then diff --git a/scripts/setup-dockers.sh b/scripts/setup-dockers.sh index d4deffc9..f5ebf69d 100755 --- a/scripts/setup-dockers.sh +++ b/scripts/setup-dockers.sh @@ -13,6 +13,13 @@ set -e +# Resolve the real user's home even when running under sudo +if [[ -n "${SUDO_USER:-}" ]]; then + REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6) +else + REAL_HOME="$HOME" +fi + GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' @@ -72,7 +79,7 @@ if [[ "$SERVICES" == "all" ]]; then fi # ─── compose directory ────────────────────────────────────────────────────── -prompt_value COMPOSE_DIR "Docker Compose directory" "$HOME/.local/dockers" +prompt_value COMPOSE_DIR "Docker Compose directory" "$REAL_HOME/.local/dockers" mkdir -p "$COMPOSE_DIR" # ─── build compose file ───────────────────────────────────────────────────── diff --git a/scripts/setup.sh b/scripts/setup.sh index ec20a03d..59f10a64 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -20,6 +20,13 @@ has() { command -v "$1" &>/dev/null; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +# Resolve the real user's home even when running under sudo +if [[ -n "${SUDO_USER:-}" ]]; then + REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6) +else + REAL_HOME="$HOME" +fi + # ─── detect package manager ──────────────────────────────────────────────────── if has apt; then PM=apt @@ -239,7 +246,7 @@ esac # symlink fdfind → fd (apt installs as fdfind) if has fdfind && ! has fd; then - sudo ln -sf "$(which fdfind)" /usr/local/bin/fd + sudo ln -sf "$(command -v fdfind)" /usr/local/bin/fd ok "Symlinked fdfind → fd" fi @@ -310,11 +317,11 @@ echo "" echo "── Auto-suspend (disable for server) ──" # Disable system suspend/hibernate -if systemctl is-enabled sleep.target 2>/dev/null | grep -q "enabled\|masked"; then +if systemctl is-enabled sleep.target 2>/dev/null | grep -q "masked"; then + skip "sleep targets already masked" +else sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null ok "Masked sleep/suspend targets" -else - skip "sleep targets already masked" fi # Configure logind to ignore idle — patch individual keys, don't overwrite the file @@ -375,8 +382,8 @@ case $PM in install_node22_apt if [ -f "$SYSTEM_NODE" ] && [ "$("$SYSTEM_NODE" -v 2>/dev/null | cut -d. -f1 | tr -d 'v')" = "22" ]; then ok "node v$("$SYSTEM_NODE" -v) installed at $SYSTEM_NODE" - if has node && [ "$(which node)" != "$SYSTEM_NODE" ]; then - warn "Shell resolves 'node' to $(which node) — system node is at $SYSTEM_NODE" + if has node && [ "$(command -v node)" != "$SYSTEM_NODE" ]; then + warn "Shell resolves 'node' to $(command -v node) — system node is at $SYSTEM_NODE" warn "nvm may shadow it in interactive shells; systemd services will use $SYSTEM_NODE" fi else @@ -449,8 +456,9 @@ install_go() { esac echo " Installing Go ${GOLANG_VERSION} from official tarball..." curl -fsSL "https://go.dev/dl/go${GOLANG_VERSION}.linux-${GO_ARCH}.tar.gz" -o /tmp/go.tar.gz - rm -rf "$HOME/.local/go" mkdir -p "$HOME/.local" + # Only remove old installation after successful download + rm -rf "$HOME/.local/go" tar -C "$HOME/.local" -xzf /tmp/go.tar.gz rm /tmp/go.tar.gz export GOPATH="$HOME/.local/go-path" @@ -522,6 +530,21 @@ case $PM in brew) ;; # not needed on macOS esac +# Vorbis/OGG/FLAC dev headers (needed by cliamp's Go dependencies) +case $PM in + apt) + for pkg in libvorbis-dev libogg-dev libflac-dev; do + if dpkg -s "$pkg" &>/dev/null 2>&1; then skip "$pkg"; else PULSE_PKGS+=("$pkg"); fi + done + ;; + pacman) + for pkg in libvorbis libogg flac; do + if pacman -Qi "$pkg" &>/dev/null 2>&1; then skip "$pkg"; else PULSE_PKGS+=("$pkg"); fi + done + ;; + brew) ;; # not needed on macOS +esac + if [ ${#PULSE_PKGS[@]} -gt 0 ]; then install_pkg "${PULSE_PKGS[@]}" ok "Installed: ${PULSE_PKGS[*]}" @@ -535,7 +558,7 @@ GOPATH_BIN="${GOPATH:-$HOME/.local/go-path}/bin" export PATH="$GOPATH_BIN:$PATH" if has cliamp; then - skip "cliamp ($(which cliamp))" + skip "cliamp ($(command -v cliamp))" else if ! has go; then warn "Go not installed — skipping cliamp build" @@ -548,7 +571,7 @@ else if [ -f "$GOPATH_BIN/cliamp" ]; then ok "cliamp installed at $GOPATH_BIN/cliamp" else - fail "cliamp build failed" + warn "cliamp build failed" fi fi fi @@ -708,7 +731,7 @@ else # Use explicit path to system npm if available, to avoid nvm conflicts SYSTEM_NPM="/usr/bin/npm" if [ ! -f "$SYSTEM_NPM" ]; then - SYSTEM_NPM="$(which npm)" + SYSTEM_NPM="$(command -v npm)" fi # Set npm prefix to system location so all users can access packages @@ -817,9 +840,9 @@ if [ "$GENERATE_ENV" = true ]; then read -r ENV_PUBLIC_URL done - echo -n " DATA_PATH [/mnt/data]: " + echo -n " DATA_PATH [$REAL_HOME/.local/data]: " read -r ENV_DATA_PATH - ENV_DATA_PATH="${ENV_DATA_PATH:-/mnt/data}" + ENV_DATA_PATH="${ENV_DATA_PATH:-$REAL_HOME/.local/data}" MAIL_DEFAULT="${DOCKER_MAIL_TRANSPORT:-smtp://127.0.0.1:1025}" echo -n " MAIL_TRANSPORT [$MAIL_DEFAULT]: " diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx index 88d51ae5..67a0e292 100644 --- a/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Settings/ServerSettings/AIHarnessesSection.tsx @@ -33,20 +33,7 @@ type ProbeResult = { error?: string; }; -const PI_PROVIDERS: { key: string; piId: string }[] = [ - { key: 'Anthropic', piId: 'anthropic' }, - { key: 'OpenAI', piId: 'openai' }, - { key: 'Google', piId: 'google' }, - { key: 'Groq', piId: 'groq' }, - { key: 'Mistral', piId: 'mistral' }, - { key: 'xAI', piId: 'xai' }, - { key: 'OpenRouter', piId: 'openrouter' }, - { key: 'MiniMax', piId: 'minimax' }, - { key: 'Hugging Face', piId: 'huggingface' }, - { key: 'Azure OpenAI', piId: 'azure-openai-responses' }, - { key: 'ZAI', piId: 'zai' }, - { key: 'Cerebras', piId: 'cerebras' }, -]; +type PiProvider = { key: string; piId: string }; type ProbeState = { step: 'url' } | { step: 'probing' } | { step: 'auth'; probe: ProbeResult } | { step: 'saving' }; @@ -55,6 +42,11 @@ export const AIHarnessesSection = () => { const queryClient = useQueryClient(); const [installing, setInstalling] = useState(false); + const { data: PI_PROVIDERS = [] as PiProvider[] } = useQuery({ + queryKey: ['PI_MONO_PROVIDERS'], + queryFn: () => client.get('/server-settings/pi-mono/providers'), + }); + const { data: piMonoVersion, isLoading: piMonoLoading } = useQuery({ queryKey: ['PI_MONO_VERSION'], queryFn: () => client.get('/server-settings/pi-mono/version'), diff --git a/src/servers/api/server-settings/pi-mono.ts b/src/servers/api/server-settings/pi-mono.ts index bb01395c..a0193e6a 100644 --- a/src/servers/api/server-settings/pi-mono.ts +++ b/src/servers/api/server-settings/pi-mono.ts @@ -366,6 +366,10 @@ export const PROVIDERS: { key: string; piId: string }[] = [ { key: 'Cerebras', piId: 'cerebras' }, ]; +piMonoRouter.get('/providers', async (ctx) => { + return ctx.json(PROVIDERS); +}); + piMonoRouter.get('/auth', async (ctx) => { const auth = await readAuthJson(); const providers = PROVIDERS.filter((p) => auth[p.piId]?.key?.trim()).map((p) => p.key);