Files
jarvis/capabilities/notes_manager.py

69 lines
2.3 KiB
Python
Raw Normal View History

2026-03-24 00:11:34 -05:00
"""
Google Keep notes via gkeepapi (unofficial).
Falls back to local Markdown files if Keep is unavailable.
NOTE: The official Google Keep API requires Google Workspace Enterprise.
For personal/standard accounts use gkeepapi or the Markdown fallback below.
"""
import os
from pathlib import Path
# ─── gkeepapi backend ──────────────────────────
try:
import gkeepapi
_keep = None
def _init():
global _keep
if _keep is None:
email = os.getenv("GOOGLE_KEEP_EMAIL")
token = os.getenv("GOOGLE_KEEP_MASTER_TOKEN")
if not email or not token:
raise ValueError("Set GOOGLE_KEEP_EMAIL and GOOGLE_KEEP_MASTER_TOKEN in .env")
_keep = gkeepapi.Keep()
_keep.authenticate(email, token)
return _keep
def create_note(title: str, content: str) -> str:
keep = _init()
note = keep.createNote(title, content)
note.pinned = True
keep.sync()
return note.id
def get_all_notes() -> list[dict]:
keep = _init()
return [{'id': n.id, 'title': n.title, 'text': n.text} for n in keep.all()]
def search_notes(query: str) -> list[dict]:
keep = _init()
return [{'id': n.id, 'title': n.title, 'text': n.text} for n in keep.find(query=query)]
NOTES_BACKEND = "gkeepapi"
except ImportError:
# ─── Markdown fallback ──────────────────────
NOTES_DIR = Path.home() / "JARVIS_Notes"
NOTES_DIR.mkdir(exist_ok=True)
NOTES_BACKEND = "markdown"
def create_note(title: str, content: str) -> str:
safe_title = "".join(c for c in title if c.isalnum() or c in " _-").strip()
path = NOTES_DIR / f"{safe_title}.md"
path.write_text(f"# {title}\n\n{content}\n")
return str(path)
def get_all_notes() -> list[dict]:
return [
{'title': p.stem, 'text': p.read_text()}
for p in NOTES_DIR.glob("*.md")
]
def search_notes(query: str) -> list[dict]:
results = []
for p in NOTES_DIR.glob("*.md"):
text = p.read_text()
if query.lower() in text.lower():
results.append({'title': p.stem, 'text': text})
return results