{"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 </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 </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 </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 </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 </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 </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 </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 </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 </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 </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"}}}}