From 3f62bc4651f09991d1ad70c42745688d4f68976e Mon Sep 17 00:00:00 2001 From: Taiga Date: Mon, 15 Jun 2026 14:40:25 +0000 Subject: [PATCH] [2026-06-15] taiga-vault: family/how-to/balda-valera.md family/how-to/claudio-klaudiy.md personal/projects/personal-os/claude-wrapper-proxy.md --- family/how-to/balda-valera.md | 7 +++ family/how-to/claudio-klaudiy.md | 51 ++++++++++++++++++ .../personal-os/claude-wrapper-proxy.md | 54 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 family/how-to/claudio-klaudiy.md create mode 100644 personal/projects/personal-os/claude-wrapper-proxy.md diff --git a/family/how-to/balda-valera.md b/family/how-to/balda-valera.md index 9ea33b3b..156125a9 100644 --- a/family/how-to/balda-valera.md +++ b/family/how-to/balda-valera.md @@ -38,6 +38,13 @@ docker-compose build && docker-compose up -d ``` Если пустой — должен подписаться при следующем старте. Или вручную через API. +## Патчи в коде (общие с Клавдием) + +В `zulip_handler.go` добавлены: +1. `botName` — извлекается из bot_email (часть до @). Используется чтобы отличить свой @mention от чужого. +2. `extractOtherMention()` — проверяет текст на @**Name**, где Name не равен botName и не @**all**/@**everyone**. Если найден чужой @mention — сообщение игнорируется. +3. Детальное логирование в `handleAutoClaimMention` — видны все шаги от входа до ошибки. + ## Конфигурация провайдера В `config.yaml` обязательно: ```yaml diff --git a/family/how-to/claudio-klaudiy.md b/family/how-to/claudio-klaudiy.md new file mode 100644 index 00000000..f0c55bad --- /dev/null +++ b/family/how-to/claudio-klaudiy.md @@ -0,0 +1,51 @@ +# Клавдий (Claudio) — эксплуатация + +## Расположение + +| Item | Value | +|------|-------| +| Repo | `~/Developer/balda/` (один код с Валерой) | +| Compose | `~/Docker/claudio-agent/docker-compose.yaml` → контейнер `claudio-agent-claudio-1` | +| Config | `~/Docker/claudio-agent/.config/balda/config.yaml` | +| Env | `~/Docker/claudio-agent/.env` | +| Dockerfile | `~/Docker/claudio-agent/Dockerfile.claudio` | + +## Запуск / рестарт + +```bash +cd ~/Docker/claudio-agent +docker-compose restart # без пересборки +docker-compose build && docker-compose up -d # после изменений в коде +``` + +## Архитектура получения сообщений + +Клавдий — **outgoing webhook bot** (bot_type=3). Zulip отправляет webhook только для @mention и DM. + +Для получения всех сообщений в теме — **Events API polling**: +- Подписан на все публичные стримы при старте +- После @mention создаётся сессия; последующие сообщения без @mention обрабатываются + +## Отличие от Валеры + +- **Провайдер**: `claude` (claude-sonnet-4-6) через Claude Proxy (контейнер, порт 3457) +- **Порт webhook**: 8092 (у Валеры 8091) +- **База**: отдельная SQLite (NATS embedded) + +## Проблемы и решения + +### Валера отвечал вместо Клавдия на @mention + +**Причина**: у Валеры в `allowed_owners` был `admin@zulip.local` (реальный email юзера), а у Клавдия — `amartemyanov@duckduckgo.com` (не совпадает). `isAllowedOwner` возвращал false. + +**Решение**: добавлен `admin@zulip.local` в allowed_owners Клавдия. + +### Валера отвечал на @mention других ботов (через Events API) + +**Причина**: оба бота подписаны на Events API с `all_public_streams=true`. Когда кто-то писал `@Клавдий`, Валера получал это сообщение через Events API и, имея активную сессию в том же треде, отвечал. + +**Решение**: пропатчен `zulip_handler.go` — добавлена проверка `extractOtherMention()`: если сообщение со стрима содержит @mention другого бота, игнорировать. + +### При первом запуске не отвечает на @mention + +Нужен `/start owner=` в DM. Токен генерируется при первом старте и пишется в лог: `docker logs claudio-agent-claudio-1 | grep -i owner` diff --git a/personal/projects/personal-os/claude-wrapper-proxy.md b/personal/projects/personal-os/claude-wrapper-proxy.md new file mode 100644 index 00000000..81f64323 --- /dev/null +++ b/personal/projects/personal-os/claude-wrapper-proxy.md @@ -0,0 +1,54 @@ +# Claude Wrapper Proxy — Docker + +## Расположение + +| Item | Value | +|------|-------| +| Путь | `~/Docker/claude-wrapper-proxy/` | +| Compose | `docker-compose.yml` | +| Dockerfile | `Dockerfile` | +| Env | `.env` — содержит `CLAUDE_CODE_OAUTH_TOKEN` | +| Порт | 3457 (хостовый на 3456) | + +## Основа + +ChrisCross3/claude-proxy-full — самый продвинутый форк с MCP injection, Isolated mode, Caller-Dispatched Tools. + +## Проблемы + +### "Not logged in" при старте + +**Причина**: OAuth токен expired. `~/.claude/.credentials.json` имеет `expiresAt`, который истекает. Claude CLI не может обновить через read-only volume. + +**Решение**: передать `CLAUDE_CODE_OAUTH_TOKEN` в `.env`. Токен берётся из живой сессии Claude CLI или из `.hermes/.env`. + +### Node.js на Alpine не отвечает на внешние запросы + +**Причина**: `index.js` слушает на `127.0.0.1` внутри контейнера. Docker port mapping не перенаправляет с `0.0.0.0` на `127.0.0.1`. + +**Решение**: в Dockerfile пропатчен `index.js` — `host` заменён с `127.0.0.1` на `0.0.0.0`. + +### JsonWebTokenError при старте + +**Причина**: пустой OAuth токен. Claude CLI внутри контейнера требует `CLAUDE_CODE_OAUTH_TOKEN` в env. + +**Решение**: токен передан через `.env` + env_file в docker-compose. + +## Сборка и запуск + +```bash +cd ~/Docker/claude-wrapper-proxy +docker-compose build +docker-compose up -d +``` + +Проверка: `curl http://localhost:3457/v1/health` → должен вернуть `Hello.` + +## Использование в Hermes + +В `~/.hermes/config.yaml`: +```yaml +providers: + claude: + base_url: http://localhost:3457/v1 +```