npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

valency-viktor

v0.8.4

Published

Viktor — OpenAI-compatible bridge to the Viktor AI agent for OpenCode. By Valency Labs.

Downloads

2,840

Readme

viktor-valency

OpenAI-совместимый мост к ИИ-агенту Viktor для OpenCode. Управление через TUI на Bubble Tea + Lip Gloss. Никаких браузерных дашбордов.

by Valency Labs

npm License: MIT


Что это

viktor-valency — это локальный мост между OpenCode (или любым клиентом, говорящим OpenAI API) и AI-агентом Viktor, который живёт в Slack как бот. Мост сам:

  • общается с Viktor через хайджек браузерной сессии (xoxc-токен + cookie d, без Slack-приложения),
  • выглядит для OpenCode как обычный OpenAI-провайдер viktor,
  • держит несколько аккаунтов Viktor с авто-failover по балансу кредитов,
  • синхронизирует открытую папку OpenCode ↔ приватный GitHub-репозиторий (Viktor пушит — мост подтягивает),
  • скачивает локально картинки/видео, которые Viktor генерирует в Slack,
  • даёт нативный TUI для управления — без HTTP-дашбордов, без браузера, без зависимостей в браузере.
[OpenCode] ──┐                              ┌──► Slack DM с Viktor ──► GitHub
             ├──► viktor-valency proxy ─────┤
[Telegram*]──┘     (FastAPI :8799)          └──► api.viktor.com (статус, кредиты, модель)

           ↑
           └── valencyviktor (TUI на Bubble Tea + Lip Gloss)

* Telegram-бот пока не входит в v0.1.0 — вернётся в одной из следующих версий.

Установка

Через npm (рекомендуется)

npm install -g valency-viktor

postinstall сам подтянет:

  • предсобранный TUI-бинарь под твою платформу (Windows / macOS / Linux, x64 + arm64),
  • проверит наличие Python 3.10+,
  • создаст .venv и поставит зависимости прокси.

После установки — одна команда:

valencyviktor

Она поднимет прокси фоном, дождётся /health и откроет TUI.

Из исходников

git clone https://github.com/svlktv/viktor-valency.git
cd viktor-valency
make venv     # python venv + requirements
make tui      # собрать TUI (нужен Go 1.22+)
make tui-run  # запустить (TUI сам поднимет прокси)

Что нужно от тебя

| Что | Где взять | |---|---| | Slack xoxc-токен | DevTools на app.slack.com → Network → любой запрос к app.slack.com/api/... → Payload → поле token (начинается с xoxc-) | | Slack cookie d | DevTools → Application → Cookies → slack.com → значение d (начинается с xoxd-) | | SLACK_TEAM_ID | часть T... из URL Slack: app.slack.com/client/T.../... | | JWT к api.viktor.com | DevTools → Network → любой запрос к api.viktor.com → Headers → Authorization: Bearer <JWT> | | GitHub CLI (gh) | установлен и авторизован: gh auth login |

DM с Viktor (D...) и user_id бота (U...) искать вручную не надо — кнопка «Детект» в TUI сама их найдёт по Slack-токену.

TUI: как он выглядит

◆ viktor-valency  ·  by Valency Labs

  ██╗   ██╗██╗██╗  ██╗████████╗ ██████╗ ██████╗
  ██║   ██║██║██║ ██╔╝╚══██╔══╝██╔═══██╗██╔══██╗
  ██║   ██║██║█████╔╝    ██║   ██║   ██║██████╔╝
  ╚██╗ ██╔╝██║██╔═██╗    ██║   ██║   ██║██╔══██╗
   ╚████╔╝ ██║██║  ██╗   ██║   ╚██████╔╝██║  ██║
    ╚═══╝  ╚═╝╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝
                  by Valency Labs · OpenCode bridge

  ╭─────────────────────────────────────────────────╮
  │ ✓ Прокси на связи                               │
  │   Аккаунтов: 3 (включено: 3, исчерпано: 0)      │
  │   Режим: auto (failover по кредитам)            │
  │   Активный: work-main                           │
  │   Сумма кредитов (по 3 с JWT): 12 480           │
  ╰─────────────────────────────────────────────────╯

  ▶ Аккаунты Viktor       просмотр / редактирование / удаление
    Добавить аккаунт      ввести Slack-креды + JWT, авто-детект
    Справка               хоткеи и где брать креды
    Выход                 закрыть TUI (прокси останется в фоне)

 proxy: http://127.0.0.1:8799 · режим: auto      ?: помощь · esc: назад · q: выход

Хоткеи

| Клавиша | Действие | |---|---| | r | обновить состояние из прокси | | a | добавить аккаунт | | e | редактировать выбранный | | d | удалить выбранный | | space | сделать активным (manual mode) | | m | переключить auto / manual | | M | выбор модели и reasoning | | ? | справка | | esc | назад / закрыть форму | | q | выход |

Закрытие TUI не останавливает прокси — он живёт в фоне, OpenCode продолжает работать.

Подключение в OpenCode

В ~/.config/opencode/opencode.json (Windows: %USERPROFILE%\.config\opencode\opencode.json):

{
  "provider": {
    "viktor": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Viktor (через viktor-valency)",
      "options": {
        "baseURL": "http://127.0.0.1:8799/v1",
        "apiKey": "viktor"
      },
      "models": { "viktor": { "name": "Viktor" } }
    }
  }
}

Затем в OpenCode выбери модель viktor/viktor — мост сам определит открытую папку и заведёт под неё приватный репозиторий.

Что прокси делает на каждый запрос

  1. Определяет папку проекта — из заголовка X-Project-Path, или парсит из системного промпта OpenCode, или берёт LOCAL_REPO_PATH из .env.
  2. Выбирает аккаунт Viktorauto режим крутит список по кругу до первого с балансом > ACCOUNT_MIN_CREDITS; manual — строго выбранный.
  3. Sync вверхgh repo create --private, добавляет remote viktor, коммитит локальные изменения, делает pull --ff-only → fallback на merge -X ours--allow-unrelated-histories. Создаёт ветку viktor/{session_id} для изоляции.
  4. Шлёт задачу Viktor'у — top-level в Slack DM, с обёрткой «Работай в репо X, ветка Y, только пушь».
  5. Ждёт ответ — главный сигнал из api.viktor.com/api/flow/tasks (runningidle); фолбэк на текстовые эвристики если JWT недоступен. Стримит каждое сообщение Viktor'а в OpenCode как SSE-чанк, плюс :ping каждые 10с.
  6. Reasoning — для Claude нативно (через Viktor API), для GPT/Kimi/Gemini инжектит <thinking_mode> теги.
  7. Скачивает медиа — картинки/видео Viktor'а локально в viktor_media/, конвертирует webp → png. Папка добавляется в .git/info/exclude — не пушится.
  8. Sync внизgit pull в локальную папку через нативный tool-вопрос OpenCode (Да / Нет / Всегда / Никогда). Управление в чате: /nopull /pullask /pullauto.
  9. Возвращается на main с подсказкой git merge viktor/{session_id}.

Если ходов в сессии больше SESSION_MAX_TURNS — авто-компакт: мост берёт у Viktor'а handoff-summary и стартует новый тред.

Авто-обновление токена

Slack xoxc и cookie d тухнут со временем. Мост держит постоянный профиль Playwright (.slack_profile), при ошибке invalid_auth запускает рефрешер, снимает свежие creds в creds.json и повторяет запрос. Плюс профилактический рефреш раз в SLACK_REFRESH_HOURS (по умолчанию 6 ч).

Первый запуск засевает профиль кукой d из .env, ручной вход обычно не нужен. Если профиль разлогинится:

.venv/Scripts/python.exe -m viktor_valency.refresh_creds --login

Несколько аккаунтов и failover

Все аккаунты заводятся в TUI. Каждый = свой Slack-DM с Viktor + свой JWT + свой выбор модели/reasoning.

Режимы:

  • Auto — берётся первый с балансом > ACCOUNT_MIN_CREDITS (500), при исчерпании — на следующий.
  • Manual — строго выбранный аккаунт, без авто-переключения. Удобно держать отдельный аккаунт под конкретный репозиторий.

Смена аккаунта = другой Viktor без памяти прежнего диалога → стартует чистая сессия с пометкой 🔁 переключился на X в чате.

Состав

viktor_valency/
  openai_proxy.py      OpenAI-совместимый прокси (FastAPI :8799)
  accounts.py          мульти-аккаунт + failover по кредитам
  slack_connector.py   xoxc + cookie d → пост/чтение Slack DM
  refresh_creds.py     авто-обновление токена через Playwright
  viktor_api.py        клиент к api.viktor.com (статус, кредиты, модели)
  git_sync.py          синхронизация папка ↔ GitHub
  sessions.py          сессии и авто-компакт
  config.py            настройки из .env
  creds.py             хранилище актуальных Slack-creds

tui/                   TUI на Bubble Tea + Lip Gloss (Go)
  cmd/viktor-tui/      бинарник
  internal/ui/         экраны: меню, аккаунты, редактор, модели, справка
  internal/api/        REST-клиент к прокси

scripts/
  install.js           postinstall: бинарь TUI + venv + requirements
  launch.js            bin valencyviktor → запуск TUI

bin/release/           прекомпилированные бинарники под все платформы

API прокси (для интеграций)

Прокси отдаёт REST на http://127.0.0.1:8799:

| Метод | Путь | Что | |---|---|---| | POST | /v1/chat/completions | OpenAI-совместимый endpoint для OpenCode | | GET | /v1/models | список моделей (viktor + модель активного аккаунта) | | GET | /health | проверка живости | | GET | /api/accounts | список аккаунтов + балансы | | POST | /api/accounts | upsert/rename | | POST | /api/accounts/mode | переключение auto/manual | | POST | /api/accounts/detect | авто-детект DM/user/email/баланса | | POST | /api/accounts/remove | удалить | | POST | /api/accounts/activate | сделать активным | | GET | /api/models/list?name= | модели + текущие настройки | | POST | /api/models/set | модель + reasoning level |

TUI использует только эти endpoints — никакого скрытого протокола.

Конфигурация

Все ключи в .env.example. Минимум для работы — пустой .env и заведение первого аккаунта в TUI. Подробности — в комментариях .env.example.

Лицензия

MIT © 2026 Valency Labs.


by Valency Labs