Files
beaver-agent/beaver_agent/vault.py
T

58 lines
2.7 KiB
Python

"""Где что лежит в vault и в какой зоне живёт агент."""
from __future__ import annotations
import os
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo
TZ = "Europe/Warsaw"
ZONE = ZoneInfo(TZ)
LAUNCH = datetime(2026, 8, 28, tzinfo=ZONE)
"""Ночное закрытие трогает только чаты с активностью после запуска системы."""
VAULT = Path(os.environ.get("BEAVER_VAULT", "/vault"))
"""`/vault` в контейнере; `BEAVER_VAULT` - чтобы собрать конфиг на маке."""
CHATS = VAULT / "💬 чаты"
DIARY = VAULT / "📅 дни"
PEOPLE = VAULT / "👤 люди"
BOARDS = VAULT / "📆 доски"
THOUGHTS = VAULT / "🧠 мысли"
BEAVER = VAULT / "мета" / "бобер"
"""Дом агента: всё, что он ведёт сам, лежит здесь."""
PROMPTS = BEAVER / "промпты"
GRANULES = PROMPTS / "гранулы"
SKILLS = BEAVER / "скиллы"
DAYS = BEAVER / "дни"
DIGESTS = BEAVER / "выжимки"
INDEX = BEAVER / "индекс.md"
NOTES = BEAVER / "наблюдения"
PORTRAIT = NOTES / "Бобёр - наблюдения.md"
REPLIES = BEAVER / "реплики"
CURATOR_JOURNAL = BEAVER / "куратор.md"
"""Первая строка - время прошлого прогона; сами записи лежат в `CURATOR_RUNS`."""
CURATOR_RUNS = BEAVER / "куратор"
OWN_DIARY = BEAVER / "дневник"
"""Его собственный дневник, файл на день: то, что он думает, без логов."""
JOURNAL = BEAVER / "журнал"
"""Рабочий журнал, файл на день: следы тиков, логи, разбор промахов."""
LEISURE = BEAVER / "досуг.md"
"""Раскладка суток по тикам досуга: пишет её модель, механизм только читает."""
STATE_DIR = Path(os.environ.get("BEAVER_STATE_DIR", BEAVER / ".состояние"))
"""Машинное состояние джобов (не для чтения моделью): лежит в доме агента, а не
в корне vault - структуру верхних папок ведёт владелец. Точка в начале: такой
каталог Obsidian не показывает, а watcher смотрит только `.md`. Создаётся сам."""
STATE = BEAVER / "состояние.md"
STATE_MAX_LINES = 60
ATTACHMENTS = BEAVER / "вложения"
def today() -> str:
return datetime.now(ZONE).date().isoformat()
def read(path: Path) -> str | None:
return path.read_text(encoding="utf-8").strip() if path.exists() else None