diff --git a/README.md b/README.md index ac647c6..644e99b 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,17 @@ | Папка | Что | |-------|-----| +| [`agent-arka/`](agent-arka/) | Agent Arka: демон + **веб-дашборд** (`http://127.0.0.1:4545`), установщик и пакеты | | [`opencode/`](opencode/) | Провайдер OpenCode **Arka-AI**: установщик, плагин, skill, каталог чат-моделей | +Agent Arka (веб-интерфейс), Linux / WSL: + +```bash +curl -fsSL https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh | bash +``` + +Подробности: [agent-arka/README.md](agent-arka/README.md). + OpenCode, macOS / Linux / WSL: ```bash diff --git a/agent-arka/README.md b/agent-arka/README.md new file mode 100644 index 0000000..c28c368 --- /dev/null +++ b/agent-arka/README.md @@ -0,0 +1,110 @@ +# Agent Arka — дистрибутив с веб-интерфейсом + +Ставит CLI `agent-arka`, поднимает демон и открывает **веб-дашборд** на `http://127.0.0.1:4545`. Это не приложение Tauri (Dock / NSIS); это агент с браузерным UI. + +Исходники приватны: [`arka/agent-arka`](https://git.arka-ai.ru/arka/agent-arka). Сборки и этот установщик публичные, без токена. + +Версия пакета: **2026.9.1**. + +## Установка (Linux / WSL) + +```bash +curl -fsSL https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh | bash +``` + +Скрипт: + +1. Определяет OS/CPU и качает `agent-arka-<версия>-.tar.gz` из [релизов этого репозитория](https://git.arka-ai.ru/arka/public/releases). +2. Проверяет SHA-256. +3. Кладёт бинарник в `~/.agent-arka/bin` (если уже есть `~/.librefang` — туда). Совместимое имя `librefang` — симлинк. +4. Если нет `config.toml`, запускает `agent-arka init --quick` (Sign in with Arka, случайный пароль оператора печатается один раз). +5. Если порт **4545 свободен**, запускает `agent-arka start`. + +Дальше в браузере: [http://127.0.0.1:4545](http://127.0.0.1:4545) → вкладка **Arka AI**. + +Зафиксировать версию: + +```bash +curl -fsSL https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh \ + | AGENT_ARKA_VERSION=2026.9.1 bash +``` + +Не стартовать демон: + +```bash +curl -fsSL https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh \ + | AGENT_ARKA_AUTO_START=0 bash +agent-arka start +``` + +## Что нужно + +- `curl`, `tar`, `sha256sum` (Linux) или `shasum` (macOS) +- glibc: пакет `linux-x86_64` / `linux-aarch64` собран на Ubuntu 22.04 (glibc 2.35) — идёт на Debian/Ubuntu 22.04+ +- Аккаунт [arka-ai.ru](https://arka-ai.ru) для входа в дашборд +- Ключ API для моделей: [arka-ai.ru → API keys](https://arka-ai.ru). Один раз показывается секрет. В `~/.agent-arka/secrets.env` (или `~/.librefang/secrets.env`): + +``` +ARKA_API_KEY=sk-... +``` + +После правки `secrets.env` перезапуск: `agent-arka restart`. + +## Платформы + +| Архив | Для кого | +|-------|----------| +| `agent-arka-*-linux-x86_64.tar.gz` | Linux / WSL, x86_64 (glibc ≥ 2.35) | +| `agent-arka-*-linux-aarch64.tar.gz` | Linux aarch64 (Orange Pi, PC162, Ampere; glibc ≥ 2.35) | + +macOS и Windows native в этом релизе **нет** (установщик на Darwin честно завершится с ошибкой скачивания). На Mac — Desktop DMG, когда он опубликован; на Windows — WSL (`wsl --install`) и команда Linux выше. + +## Команды после установки + +```bash +agent-arka --version +agent-arka start # демон, веб на :4545 +agent-arka stop +agent-arka restart +agent-arka doctor +``` + +Логи: `$HOME/.agent-arka/logs/` (или `.librefang`). + +Порт занят — не убивайте чужой процесс. Либо остановите свой старый демон (`agent-arka stop`), либо задайте другой listen в `config.toml` (`api_listen`). + +## Вход + +На свежей установке в `config.toml` уже включён официальный OIDC-клиент `agent-arka` (PKCE, без секрета). Кнопка **Arka AI** должна быть на экране логина. + +Колбэк по умолчанию: `http://127.0.0.1:4545/api/auth/callback` и `http://localhost:4545/api/auth/callback`. Если открываете дашборд по другому hostname, этот origin должен быть зарегистрирован на IdP — иначе будет «Redirect URI not registered». Для одного пользователя на своей машине открывайте именно `http://127.0.0.1:4545`. + +Пароль вкладки Password — аварийный (`dashboard_user = operator`). Init печатает его один раз. + +## Сборка из исходников (если нет пакета под вашу OS) + +Репозиторий приватный. У кого есть доступ: + +```bash +cargo install --git ssh://git@git.arka-ai.ru:4001/arka/agent-arka.git librefang-cli --bin agent-arka +agent-arka init --quick +agent-arka start +``` + +--- + +# Agent Arka — web UI distribution + +Installs the `agent-arka` CLI, starts the daemon, and serves the **browser dashboard** at `http://127.0.0.1:4545`. This is not the Tauri desktop app. + +```bash +curl -fsSL https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh | bash +``` + +Then open [http://127.0.0.1:4545](http://127.0.0.1:4545) and use **Arka AI** to sign in. + +Pin a version with `AGENT_ARKA_VERSION=2026.9.1`. Skip autostart with `AGENT_ARKA_AUTO_START=0`. + +Put `ARKA_API_KEY` in `~/.agent-arka/secrets.env` (or `~/.librefang/secrets.env` if that home already exists). Create a key at [arka-ai.ru](https://arka-ai.ru). + +Releases (tarballs + `SHA256SUMS`): diff --git a/agent-arka/install.sh b/agent-arka/install.sh new file mode 100755 index 0000000..e8c6f07 --- /dev/null +++ b/agent-arka/install.sh @@ -0,0 +1,233 @@ +#!/usr/bin/env bash +# Agent Arka — daemon + web dashboard installer (Linux / macOS / WSL). +# +# curl -fsSL https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh | bash +# +# Environment: +# AGENT_ARKA_VERSION pin a release (e.g. 2026.9.1). Default: newest agent-arka-v* on git.arka-ai.ru/arka/public +# AGENT_ARKA_HOME data dir. Existing ~/.librefang is reused; else ~/.agent-arka +# AGENT_ARKA_INSTALL_DIR binary dir (default: $AGENT_ARKA_HOME/bin) +# AGENT_ARKA_AUTO_START 1/true/yes to run `agent-arka start` when :4545 is free (default: 1) +# AGENT_ARKA_INIT 1 to run `agent-arka init --quick` when no config.toml exists (default: 1) +# LIBREFANG_* names for the same keys still work. + +set -euo pipefail + +PUBLIC_API="${AGENT_ARKA_PUBLIC_API:-https://git.arka-ai.ru/api/v1}" +PUBLIC_DL="${AGENT_ARKA_PUBLIC_DL:-https://git.arka-ai.ru/arka/public/releases/download}" +REPO="arka/public" +TAG_PREFIX="agent-arka-v" + +if [[ -t 1 && -z "${NO_COLOR:-}" ]]; then + C_GREEN=$'\033[32m' + C_YELLOW=$'\033[33m' + C_RED=$'\033[31m' + C_BOLD=$'\033[1m' + C_RESET=$'\033[0m' +else + C_GREEN='' C_YELLOW='' C_RED='' C_BOLD='' C_RESET='' +fi + +info() { printf '%s\n' "$*"; } +ok() { printf '%s✓%s %s\n' "$C_GREEN" "$C_RESET" "$*"; } +warn() { printf '%s⚠%s %s\n' "$C_YELLOW" "$C_RESET" "$*"; } +die() { printf '%s✗%s %s\n' "$C_RED" "$C_RESET" "$*" >&2; exit 1; } + +brand_env() { + local suffix="$1" + local new_name="AGENT_ARKA_${suffix}" + local old_name="LIBREFANG_${suffix}" + local value="${!new_name:-}" + if [[ -n "${value// }" ]]; then + printf '%s\n' "$value" + return 0 + fi + value="${!old_name:-}" + if [[ -n "${value// }" ]]; then + printf '%s\n' "$value" + return 0 + fi + return 1 +} + +is_on() { + case "${1:-}" in + 1|true|TRUE|yes|YES|on|ON) return 0 ;; + *) return 1 ;; + esac +} + +detect_platform() { + local os arch + os=$(uname -s | tr '[:upper:]' '[:lower:]') + arch=$(uname -m) + case "$arch" in + x86_64|amd64) arch="x86_64" ;; + aarch64|arm64) arch="aarch64" ;; + *) die "Unsupported architecture: $arch" ;; + esac + case "$os" in + linux) PLATFORM="linux-${arch}" ;; + darwin) PLATFORM="darwin-${arch}" ;; + mingw*|msys*|cygwin*) + die "On Windows use WSL, then this installer, or wait for the Desktop NSIS build. PowerShell: wsl --install" + ;; + *) die "Unsupported OS: $os" ;; + esac +} + +resolve_home() { + local override + if override=$(brand_env HOME 2>/dev/null); then + HOME_DIR="$override" + return + fi + if [[ -d "${HOME}/.librefang" ]]; then + HOME_DIR="${HOME}/.librefang" + return + fi + HOME_DIR="${HOME}/.agent-arka" +} + +port_in_use() { + local port="$1" + if command -v ss >/dev/null 2>&1; then + ss -ltn 2>/dev/null | grep -qE ":${port}([[:space:]]|$)" + return $? + fi + if command -v lsof >/dev/null 2>&1; then + lsof -iTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1 + return $? + fi + (echo >/dev/tcp/127.0.0.1/"$port") >/dev/null 2>&1 +} + +fetch_latest_version() { + local json tags + json=$(curl -fsSL "${PUBLIC_API}/repos/${REPO}/releases?limit=50") || die "Cannot list releases at ${PUBLIC_API}/repos/${REPO}/releases" + tags=$(printf '%s' "$json" | grep -oE '"tag_name":[[:space:]]*"'"${TAG_PREFIX}"'[^"]+"' | sed 's/.*"'"${TAG_PREFIX}"'//;s/"$//' || true) + if [[ -z "$tags" ]]; then + die "No ${TAG_PREFIX}* releases on ${REPO} yet" + fi + printf '%s\n' "$tags" | head -n 1 +} + +sha256_file() { + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$1" | awk '{print $1}' + elif command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$1" | awk '{print $1}' + else + die "Need sha256sum or shasum" + fi +} + +ensure_path() { + local bindir="$1" + case ":$PATH:" in + *":${bindir}:"*) return 0 ;; + esac + local line="export PATH=\"${bindir}:\$PATH\"" + local rc + for rc in "${HOME}/.zprofile" "${HOME}/.zshrc" "${HOME}/.bash_profile" "${HOME}/.bashrc" "${HOME}/.profile"; do + [[ -f "$rc" ]] || continue + if grep -Fqs "$bindir" "$rc"; then + return 0 + fi + done + if [[ -n "${SHELL:-}" && "${SHELL}" == *zsh* ]]; then + rc="${HOME}/.zshrc" + else + rc="${HOME}/.bashrc" + [[ -f "$rc" ]] || rc="${HOME}/.profile" + fi + printf '\n# Agent Arka\n%s\n' "$line" >>"$rc" + warn "Added ${bindir} to PATH in ${rc} (open a new shell, or: source ${rc})" +} + +main() { + printf '%s\n' "${C_BOLD}Agent Arka${C_RESET} — web dashboard installer" + command -v curl >/dev/null 2>&1 || die "curl is required" + command -v tar >/dev/null 2>&1 || die "tar is required" + + detect_platform + resolve_home + local bindir + if bindir=$(brand_env INSTALL_DIR 2>/dev/null); then + : + else + bindir="${HOME_DIR}/bin" + fi + mkdir -p "$bindir" "$HOME_DIR" + + local version + if version=$(brand_env VERSION 2>/dev/null); then + version="${version#v}" + version="${version#agent-arka-v}" + info "Using pinned version ${version}" + else + info "Resolving latest Agent Arka release…" + version=$(fetch_latest_version) + info "Latest: ${version}" + fi + + local tag="${TAG_PREFIX}${version}" + local asset="agent-arka-${version}-${PLATFORM}.tar.gz" + local url="${PUBLIC_DL}/${tag}/${asset}" + local sums_url="${PUBLIC_DL}/${tag}/SHA256SUMS" + local tmp + tmp=$(mktemp -d) + trap 'rm -rf "$tmp"' EXIT + + info "Downloading ${asset}" + if ! curl -fL --retry 3 -o "${tmp}/${asset}" "$url"; then + die "No package for ${PLATFORM} in ${tag}. See https://git.arka-ai.ru/arka/public/releases" + fi + curl -fsSL -o "${tmp}/SHA256SUMS" "$sums_url" || die "Missing SHA256SUMS for ${tag}" + local expected actual + expected=$(grep -E "[[:space:]]${asset}\$" "${tmp}/SHA256SUMS" | awk '{print $1}' | head -n 1) + [[ -n "$expected" ]] || die "SHA256SUMS has no entry for ${asset}" + actual=$(sha256_file "${tmp}/${asset}") + [[ "$expected" == "$actual" ]] || die "SHA256 mismatch for ${asset} (got ${actual}, want ${expected})" + ok "Checksum ok" + + tar -xzf "${tmp}/${asset}" -C "$tmp" + [[ -f "${tmp}/agent-arka" ]] || die "Archive did not contain agent-arka" + chmod 755 "${tmp}/agent-arka" + "${tmp}/agent-arka" --version >/dev/null || die "Downloaded binary failed to run on this host" + cp -f "${tmp}/agent-arka" "${bindir}/agent-arka" + ln -sfn agent-arka "${bindir}/librefang" + ok "Installed ${bindir}/agent-arka ($("${bindir}/agent-arka" --version 2>/dev/null | head -n 1))" + + ensure_path "$bindir" + export PATH="${bindir}:$PATH" + + local do_init do_start + do_init=$(brand_env INIT 2>/dev/null || echo 1) + do_start=$(brand_env AUTO_START 2>/dev/null || echo 1) + + if is_on "$do_init" && [[ ! -f "${HOME_DIR}/config.toml" ]]; then + info "First run: agent-arka init --quick" + AGENT_ARKA_HOME="${HOME_DIR}" LIBREFANG_HOME="${HOME_DIR}" "${bindir}/agent-arka" init --quick || warn "init --quick failed; run: agent-arka init" + fi + + if is_on "$do_start"; then + if port_in_use 4545; then + warn "Port 4545 is already in use — not starting a second daemon" + else + info "Starting daemon" + AGENT_ARKA_HOME="${HOME_DIR}" LIBREFANG_HOME="${HOME_DIR}" "${bindir}/agent-arka" start || warn "agent-arka start failed" + fi + fi + + printf '\n' + ok "Open the web UI: ${C_BOLD}http://127.0.0.1:4545${C_RESET}" + info "Sign in with Arka AI (account at https://arka-ai.ru)." + info "For models, put ARKA_API_KEY in ${HOME_DIR}/secrets.env (create a key at https://arka-ai.ru)." + info "Docs: https://git.arka-ai.ru/arka/public/src/branch/main/agent-arka" +} + +if [[ "${AGENT_ARKA_INSTALLER_SOURCE_ONLY:-}" == 1 ]]; then + return 0 2>/dev/null || true +fi +main "$@" diff --git a/install-agent-arka.sh b/install-agent-arka.sh new file mode 100755 index 0000000..cf11810 --- /dev/null +++ b/install-agent-arka.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Compatibility stub. Canonical installer: +# https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh +set -euo pipefail +echo "==> installer lives at agent-arka/install.sh" >&2 +curl -fsSL \ + 'https://git.arka-ai.ru/arka/public/raw/branch/main/agent-arka/install.sh' \ + | bash -s -- "$@"