- New cortex/tools/reminders.py with reminders_add, reminders_list, reminders_clear - reminders_clear moved here from cron.py (cron still imports from same file) - __init__.py: wired up new callables and Gemini declarations - Inara can now add/read reminders in Agent mode via the orchestrator Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
"""
|
|
Reminders tools.
|
|
|
|
Reminders are stored in persona/REMINDERS.md and automatically surfaced
|
|
in the system prompt at Tier 2+. Use these tools to add, list, and clear
|
|
pending reminders.
|
|
|
|
Operations:
|
|
reminders_add — append a new reminder entry
|
|
reminders_list — return all current reminders (or a message if empty)
|
|
reminders_clear — erase all reminders (moved here from cron.py for consistency;
|
|
cron.py still calls the same underlying file)
|
|
"""
|
|
|
|
import asyncio
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
|
|
from persona import persona_path
|
|
|
|
|
|
def _reminders_path() -> Path:
|
|
return persona_path() / "REMINDERS.md"
|
|
|
|
|
|
def _now_label() -> str:
|
|
return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Sync implementations
|
|
# ---------------------------------------------------------------------------
|
|
|
|
def _reminders_list() -> str:
|
|
p = _reminders_path()
|
|
if not p.exists() or not p.read_text().strip():
|
|
return "No pending reminders."
|
|
return p.read_text()
|
|
|
|
|
|
def _reminders_add(text: str, label: str | None = None) -> str:
|
|
p = _reminders_path()
|
|
existing = p.read_text() if p.exists() else ""
|
|
heading = label or _now_label()
|
|
section = f"\n## {heading}\n\n{text.strip()}\n"
|
|
p.write_text(existing.rstrip() + "\n" + section)
|
|
return f"Reminder added: {heading}"
|
|
|
|
|
|
def _reminders_clear() -> str:
|
|
p = _reminders_path()
|
|
p.write_text("")
|
|
return "All reminders cleared."
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Async wrappers
|
|
# ---------------------------------------------------------------------------
|
|
|
|
async def reminders_list() -> str:
|
|
return await asyncio.to_thread(_reminders_list)
|
|
|
|
|
|
async def reminders_add(text: str, label: str | None = None) -> str:
|
|
return await asyncio.to_thread(_reminders_add, text, label)
|
|
|
|
|
|
async def reminders_clear() -> str:
|
|
return await asyncio.to_thread(_reminders_clear)
|