Releases: ginkida/mindsecretary
v0.6.0
What's New
New Telegram Commands
/goals— today's daily goals with status and completion count/habits— habit streaks (consecutive days) and 7-day completion rate/search <query>— direct semantic memory search with scores/undo— restore the last deleted memory/export— export all data as JSON file to Telegram
Features
- Recurring reminders — daily/weekly/monthly recurrence, auto-creates next on send
- Memory deduplication — cosine similarity >0.92 in same category bumps importance instead of duplicating
- Memory recency decay — old untouched memories rank lower in search (exponential, 90-day half-life)
- Contact alias matching — upsert_contact checks aliases field before creating duplicates
- English mood signals — 39 English keywords for bilingual sentiment analysis
- Learning dedup — weekly reflection checks similarity before saving learnings
- 📌 Pin button — pin important bot replies directly in chat
- Notification awareness — shows count in /start, warns when approaching daily limit
- /stats breakdown — per-provider cost and 7-day trend
- /forget confirmation — inline buttons before deleting, /undo to restore
Bug Fixes
- Fix timestamp format in contacts/decisions/reminders (
isoformat()→strftimefor SQLite compat) - Fix memory search Row object unpacking (dead isinstance check)
- Fix silent exception handling in evening weather fetch
- Fix
_reply_mapunbounded growth (cap at 200) - Fix Docker healthcheck that always passed (now checks process + DB)
- Fix Markdown parse errors in Telegram replies (escape orphan
*,_,`)
Performance
- Vectorized memory search: numpy matrix multiply +
argpartitionfor O(n) top-k - Database indexes:
contacts(name),interactions(timestamp, message_type, direction)
Reliability
- Timezone-aware datetime via
tz_now(profile.timezone)throughout - Graceful degradation when Voyage API fails (zero-vector fallback)
- STT retry: 3 attempts with exponential backoff on Groq failures
- Datetime validation in tool arguments (normalize to SQL format)
- Smart questions rate limit persisted in DB (survives restarts)
- Brain section failures logged at WARNING (not silently swallowed)
- Briefing fallback messages explain why briefing is unavailable
Infrastructure
- 105 tests (from zero): database, brain, tools, scheduler, mood, integration, telegram, habits, datetime
- CI: GitHub Actions runs pytest on Python 3.10/3.11/3.12
core/enums.py: Status, Priority, Sentiment, Feedback, MoodLabelscripts/reembed.py: batch re-embed zero-vector memories- Configurable tuning section in
settings.yaml(6 parameters)
Full Stats
- 9 commits, ~45 improvements
- 11 Telegram commands (was 6), 13 LLM tools (was 10)
- 105 tests (was 0)
v0.3.0 — Daily goals
MindSecretary v0.3.0
New: Daily goals
Set goals in the morning, track throughout the day, review together in the evening.
Morning:
- Briefing ends with "Какие цели на сегодня?"
- Reply naturally → bot calls
set_daily_goalfor each
During the day:
- Goals visible in every conversation (⬜ pending, ✅ done, ⏭ skipped, 🟡 partial)
- "Закончил отчёт" → bot marks it completed
- "В зал не пошёл, спина болит" → marked skipped with reflection
Evening:
- Summary reviews each goal: completed → noted, pending → gently asks what happened
- Warm tone, not audit
Tools
2 new tools (13 total):
set_daily_goal— create a goal for today (title, priority, description)complete_daily_goal— mark by keyword hint (completed/skipped/partial + reflection)
Fixes since v0.2.0
- Sanitize goal data before prompt injection in evening summary
- Translate
resolve_decisiontool description to Russian (was the only English one) - Bump evening prompt max_tokens 600 → 800
Deploy
docker compose pull && docker compose up -dImage: ghcr.io/ginkida/mindsecretary:0.3.0
v0.2.0 — Companion mode
MindSecretary v0.2.0
Transforms the bot from a pure task extractor into a warm personal companion that can both handle secretary duties AND emotional conversations.
New: Companion mode
- Character-driven prompt — bot reads emotional tone, responds with specificity, not clichés
- Dual mode — business-as-default, emotional branch when message tone calls for it. Background mood never reinterprets neutral messages.
- Voice rules — banned therapy-speak patterns ("слышу тебя", "звучит здорово", "стоит", "должен") with positive substitution examples
- Honest pushback — bot can gently disagree on facts and plans (never on feelings)
- Memory continuity — references past events naturally when relevant, not shoehorned
- New "emotional" memory category for tracking feelings separately from tasks
New: Enriched context in system prompt
- Theme clusters (grouped by person/category over last 30 days)
- Drifting relationships (top 2 contacts gone quiet)
- Upcoming birthdays in the daily context
- 8 recent messages (up from 6)
New: resolve_decision LLM tool
Bot can now close tracked decisions when you mention outcomes. Pending decisions surface in the system prompt so Claude sees them.
Fixes
- Critical timestamp bug — SQL space-separated timestamps vs Python T-separated isoformat caused silent string-comparison failures in mood_trend, feedback summaries, and any get_interactions filter. Broken since day one.
- final_text overwrite in tool-use loop — warm responses were getting erased by later tool-call round confirmations
- max_tokens 1024 → 1500 to prevent mid-sentence truncation on Russian warm replies
- Defensive None checks in resolve_decision and _escape_like
- Previous: proactive notification limits, quiet hours, decision follow-up repeat, birthday dedup, settings toggles (from v0.1.x hardening)
Deploy
```bash
mkdir mindsecretary && cd mindsecretary
curl -LO https://raw.githubusercontent.com/ginkida/mindsecretary/v0.2.0/.env.example
curl -LO https://raw.githubusercontent.com/ginkida/mindsecretary/v0.2.0/docker-compose.yaml
mkdir -p config
curl -Lo config/profile.yaml https://raw.githubusercontent.com/ginkida/mindsecretary/v0.2.0/config/profile.yaml
curl -Lo config/settings.yaml https://raw.githubusercontent.com/ginkida/mindsecretary/v0.2.0/config/settings.yaml
cp .env.example .env
Edit .env — fill in API keys
docker compose pull
docker compose up -d
```
Image: `ghcr.io/ginkida/mindsecretary:0.2.0`
v0.1.0
MindSecretary v0.1.0
Voice-first personal AI secretary as a Telegram bot.
Deploy
mkdir mindsecretary && cd mindsecretary
# Download configs
curl -LO https://raw.githubusercontent.com/ginkida/mindsecretary/v0.1.0/.env.example
curl -LO https://raw.githubusercontent.com/ginkida/mindsecretary/v0.1.0/docker-compose.yaml
mkdir -p config
curl -Lo config/profile.yaml https://raw.githubusercontent.com/ginkida/mindsecretary/v0.1.0/config/profile.yaml
curl -Lo config/settings.yaml https://raw.githubusercontent.com/ginkida/mindsecretary/v0.1.0/config/settings.yaml
# Configure and run
cp .env.example .env
# Edit .env — fill in API keys
docker compose up -dWhat's included
- Voice, text, photo, forward message processing
- Semantic memory (Voyage AI + SQLite)
- Personal CRM with contact tracking
- Calendar, reminders, habit tracking
- Decision tracker with follow-ups
- Auto-diary with mood analysis
- Morning briefing, evening summary, weekly review
- Smart midday questions
- Weather and birthday alerts
- Feedback loop (thumbs up/down)