Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
203 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "aeshef/obsidian-agent", "files": {".env.example": {"0cf0ac5eec012948995a4fbb7a7c122688394c83": {"t": 1785745174.5303178, "n": 6126, "h": "584365a8577b428d", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: en (default, messages.en.yaml) or ru (messages.ru.yaml)\nAGENT_LOCALE=en\n# Author full install when capabilities.yaml is absent (all modules/connectors). OSS default: omit or 0.\n# OBSIDIAN_AGENT_FULL_INSTALL=1\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — weekly pattern synth → /memory confirm (LLM cost)\n# SYNTH_DOMAINS=finance,planning # domains for weekly job (Sunday ~04:00)\n# KNOWLEDGE_AGENT_WRITES=0 # 1 — allow append_knowledge_note (allowlisted paths)\n# MEMORY_SESSION_PERSIST=1 # SQLite dialogue history (survives restart)\n# MEMORY_WORKING_SET_PERSIST=1 # durable working-set entities (default: follow SESSION)\n# AGENT_TRACE=1 # jsonl cost/latency traces under logs/\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# LAUNCHAGENT_LABEL=com.example.obsidian-sync # install_launchagent.sh (Mac)\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "fcd7456474af151a679444a99d0b408b1f5fde4c": {"t": 1785748396.117824, "n": 6126, "h": "584365a8577b428d", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: en (default, messages.en.yaml) or ru (messages.ru.yaml)\nAGENT_LOCALE=en\n# Author full install when capabilities.yaml is absent (all modules/connectors). OSS default: omit or 0.\n# OBSIDIAN_AGENT_FULL_INSTALL=1\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — weekly pattern synth → /memory confirm (LLM cost)\n# SYNTH_DOMAINS=finance,planning # domains for weekly job (Sunday ~04:00)\n# KNOWLEDGE_AGENT_WRITES=0 # 1 — allow append_knowledge_note (allowlisted paths)\n# MEMORY_SESSION_PERSIST=1 # SQLite dialogue history (survives restart)\n# MEMORY_WORKING_SET_PERSIST=1 # durable working-set entities (default: follow SESSION)\n# AGENT_TRACE=1 # jsonl cost/latency traces under logs/\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# LAUNCHAGENT_LABEL=com.example.obsidian-sync # install_launchagent.sh (Mac)\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "c8f2714e42d2617ded49d0519de2c0f43ea5683c": {"t": 1785748397.2230532, "n": 6016, "h": "90f8ca0bf911d536", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: en (default, messages.en.yaml) or ru (messages.ru.yaml)\nAGENT_LOCALE=en\n# Author full install when capabilities.yaml is absent (all modules/connectors). OSS default: omit or 0.\n# OBSIDIAN_AGENT_FULL_INSTALL=1\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite dialogue history (survives restart)\n# MEMORY_WORKING_SET_PERSIST=1 # durable working-set entities (default: follow SESSION)\n# AGENT_TRACE=1 # jsonl cost/latency traces under logs/\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# LAUNCHAGENT_LABEL=com.example.obsidian-sync # install_launchagent.sh (Mac)\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "8edd573d617ccf7d22a7005d5f561fe7b4b37fd4": {"t": 1785748398.3286448, "n": 5835, "h": "123bb65384b8ed84", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: en (default, messages.en.yaml) or ru (messages.ru.yaml)\nAGENT_LOCALE=en\n# Author full install when capabilities.yaml is absent (all modules/connectors). OSS default: omit or 0.\n# OBSIDIAN_AGENT_FULL_INSTALL=1\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# LAUNCHAGENT_LABEL=com.example.obsidian-sync # install_launchagent.sh (Mac)\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "4600a3926ed7bba3924912ebcfbc71dd30322f33": {"t": 1785748399.4175973, "n": 5698, "h": "77384cfdea084167", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: en (default, messages.en.yaml) or ru (messages.ru.yaml)\nAGENT_LOCALE=en\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# LAUNCHAGENT_LABEL=com.example.obsidian-sync # install_launchagent.sh (Mac)\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "b5affc8681ae1c9b8222bac585c4c9a71bf58f9d": {"t": 1785748400.5286984, "n": 5619, "h": "22f0d008f554f410", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: en (default, messages.en.yaml) or ru (messages.ru.yaml)\nAGENT_LOCALE=en\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "b0e34c415af3803d25427238d654291a6ef7b1a0": {"t": 1785748401.6234663, "n": 5621, "h": "3239f977f3f6b361", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: ru (default, messages.ru.yaml) or en (messages.en.yaml)\n# AGENT_LOCALE=en\n# Prod prompts: use @cap blocks in *.txt; disable dynamic capability appendix in host_query/health_tools\nAGENT_PROMPT_DYNAMIC_SUPPLEMENT=0\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "05e4a6d8cd350d1e0d2c254910ff1aa51360efa1": {"t": 1785748402.8827171, "n": 5482, "h": "b50e50e18e47f85d", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: ru (default, messages.ru.yaml) or en (messages.en.yaml)\n# AGENT_LOCALE=en\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n# RSYNC_PUSH_DELETE=1 # Mac→VPS: delete VPS files removed locally (default 1)\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "e027b8bbbc0b5b032387763578f3f2db1420f085": {"t": 1785748404.1282532, "n": 5402, "h": "e0c1b4dcd7720b5b", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\n# UI locale: ru (default, messages.ru.yaml) or en (messages.en.yaml)\n# AGENT_LOCALE=en\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "e45d5f364152d1f27c569df155a787a2179dab54": {"t": 1785748405.2039967, "n": 5315, "h": "e081a08b364b016e", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── unified_bot (рекомендуется для prod и локального запуска) ───\nTELEGRAM_UNIFIED_BOT_TOKEN=\nDEPLOY_MODE=single\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# ./scripts/setup.sh также копирует config/messages.ru.yaml и platform.yaml из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # только для legacy multi-bot (DEPLOY_MODE=multi)\n# DEPLOY_MODE=multi # три отдельных polling-процесса (legacy)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # см. блок unified_bot выше\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "6b1e3d16ea1d6bf9ae8db532c99f1e6a8074b530": {"t": 1785748406.2972913, "n": 5115, "h": "35d4e239739ec6ef", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\n# my.telegram.org → App api_id/api_hash — для скачивания видео >20 МБ (Telethon MTProto)\nTELEGRAM_API_ID=\nTELEGRAM_API_HASH=\n# Опционально Local Bot API: http://127.0.0.1:8081 + TELEGRAM_LOCAL=1\n# TELEGRAM_API_BASE=http://127.0.0.1:8081\nYTDLP_ENABLED=1\n# Прогрузка: ack каждые N сохранённых заметок (1 = на каждую)\nBULK_ACK_EVERY=1\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # фиксированный домен процесса (3 бота)\n# DEPLOY_MODE=multi # multi | single (один бот — позже)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # опционально: unified_bot (DEPLOY_MODE=single)\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.5-flash\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "1508d115e0f8a9723a009327d7ba68b19c529a7f": {"t": 1785748407.3809447, "n": 4787, "h": "3ed68c33d2ff9433", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # фиксированный домен процесса (3 бота)\n# DEPLOY_MODE=multi # multi | single (один бот — позже)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # опционально: unified_bot (DEPLOY_MODE=single)\n# KANBAN_AGENT_WRITES=1 # запись доски через apply_kanban_task (иначе только dry-run)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "df958f5595c5c3758a843370df87c76056138d98": {"t": 1785748408.4605114, "n": 4681, "h": "c72a2ef78b0cedfd", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db # canonical: {finance_bot}/finance.db\n# FINANCE_DB_PATH= # явный абсолютный путь к canonical (опционально)\n# FINANCE_USE_VAULT_DB=0 # legacy: 1 = писать в vault-реплику (не рекомендуется)\n# FINANCE_BOT_ROOT= # override каталога finance_bot для ./finance.db\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # фиксированный домен процесса (3 бота)\n# DEPLOY_MODE=multi # multi | single (один бот — позже)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # опционально: unified_bot (DEPLOY_MODE=single)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "2bb856ea539b7f7f3bc5d9bcfaaba782649deb12": {"t": 1785748409.5605774, "n": 4361, "h": "3c335b3e5fa82978", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# ./scripts/setup_agent_config.sh → config/agent/*.yaml и prompts/*.txt из *.example\n# Документация: docs/AGENT_CONFIG.md\n# AGENT_DOMAIN=finance # фиксированный домен процесса (3 бота)\n# DEPLOY_MODE=multi # multi | single (один бот — позже)\n# AGENT_MAX_ITERS=6 # override platform.yaml → agent.max_iters\n# AGENT_SESSION_MAX_TURNS=4\n# VAULT_REL_KNOWLEDGE=Knowledge # подкаталог базы знаний в VAULT_PATH (см. platform.yaml.example)\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # опционально: unified_bot (DEPLOY_MODE=single)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "3930f1f278353be403b50db86aad8c05e25fc564": {"t": 1785748410.6700728, "n": 4083, "h": "93e5b5444b7cbdc8", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# AGENT_DOMAIN=finance # фиксированный домен процесса (3 бота)\n# DEPLOY_MODE=multi # multi | single (один бот — позже)\n# AGENT_MAX_ITERS=6\n# AGENT_SESSION_MAX_TURNS=4\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_USER_PROFILE=config/agent/user_profile.md # общий профиль для всех доменов (см. user_profile.md.example)\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # опционально: unified_bot (DEPLOY_MODE=single)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "cab88e773cb08f626cd1b585a5f21db6c4c36493": {"t": 1785748412.7810616, "n": 3968, "h": "f85fa84da0f4dc9a", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Agent platform (shared/agent) ────────────────────────────────\n# AGENT_DOMAIN=finance # фиксированный домен процесса (3 бота)\n# DEPLOY_MODE=multi # multi | single (один бот — позже)\n# AGENT_MAX_ITERS=6\n# AGENT_SESSION_MAX_TURNS=4\n\n# ── Память: инсайты и синтезатор (shared/memory) ─────────────────\n# AGENT_MEMORY_DB=memory.db # SQLite; путь с пробелами — в кавычках: \"…/Obsidian Vault/…/memory.db\"\n# INSIGHTS_CONFIRMATIONS_THRESHOLD=3 # сколько раз паттерн встретился → на верификацию\n# INSIGHTS_PENDING_TTL_DAYS=30 # TTL неподтверждённых кандидатов\n# SYNTH_ENABLED=0 # 1 — включить фоновый синтез паттернов\n# SYNTH_DOMAINS=finance,planning # домены для weekly job (воскресенье ~04:00)\n# MEMORY_SESSION_PERSIST=1 # SQLite-история диалога (переживает рестарт)\n# TELEGRAM_UNIFIED_BOT_TOKEN= # опционально: unified_bot (DEPLOY_MODE=single)\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "68ac0a5e186f1aff0e68a3b1c430b9b14eec5f20": {"t": 1785748413.859997, "n": 2999, "h": "475299a10939112e", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Feature flags (опционально, для setup/будущих шагов sync) ─────\n# ENABLE_PLANNING_BOT=1\n# ENABLE_KNOWLEDGE_BOT=1\n# ENABLE_FINANCE_BOT=1\n# OBSIDIAN_SYNC_VAULT_MAINTENANCE=1\n# OBSIDIAN_SYNC_FINANCE_DASHBOARD=1\n# OBSIDIAN_SYNC_IPHONE_MAIL=1\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "ce0ac415b8f8119ee9af6a3416ad80a1a047f365": {"t": 1785748414.932404, "n": 2755, "h": "e44170b23a3d3f2e", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/root/obsidian-vault\n# SERVER_BOTS=/root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "4fcb4f3065a3a0e0bcc2e923731780982a58a279": {"t": 1785748416.0039585, "n": 2796, "h": "2eab30377e635950", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\n# Конфиг knowledge_bot (types.yaml, prompts, hubs_registry): по умолчанию knowledge_bot/config.\n# Не задавайте AGENT_CONFIG_PATH на несуществующий Agent/config — sync_hubs/retag сломаются.\n# AGENT_CONFIG_PATH=/path/to/knowledge_bot/config\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/opt/obsidian-vault\n# SERVER_BOTS=/opt/obsidian-bots # на prod может быть /root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "7aa4ae5cd844fc55326ea6ecc2f295a073b91d1d": {"t": 1785748418.1353521, "n": 2557, "h": "1d34178579595489", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\n# iPhone mail IMAP (obsidian_sync шаг 5b.4, только Mac — Gmail App Password)\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# GMAIL_IMAP_HOST=imap.gmail.com\n# GMAIL_IMAP_SUBJECT=Контекст_IPhone\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/opt/obsidian-vault\n# SERVER_BOTS=/opt/obsidian-bots # на prod может быть /root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "4d5d43028f280a7d195d0b3686c12fee840720cb": {"t": 1785748419.208076, "n": 2410, "h": "da1a355f0161223e", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\n# SERVER обязателен для scripts/deploy.sh и obsidian_sync.sh\nSERVER=your-ssh-host\n# SERVER_VAULT=/opt/obsidian-vault\n# SERVER_BOTS=/opt/obsidian-bots # на prod может быть /root/bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "1325e6ce2f230941d43c22beaee0c368f30394c0": {"t": 1785748420.3141763, "n": 2317, "h": "dbca20d2e979dfec", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер (опционально) ─────────────────────────\n# SERVER=your-ssh-host\n# SERVER_VAULT=/opt/obsidian-vault\n# SERVER_BOTS=/opt/obsidian-bots\n# LOCAL_VAULT=/same/as/VAULT_PATH\n\n# ── Общий fallback токена (если не заданы per-bot) ───────────────\n# TELEGRAM_BOT_TOKEN=\n\n# ── knowledge: vision / serendipity / RAG (опционально) ──────────\n# OPENROUTER_API_KEY=\n# VISION_MODEL=google/gemini-2.0-flash-001\n# SERENDIPITY_ENABLED=1\n# AUTHOR_CONTEXT=\n# ENABLE_WIKILINKS=1\n\n# ── ASR HTTP (опционально) ───────────────────────────────────────\n# ASR_BASE_URL=\n# ASR_LANGUAGE=ru,en\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "8b3242d60f04c8f2bc843c740ed38270dc35ca40": {"t": 1785748421.6233394, "n": 1877, "h": "d8db4ff1563a2b99", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\n# Дефолт в коде — UTC; для MSK задайте:\nTIMEZONE=Europe/Moscow\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\n# Год целей; если не задан — текущий календарный год\nGOALS_YEAR=2026\n# Опционально переопределить TZ для календаря/iphone sync:\n# CALENDAR_TZ=Europe/Moscow\n# SERENDIPITY_TZ=Europe/Moscow\n# IPHONE_SYNC_TZ=Europe/Moscow\n\n# ── knowledge_bot ────────────────────────────────────────────────\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# FIN_DASHBOARD_START_DATE=2026-02-15 # default: YYYY-01-01 текущего года\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\nSERVER=example-server\nSERVER_VAULT=/root/obsidian-vault\nSERVER_BOTS=/root/bots\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "ee362a40a12fbd55195ffc9cfa7c715d61d9b333": {"t": 1785748422.6939337, "n": 1560, "h": "1d1248a8dc561c72", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\nTIMEZONE=Europe/Moscow\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\nGOALS_YEAR=2026\n\n# ── knowledge_bot ────────────────────────────────────────────────\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Синхронизация / сервер ───────────────────────────────────────\nSERVER=example-server\nSERVER_VAULT=/root/obsidian-vault\nSERVER_BOTS=/root/bots\n# planning cron на сервере использует SERVER_VAULT как fallback для VAULT_PATH\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}, "f8d7783c8923b9c34cba746f2b87ba25cb0e2150": {"t": 1785748424.1285362, "n": 1333, "h": "9117d133ffca169c", "c": "# ─────────────────────────────────────────────────────────────────\n# obsidian-agent — единый .env (скопируйте в .env и заполните)\n# cp .env.example .env\n# Боты читают этот файл; имена ключей унифицированы (поддержаны и старые алиасы).\n# ─────────────────────────────────────────────────────────────────\n\n# ── Общее ────────────────────────────────────────────────────────\nVAULT_PATH=/Users/yourname/Documents/Obsidian Vault\nDEEPSEEK_API_KEY=sk-...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL=deepseek-chat\n# planning_bot исторически читает DEEPSEEK_API_TOKEN — можно продублировать ключ:\nDEEPSEEK_API_TOKEN=sk-...\nTIMEZONE=Europe/Moscow\n\n# ── planning_bot ─────────────────────────────────────────────────\nTELEGRAM_PLANNING_BOT_TOKEN=\nGMAIL_IMAP_USER=\nGMAIL_IMAP_APP_PASSWORD=\nGOALS_YEAR=2026\n\n# ── knowledge_bot ────────────────────────────────────────────────\nTELEGRAM_KNOWLEDGE_BOT_TOKEN=\nTELEGRAM_USER_ID=\nOPENROUTER_API_KEY=\nASR_MODEL=tiny\n\n# ── finance_bot ──────────────────────────────────────────────────\nTELEGRAM_FINANCE_BOT_TOKEN=\nTINKOFF_API_TOKEN=\nTINKOFF_IGNORE_ACCOUNT_IDS=\nBASE_CURRENCY=RUB\n# DATABASE_URL=sqlite+aiosqlite:///./finance.db\n# FINANCE_DB_PATH=\n\n# ── Примечание ───────────────────────────────────────────────────\n# Все три бота также принимают общий TELEGRAM_BOT_TOKEN как fallback.\n"}}, "docker-compose.yml": {"0cf0ac5eec012948995a4fbb7a7c122688394c83": {"t": 1785745250.4029598, "n": 707, "h": "b7db22750f5b1118", "c": "# Run the unified bot in a container.\n# 1) cp .env.example .env && fill VAULT_PATH is handled by the mount below\n# 2) set TELEGRAM_UNIFIED_BOT_TOKEN and DEEPSEEK_API_KEY in .env\n# 3) point ./vault (host) at your Obsidian vault, or edit the volume path\n# 4) docker compose up --build\nservices:\n unified-bot:\n build: .\n image: obsidian-agent:latest\n container_name: obsidian-agent\n restart: unless-stopped\n env_file: .env\n environment:\n # In-container vault path; override VAULT_PATH from .env so the mount wins.\n VAULT_PATH: /vault\n DEPLOY_MODE: single\n volumes:\n - ${HOST_VAULT_PATH:-./vault}:/vault\n # Bots use long-polling (no inbound ports needed).\n"}, "6455709836995a64692d9e6abf93a4728eb76101": {"t": 1785748394.7896163, "n": 707, "h": "b7db22750f5b1118", "c": "# Run the unified bot in a container.\n# 1) cp .env.example .env && fill VAULT_PATH is handled by the mount below\n# 2) set TELEGRAM_UNIFIED_BOT_TOKEN and DEEPSEEK_API_KEY in .env\n# 3) point ./vault (host) at your Obsidian vault, or edit the volume path\n# 4) docker compose up --build\nservices:\n unified-bot:\n build: .\n image: obsidian-agent:latest\n container_name: obsidian-agent\n restart: unless-stopped\n env_file: .env\n environment:\n # In-container vault path; override VAULT_PATH from .env so the mount wins.\n VAULT_PATH: /vault\n DEPLOY_MODE: single\n volumes:\n - ${HOST_VAULT_PATH:-./vault}:/vault\n # Bots use long-polling (no inbound ports needed).\n"}, "3c695a50fe905932821a26b3965ec12b3d3ac347": {"t": 1786067321.454797, "n": 707, "h": "b7db22750f5b1118", "c": "# Run the unified bot in a container.\n# 1) cp .env.example .env && fill VAULT_PATH is handled by the mount below\n# 2) set TELEGRAM_UNIFIED_BOT_TOKEN and DEEPSEEK_API_KEY in .env\n# 3) point ./vault (host) at your Obsidian vault, or edit the volume path\n# 4) docker compose up --build\nservices:\n unified-bot:\n build: .\n image: obsidian-agent:latest\n container_name: obsidian-agent\n restart: unless-stopped\n env_file: .env\n environment:\n # In-container vault path; override VAULT_PATH from .env so the mount wins.\n VAULT_PATH: /vault\n DEPLOY_MODE: single\n volumes:\n - ${HOST_VAULT_PATH:-./vault}:/vault\n # Bots use long-polling (no inbound ports needed).\n"}}, "scripts/smoke_imports.sh": {"0cf0ac5eec012948995a4fbb7a7c122688394c83": {"t": 1785745943.5335054, "n": 3171, "h": "dc2ea2677fc1ca9a", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nMONOREPO=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\n# finance_bot Settings валится без токенов при import bot.main (см. tests/conftest.py)\nexport TELEGRAM_BOT_TOKEN=\"${TELEGRAM_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_FINANCE_BOT_TOKEN=\"${TELEGRAM_FINANCE_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_UNIFIED_BOT_TOKEN=\"${TELEGRAM_UNIFIED_BOT_TOKEN:-ci-smoke-test-token}\"\nexport DEEPSEEK_API_KEY=\"${DEEPSEEK_API_KEY:-ci-smoke-test-key}\"\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$MONOREPO\"/shared \"$MONOREPO\"/finance_bot/bot \"$MONOREPO\"/knowledge_bot \"$MONOREPO\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$MONOREPO/$comp/$v/bin/python\" ] && venv_py=\"$MONOREPO/$comp/$v/bin/python\"\n done\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" = 1 ]; then\n local py\n py=\"$(common_python_for_venv)\"\n echo \" creating $comp/.venv via $py\"\n \"$py\" -m venv \"$MONOREPO/$comp/.venv\"\n venv_py=\"$MONOREPO/$comp/.venv/bin/python\"\n fi\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$MONOREPO/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\" -c \"$MONOREPO/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\n_smoke_import finance_bot 'import unified_bot.main'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "196a088aa1f89fbc310fe81d39985c11ea689df2": {"t": 1785748394.9650123, "n": 3171, "h": "dc2ea2677fc1ca9a", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nMONOREPO=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\n# finance_bot Settings валится без токенов при import bot.main (см. tests/conftest.py)\nexport TELEGRAM_BOT_TOKEN=\"${TELEGRAM_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_FINANCE_BOT_TOKEN=\"${TELEGRAM_FINANCE_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_UNIFIED_BOT_TOKEN=\"${TELEGRAM_UNIFIED_BOT_TOKEN:-ci-smoke-test-token}\"\nexport DEEPSEEK_API_KEY=\"${DEEPSEEK_API_KEY:-ci-smoke-test-key}\"\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$MONOREPO\"/shared \"$MONOREPO\"/finance_bot/bot \"$MONOREPO\"/knowledge_bot \"$MONOREPO\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$MONOREPO/$comp/$v/bin/python\" ] && venv_py=\"$MONOREPO/$comp/$v/bin/python\"\n done\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" = 1 ]; then\n local py\n py=\"$(common_python_for_venv)\"\n echo \" creating $comp/.venv via $py\"\n \"$py\" -m venv \"$MONOREPO/$comp/.venv\"\n venv_py=\"$MONOREPO/$comp/.venv/bin/python\"\n fi\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$MONOREPO/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\" -c \"$MONOREPO/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\n_smoke_import finance_bot 'import unified_bot.main'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "525023060f6d636495596c3896b3e48c89316578": {"t": 1785748396.0479956, "n": 3118, "h": "c86a73b63278fbcc", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nMONOREPO=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\n# finance_bot Settings валится без токенов при import bot.main (см. tests/conftest.py)\nexport TELEGRAM_BOT_TOKEN=\"${TELEGRAM_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_FINANCE_BOT_TOKEN=\"${TELEGRAM_FINANCE_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_UNIFIED_BOT_TOKEN=\"${TELEGRAM_UNIFIED_BOT_TOKEN:-ci-smoke-test-token}\"\nexport DEEPSEEK_API_KEY=\"${DEEPSEEK_API_KEY:-ci-smoke-test-key}\"\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$MONOREPO\"/shared \"$MONOREPO\"/finance_bot/bot \"$MONOREPO\"/knowledge_bot \"$MONOREPO\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$MONOREPO/$comp/$v/bin/python\" ] && venv_py=\"$MONOREPO/$comp/$v/bin/python\"\n done\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" = 1 ]; then\n local py\n py=\"$(common_python_for_venv)\"\n echo \" creating $comp/.venv via $py\"\n \"$py\" -m venv \"$MONOREPO/$comp/.venv\"\n venv_py=\"$MONOREPO/$comp/.venv/bin/python\"\n fi\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$MONOREPO/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\" -c \"$MONOREPO/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "4d019abfa4cf92ff98249088045068716e20e00e": {"t": 1785748397.1460876, "n": 2720, "h": "74a6398066d728d4", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nMONOREPO=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$MONOREPO\"/shared \"$MONOREPO\"/finance_bot/bot \"$MONOREPO\"/knowledge_bot \"$MONOREPO\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$MONOREPO/$comp/$v/bin/python\" ] && venv_py=\"$MONOREPO/$comp/$v/bin/python\"\n done\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" = 1 ]; then\n local py\n py=\"$(common_python_for_venv)\"\n echo \" creating $comp/.venv via $py\"\n \"$py\" -m venv \"$MONOREPO/$comp/.venv\"\n venv_py=\"$MONOREPO/$comp/.venv/bin/python\"\n fi\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$MONOREPO/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\" -c \"$MONOREPO/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "68ac0a5e186f1aff0e68a3b1c430b9b14eec5f20": {"t": 1785748398.236118, "n": 2485, "h": "03ad72448e653521", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nMONOREPO=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$MONOREPO\"/shared \"$MONOREPO\"/finance_bot/bot \"$MONOREPO\"/knowledge_bot \"$MONOREPO\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$MONOREPO/$comp/$v/bin/python\" ] && venv_py=\"$MONOREPO/$comp/$v/bin/python\"\n done\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$MONOREPO/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\" -c \"$MONOREPO/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "847bfab53b1247bdb58fc39c7f09207b53e97bb1": {"t": 1785748399.3192387, "n": 2437, "h": "d4e7e839e0b107c0", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$ROOT/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$ROOT\"/shared \"$ROOT\"/finance_bot/bot \"$ROOT\"/knowledge_bot \"$ROOT\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$ROOT/$comp/$v/bin/python\" ] && venv_py=\"$ROOT/$comp/$v/bin/python\"\n done\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$ROOT/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$ROOT/$comp/requirements.txt\" -c \"$ROOT/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$ROOT/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "36bdc669e22425bea1555aa2de40a893744fafc0": {"t": 1785748400.3785233, "n": 2444, "h": "2aca713e180fd4ee", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$ROOT/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$ROOT\"/shared \"$ROOT\"/finance_bot/bot \"$ROOT\"/knowledge_bot \"$ROOT\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$ROOT/$comp/$v/bin/python\" ] && venv_py=\"$ROOT/$comp/$v/bin/python\"\n done\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$ROOT/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$ROOT/$comp/requirements.txt\" -c \"$ROOT/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$ROOT/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.bot import PlanningBot; from shared.telegram import send_long_message'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "e47722d4d4bf30f128d72bd90bc0b1d7454f4505": {"t": 1785748401.740584, "n": 2386, "h": "bf2e1503041232f4", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$ROOT/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$ROOT\"/shared \"$ROOT\"/finance_bot/bot \"$ROOT\"/knowledge_bot \"$ROOT\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$ROOT/$comp/$v/bin/python\" ] && venv_py=\"$ROOT/$comp/$v/bin/python\"\n done\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n local cons=()\n [ -f \"$ROOT/constraints.txt\" ] && cons=(-c \"$ROOT/constraints.txt\")\n \"$PYTHON_CMD\" -m pip install -q -r \"$ROOT/$comp/requirements.txt\" \"${cons[@]}\"\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.bot import PlanningBot; from shared.telegram import send_long_message'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "ce0ac415b8f8119ee9af6a3416ad80a1a047f365": {"t": 1785748404.2900264, "n": 2351, "h": "ac44cd6bb7d2a7b0", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$ROOT/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$ROOT\"/shared \"$ROOT\"/finance_bot/bot \"$ROOT\"/knowledge_bot \"$ROOT\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$ROOT/$comp/$v/bin/python\" ] && venv_py=\"$ROOT/$comp/$v/bin/python\"\n done\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n local cons=()\n [ -f \"$ROOT/constraints.txt\" ] && cons=(-c \"$ROOT/constraints.txt\")\n \"$PYTHON_CMD\" -m pip install -q -r \"$ROOT/$comp/requirements.txt\" \"${cons[@]}\"\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.tools.vault_maintenance import run_all'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}, "3c695a50fe905932821a26b3965ec12b3d3ac347": {"t": 1786067512.1703207, "n": 3171, "h": "dc2ea2677fc1ca9a", "c": "#!/usr/bin/env bash\n# Smoke: py_compile + import ключевых модулей (локально или в CI с SMOKE_INSTALL=1).\nset -euo pipefail\n\nMONOREPO=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\n# shellcheck source=scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\n\nINSTALL=\"${SMOKE_INSTALL:-0}\"\nFAILED=0\n\n# finance_bot Settings валится без токенов при import bot.main (см. tests/conftest.py)\nexport TELEGRAM_BOT_TOKEN=\"${TELEGRAM_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_FINANCE_BOT_TOKEN=\"${TELEGRAM_FINANCE_BOT_TOKEN:-ci-smoke-test-token}\"\nexport TELEGRAM_UNIFIED_BOT_TOKEN=\"${TELEGRAM_UNIFIED_BOT_TOKEN:-ci-smoke-test-token}\"\nexport DEEPSEEK_API_KEY=\"${DEEPSEEK_API_KEY:-ci-smoke-test-key}\"\n\necho \"=== py_compile (без зависимостей) ===\"\nwhile IFS= read -r f; do\n [ -n \"$f\" ] || continue\n if ! python3 -m py_compile \"$f\" 2>/dev/null; then\n echo \" FAIL $f\" >&2\n FAILED=1\n fi\ndone <<EOF\n$(find \"$MONOREPO\"/shared \"$MONOREPO\"/finance_bot/bot \"$MONOREPO\"/knowledge_bot \"$MONOREPO\"/planning_bot \\\n -name '*.py' ! -path '*/venv/*' ! -path '*/.venv/*' ! -path '*/__pycache__/*' 2>/dev/null)\nEOF\n[ \"$FAILED\" -eq 0 ] && echo \" compile OK\"\n\n_smoke_import() {\n local comp=\"$1\" code=\"$2\"\n echo -n \" import $comp: \"\n local venv_py=\"\"\n for v in .venv venv; do\n [ -x \"$MONOREPO/$comp/$v/bin/python\" ] && venv_py=\"$MONOREPO/$comp/$v/bin/python\"\n done\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" = 1 ]; then\n local py\n py=\"$(common_python_for_venv)\"\n echo \" creating $comp/.venv via $py\"\n \"$py\" -m venv \"$MONOREPO/$comp/.venv\"\n venv_py=\"$MONOREPO/$comp/.venv/bin/python\"\n fi\n if [ -n \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n if ! \"$venv_py\" -m pip show -q requests 2>/dev/null; then\n echo \"SKIP (venv without deps, set SMOKE_INSTALL=1)\"\n return 0\n fi\n fi\n if [ -z \"$venv_py\" ] && [ \"$INSTALL\" != 1 ]; then\n echo \"SKIP (no venv, set SMOKE_INSTALL=1)\"\n return 0\n fi\n if ! bootstrap_python \"$comp\" 2>/dev/null; then\n echo \"FAIL bootstrap\" >&2\n FAILED=1\n return\n fi\n if [ \"$INSTALL\" = 1 ]; then\n \"$PYTHON_CMD\" -m pip install -q --upgrade pip\n if [ -f \"$MONOREPO/constraints.txt\" ]; then\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\" -c \"$MONOREPO/constraints.txt\"\n else\n \"$PYTHON_CMD\" -m pip install -q -r \"$MONOREPO/$comp/requirements.txt\"\n fi\n fi\n if \"$PYTHON_CMD\" -c \"$code\" 2>/dev/null; then\n echo OK\n else\n echo FAIL >&2\n \"$PYTHON_CMD\" -c \"$code\" 2>&1 | tail -5 >&2 || true\n FAILED=1\n fi\n}\n\necho \"=== import smoke ===\"\n_smoke_import finance_bot 'import bot.main'\n_smoke_import knowledge_bot 'from knowledge_bot.app.bot import main'\n_smoke_import planning_bot 'from planning_bot.app.main import main; from planning_bot.app.bot import PlanningBot'\n\n_smoke_import finance_bot 'import unified_bot.main'\n\nif bootstrap_python finance_bot 2>/dev/null; then\n if \"$PYTHON_CMD\" -c 'import shared.bootstrap, shared.charts.mermaid' 2>/dev/null; then\n echo \" import shared: OK\"\n else\n echo \" import shared: SKIP (deps)\" >&2\n fi\nfi\n\nif [ \"$FAILED\" -ne 0 ]; then\n echo \"❌ smoke_imports FAILED\" >&2\n exit 1\nfi\necho \"✅ smoke_imports OK\"\n"}}, "finance_bot/scripts/run.sh": {"0cf0ac5eec012948995a4fbb7a7c122688394c83": {"t": 1785745972.1136293, "n": 780, "h": "41af191a362c0c29", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMONOREPO=\"$(cd \"$ROOT/..\" && pwd)\"\n# shellcheck source=../../scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\nbootstrap_python finance_bot\n\nif [ -z \"$TELEGRAM_FINANCE_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_UNIFIED_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"Error: TELEGRAM_FINANCE_BOT_TOKEN, TELEGRAM_UNIFIED_BOT_TOKEN, or TELEGRAM_BOT_TOKEN required\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ] && [ -z \"$DEEPSEEK_API_TOKEN\" ]; then\n echo \"Error: DEEPSEEK_API_KEY (or DEEPSEEK_API_TOKEN) required\"\n exit 1\nfi\n\necho \"Starting finance host (unified bot with finance token preference)...\"\necho \"\"\n\nmkdir -p logs\nexec \"$PYTHON_CMD\" -m bot.main\n"}, "c04272f31468c05470b74fd251ebc45496794f65": {"t": 1785748394.115, "n": 780, "h": "41af191a362c0c29", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMONOREPO=\"$(cd \"$ROOT/..\" && pwd)\"\n# shellcheck source=../../scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\nbootstrap_python finance_bot\n\nif [ -z \"$TELEGRAM_FINANCE_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_UNIFIED_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"Error: TELEGRAM_FINANCE_BOT_TOKEN, TELEGRAM_UNIFIED_BOT_TOKEN, or TELEGRAM_BOT_TOKEN required\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ] && [ -z \"$DEEPSEEK_API_TOKEN\" ]; then\n echo \"Error: DEEPSEEK_API_KEY (or DEEPSEEK_API_TOKEN) required\"\n exit 1\nfi\n\necho \"Starting finance host (unified bot with finance token preference)...\"\necho \"\"\n\nmkdir -p logs\nexec \"$PYTHON_CMD\" -m bot.main\n"}, "ce0ac415b8f8119ee9af6a3416ad80a1a047f365": {"t": 1785748395.2652774, "n": 684, "h": "aecd9a77d10ec948", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\nMONOREPO=\"$(cd \"$ROOT/..\" && pwd)\"\n# shellcheck source=../../scripts/lib/bootstrap_python.sh\nsource \"$MONOREPO/scripts/lib/bootstrap_python.sh\"\nbootstrap_python finance_bot\n\nif [ -z \"$TELEGRAM_FINANCE_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"❌ Ошибка: TELEGRAM_FINANCE_BOT_TOKEN или TELEGRAM_BOT_TOKEN не установлен\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ] && [ -z \"$DEEPSEEK_API_TOKEN\" ]; then\n echo \"❌ Ошибка: DEEPSEEK_API_KEY (или DEEPSEEK_API_TOKEN) не установлен\"\n exit 1\nfi\n\necho \"🚀 Запуск finance_bot...\"\necho \"\"\n\nmkdir -p logs\nexec \"$PYTHON_CMD\" -m bot.main\n"}, "47b85b19ee6c368c8f03533751ab838e1833f391": {"t": 1785748396.3599765, "n": 1206, "h": "331e68f1c07f8fdc", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\ncd \"$ROOT\"\n\n# Загружаем переменные окружения: общий монорепо ../.env, затем локальный .env (оверрайд)\nif [ -f \"$ROOT/../.env\" ]; then\n set -a; source \"$ROOT/../.env\"; set +a\nfi\nif [ -f .env ]; then\n set -a\n source .env\n set +a\nfi\n\n# Проверяем наличие обязательных переменных (поддержка единого .env: FINANCE-токен или общий)\nif [ -z \"$TELEGRAM_FINANCE_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"❌ Ошибка: TELEGRAM_FINANCE_BOT_TOKEN или TELEGRAM_BOT_TOKEN не установлен\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ] && [ -z \"$DEEPSEEK_API_TOKEN\" ]; then\n echo \"❌ Ошибка: DEEPSEEK_API_KEY (или DEEPSEEK_API_TOKEN) не установлен\"\n exit 1\nfi\n\necho \"🚀 Запуск finance_bot...\"\necho \"\"\n\n# Активируем venv если есть\nif [ -d \".venv\" ]; then\n PYTHON_CMD=\".venv/bin/python\"\nelse\n PYTHON_CMD=\"python3\"\nfi\n\n# PYTHONPATH: finance_bot + родитель (shared/ в $SERVER_BOTS)\nexport PYTHONPATH=\"$(cd \"$(dirname \"$0\")/..\" && pwd):$(cd \"$(dirname \"$0\")/../..\" && pwd)${PYTHONPATH:+:$PYTHONPATH}\"\n\n# Создаем директорию для логов если нужно\nmkdir -p logs\n\n# Запускаем бота\nexec $PYTHON_CMD -m bot.main\n"}, "eb3b7428306e4f32f812bb8eabcac39596feddb2": {"t": 1785748397.454132, "n": 1204, "h": "7110be6e6db78bfb", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\ncd \"$ROOT\"\n\n# Загружаем переменные окружения: общий монорепо ../.env, затем локальный .env (оверрайд)\nif [ -f \"$ROOT/../.env\" ]; then\n set -a; source \"$ROOT/../.env\"; set +a\nfi\nif [ -f .env ]; then\n set -a\n source .env\n set +a\nfi\n\n# Проверяем наличие обязательных переменных (поддержка единого .env: FINANCE-токен или общий)\nif [ -z \"$TELEGRAM_FINANCE_BOT_TOKEN\" ] && [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"❌ Ошибка: TELEGRAM_FINANCE_BOT_TOKEN или TELEGRAM_BOT_TOKEN не установлен\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ] && [ -z \"$DEEPSEEK_API_TOKEN\" ]; then\n echo \"❌ Ошибка: DEEPSEEK_API_KEY (или DEEPSEEK_API_TOKEN) не установлен\"\n exit 1\nfi\n\necho \"🚀 Запуск finance_bot...\"\necho \"\"\n\n# Активируем venv если есть\nif [ -d \".venv\" ]; then\n PYTHON_CMD=\".venv/bin/python\"\nelse\n PYTHON_CMD=\"python3\"\nfi\n\n# PYTHONPATH: finance_bot + родитель (shared/ в /root/bots)\nexport PYTHONPATH=\"$(cd \"$(dirname \"$0\")/..\" && pwd):$(cd \"$(dirname \"$0\")/../..\" && pwd)${PYTHONPATH:+:$PYTHONPATH}\"\n\n# Создаем директорию для логов если нужно\nmkdir -p logs\n\n# Запускаем бота\nexec $PYTHON_CMD -m bot.main\n"}, "f8d7783c8923b9c34cba746f2b87ba25cb0e2150": {"t": 1785748398.5265224, "n": 1033, "h": "cc518e845498d428", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\ncd \"$ROOT\"\n\n# Загружаем переменные окружения из .env если есть\nif [ -f .env ]; then\n set -a\n source .env\n set +a\nfi\n\n# Проверяем наличие обязательных переменных\nif [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"❌ Ошибка: TELEGRAM_BOT_TOKEN не установлен\"\n echo \"Создай файл .env или установи переменную окружения\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ]; then\n echo \"❌ Ошибка: DEEPSEEK_API_KEY не установлен\"\n echo \"Создай файл .env или установи переменную окружения\"\n exit 1\nfi\n\necho \"🚀 Запуск finance_bot...\"\necho \"\"\n\n# Активируем venv если есть\nif [ -d \".venv\" ]; then\n PYTHON_CMD=\".venv/bin/python\"\nelse\n PYTHON_CMD=\"python3\"\nfi\n\n# PYTHONPATH: finance_bot + родитель (shared/ в /root/bots)\nexport PYTHONPATH=\"$(cd \"$(dirname \"$0\")/..\" && pwd):$(cd \"$(dirname \"$0\")/../..\" && pwd)${PYTHONPATH:+:$PYTHONPATH}\"\n\n# Создаем директорию для логов если нужно\nmkdir -p logs\n\n# Запускаем бота\nexec $PYTHON_CMD -m bot.main\n"}, "bccffa9617ff1c82e77d3b879dec82073271c81c": {"t": 1785748399.6355245, "n": 854, "h": "432793780694c9fa", "c": "#!/bin/bash\n# Скрипт для запуска finance_bot\n\nROOT=\"$(cd \"$(dirname \"$0\")/..\" && pwd)\"\ncd \"$ROOT\"\n\n# Загружаем переменные окружения из .env если есть\nif [ -f .env ]; then\n set -a\n source .env\n set +a\nfi\n\n# Проверяем наличие обязательных переменных\nif [ -z \"$TELEGRAM_BOT_TOKEN\" ]; then\n echo \"❌ Ошибка: TELEGRAM_BOT_TOKEN не установлен\"\n echo \"Создай файл .env или установи переменную окружения\"\n exit 1\nfi\n\nif [ -z \"$DEEPSEEK_API_KEY\" ]; then\n echo \"❌ Ошибка: DEEPSEEK_API_KEY не установлен\"\n echo \"Создай файл .env или установи переменную окружения\"\n exit 1\nfi\n\necho \"🚀 Запуск finance_bot...\"\necho \"\"\n\n# Активируем venv если есть\nif [ -d \".venv\" ]; then\n PYTHON_CMD=\".venv/bin/python\"\nelse\n PYTHON_CMD=\"python3\"\nfi\n\n# Создаем директорию для логов если нужно\nmkdir -p logs\n\n# Запускаем бота\nexec $PYTHON_CMD -m bot.main\n"}}, "Dockerfile": {"0cf0ac5eec012948995a4fbb7a7c122688394c83": {"t": 1785746994.955601, "n": 1216, "h": "fe63d9f5ac2de69a", "c": "# obsidian-agent — unified_bot runtime image.\n# Minimal stack (finance + planning + agent + voice/ASR). Heavy knowledge\n# ingest (OCR/vision) is intentionally out of scope for this image; add\n# knowledge_bot/requirements.txt if you enable that domain.\nFROM python:3.12-slim\n\n# ffmpeg: Telegram voice -> ASR; libgomp1: ctranslate2/onnxruntime (faster-whisper)\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n ffmpeg \\\n libgomp1 \\\n rsync \\\n openssh-client \\\n && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\n\nENV PYTHONUNBUFFERED=1 \\\n PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONPATH=/app \\\n DEPLOY_MODE=single \\\n AGENT_LOCALE=en\n\n# Install deps first for layer caching.\nCOPY constraints.txt requirements-min.txt ./\nCOPY finance_bot/requirements.txt finance_bot/requirements.txt\nRUN pip install --no-cache-dir -r requirements-min.txt -c constraints.txt\n\nCOPY . .\n\n# Run as non-root.\nRUN useradd --create-home --uid 10001 appuser \\\n && chown -R appuser:appuser /app\nUSER appuser\n\n# The vault is mounted at runtime; configuration comes from env / .env.\n# VAULT_PATH, TELEGRAM_UNIFIED_BOT_TOKEN, DEEPSEEK_API_KEY are required.\nCMD [\"python\", \"-m\", \"unified_bot.main\"]\n"}, "6455709836995a64692d9e6abf93a4728eb76101": {"t": 1785748394.3354537, "n": 1216, "h": "fe63d9f5ac2de69a", "c": "# obsidian-agent — unified_bot runtime image.\n# Minimal stack (finance + planning + agent + voice/ASR). Heavy knowledge\n# ingest (OCR/vision) is intentionally out of scope for this image; add\n# knowledge_bot/requirements.txt if you enable that domain.\nFROM python:3.12-slim\n\n# ffmpeg: Telegram voice -> ASR; libgomp1: ctranslate2/onnxruntime (faster-whisper)\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n ffmpeg \\\n libgomp1 \\\n rsync \\\n openssh-client \\\n && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\n\nENV PYTHONUNBUFFERED=1 \\\n PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONPATH=/app \\\n DEPLOY_MODE=single \\\n AGENT_LOCALE=en\n\n# Install deps first for layer caching.\nCOPY constraints.txt requirements-min.txt ./\nCOPY finance_bot/requirements.txt finance_bot/requirements.txt\nRUN pip install --no-cache-dir -r requirements-min.txt -c constraints.txt\n\nCOPY . .\n\n# Run as non-root.\nRUN useradd --create-home --uid 10001 appuser \\\n && chown -R appuser:appuser /app\nUSER appuser\n\n# The vault is mounted at runtime; configuration comes from env / .env.\n# VAULT_PATH, TELEGRAM_UNIFIED_BOT_TOKEN, DEEPSEEK_API_KEY are required.\nCMD [\"python\", \"-m\", \"unified_bot.main\"]\n"}, "3c695a50fe905932821a26b3965ec12b3d3ac347": {"t": 1786068003.834213, "n": 1216, "h": "fe63d9f5ac2de69a", "c": "# obsidian-agent — unified_bot runtime image.\n# Minimal stack (finance + planning + agent + voice/ASR). Heavy knowledge\n# ingest (OCR/vision) is intentionally out of scope for this image; add\n# knowledge_bot/requirements.txt if you enable that domain.\nFROM python:3.12-slim\n\n# ffmpeg: Telegram voice -> ASR; libgomp1: ctranslate2/onnxruntime (faster-whisper)\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n ffmpeg \\\n libgomp1 \\\n rsync \\\n openssh-client \\\n && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\n\nENV PYTHONUNBUFFERED=1 \\\n PYTHONDONTWRITEBYTECODE=1 \\\n PYTHONPATH=/app \\\n DEPLOY_MODE=single \\\n AGENT_LOCALE=en\n\n# Install deps first for layer caching.\nCOPY constraints.txt requirements-min.txt ./\nCOPY finance_bot/requirements.txt finance_bot/requirements.txt\nRUN pip install --no-cache-dir -r requirements-min.txt -c constraints.txt\n\nCOPY . .\n\n# Run as non-root.\nRUN useradd --create-home --uid 10001 appuser \\\n && chown -R appuser:appuser /app\nUSER appuser\n\n# The vault is mounted at runtime; configuration comes from env / .env.\n# VAULT_PATH, TELEGRAM_UNIFIED_BOT_TOKEN, DEEPSEEK_API_KEY are required.\nCMD [\"python\", \"-m\", \"unified_bot.main\"]\n"}}, "tests/conftest.py": {"0cf0ac5eec012948995a4fbb7a7c122688394c83": {"t": 1786068248.8588107, "n": 5037, "h": "5b2168f21d5152b0", "c": "\"\"\"Shared fixtures for agent platform tests.\"\"\"\nfrom __future__ import annotations\n\nimport os\nimport sys\nfrom pathlib import Path\n\nROOT = Path(__file__).resolve().parent.parent\nFINANCE_BOT = ROOT / \"finance_bot\"\nFIXTURE_VAULT = Path(__file__).parent / \"fixtures\" / \"vault\"\n\n\nos.environ.setdefault(\"TELEGRAM_BOT_TOKEN\", \"test-token-for-pytest\")\nos.environ.setdefault(\"TELEGRAM_FINANCE_BOT_TOKEN\", \"test-token-for-pytest\")\nos.environ.setdefault(\"DEEPSEEK_API_KEY\", \"test-key-for-pytest\")\nos.environ.setdefault(\"AGENT_LOCALE\", \"en\")\n\nfor p in (str(FINANCE_BOT), str(ROOT)):\n if p not in sys.path:\n sys.path.insert(0, p)\n\n\nimport pytest\n\n\n@pytest.fixture(autouse=True)\ndef _clear_capability_caches():\n \"\"\"Env overrides in one test must not leak via get_capabilities() lru_cache.\"\"\"\n from shared.capabilities.profile import clear_capabilities_cache\n from shared.capabilities.ui_bindings import clear_ui_bindings_cache\n from shared.telegram.host.domain_routing import clear_domain_routing_cache\n from shared.telegram.host.menu_detection import clear_menu_detection_cache\n\n clear_capabilities_cache()\n clear_ui_bindings_cache()\n clear_domain_routing_cache()\n clear_menu_detection_cache()\n try:\n from planning_bot.app.menu_labels import clear_menu_label_cache\n\n clear_menu_label_cache()\n except Exception:\n pass\n yield\n clear_capabilities_cache()\n clear_ui_bindings_cache()\n clear_domain_routing_cache()\n clear_menu_detection_cache()\n try:\n from planning_bot.app.menu_labels import clear_menu_label_cache\n\n clear_menu_label_cache()\n except Exception:\n pass\n\n\n@pytest.fixture(autouse=True)\ndef _pytest_agent_locale_ru(monkeypatch):\n \"\"\"RU vault fixtures (100_Задачи) + legacy assertions; locale parity has dedicated tests.\"\"\"\n monkeypatch.setenv(\"AGENT_LOCALE\", \"ru\")\n from shared import i18n\n from shared import vault_paths_config as vp\n from shared import domain_messages as dm\n\n i18n.clear_messages_cache()\n vp.vault_paths_config.cache_clear()\n dm.clear_domain_messages_cache()\n yield\n i18n.clear_messages_cache()\n vp.vault_paths_config.cache_clear()\n dm.clear_domain_messages_cache()\n\n\n@pytest.fixture(autouse=True)\ndef _knowledge_subdir_for_tests(monkeypatch):\n \"\"\"Stable rel_path prefix in knowledge tests (matches legacy fixture paths).\"\"\"\n monkeypatch.setenv(\"VAULT_REL_KNOWLEDGE\", \"700_База_Данных\")\n from shared.agent.platform_config import load_platform_config\n\n load_platform_config.cache_clear()\n\n\n@pytest.fixture(autouse=True)\ndef _domain_messages_merge_example(monkeypatch):\n \"\"\"Tests see domain_messages en+ru examples merged under local overrides.\"\"\"\n from functools import lru_cache\n\n from shared import domain_messages as dm\n from shared.yaml_config import deep_merge, load_yaml\n\n cfg = ROOT / \"config\"\n ru = load_yaml(cfg / \"domain_messages.ru.yaml.example\", default={})\n en = load_yaml(cfg / \"domain_messages.en.yaml.example\", default={})\n merged = deep_merge(ru, en)\n local_path = cfg / \"domain_messages.en.yaml\"\n if not local_path.is_file():\n local_path = cfg / \"domain_messages.yaml\"\n local = load_yaml(local_path, default={}) if local_path.is_file() else {}\n if local:\n merged = deep_merge(merged, local)\n\n @lru_cache(maxsize=2)\n def _merged_domain(_locale: str) -> dict:\n if str(_locale).startswith(\"en\"):\n return deep_merge(ru, en)\n return ru\n\n monkeypatch.setattr(dm, \"_domain\", _merged_domain)\n dm.clear_domain_messages_cache()\n try:\n from planning_bot.services import action_log_parser as alp\n from planning_bot.services import action_logger as al\n from planning_bot.services.action_log_format import _glued_type_re, _loose_json_block_re\n from planning_bot.services.iphone_snapshot_names import clear_kontext_prefix_cache\n\n alp._log_entry_pattern.cache_clear()\n al._log_entry_re.cache_clear()\n al._legacy_log_entry_re.cache_clear()\n _glued_type_re.cache_clear()\n _loose_json_block_re.cache_clear()\n clear_kontext_prefix_cache()\n except Exception:\n pass\n yield\n dm.clear_domain_messages_cache()\n try:\n from planning_bot.services.iphone_snapshot_names import clear_kontext_prefix_cache\n\n clear_kontext_prefix_cache()\n except Exception:\n pass\n\n\ndef knowledge_rel(*parts: str) -> str:\n from shared.vault_layout import knowledge_subdir\n\n base = knowledge_subdir()\n tail = \"/\".join(p.strip(\"/\") for p in parts if p)\n return f\"{base}/{tail}\" if tail else base\n\n\n@pytest.fixture(scope=\"session\")\nasync def finance_db():\n \"\"\"SQLite schema for finance_bot tests that touch AsyncSessionLocal.\"\"\"\n from bot.db import Base, get_engine\n import bot.models # noqa: F401 — register tables on Base\n\n engine = get_engine()\n async with engine.begin() as conn:\n await conn.run_sync(Base.metadata.create_all)\n yield\n await engine.dispose()\n"}}}}