Add dream.py — WebDAV delivery, four validated modes, calibrated similarity ranges

This commit is contained in:
2026-04-26 15:04:25 -04:00
parent fd249c5e96
commit 679222ad5f
+32 -14
View File
@@ -18,9 +18,14 @@ DB_PATH = str(Path.home() / "aaronai" / "db")
CONVERSATIONS_DB = str(Path.home() / "aaronai" / "conversations.db") CONVERSATIONS_DB = str(Path.home() / "aaronai" / "conversations.db")
WATCHER_STATE = str(Path.home() / "aaronai" / "watcher_state.json") WATCHER_STATE = str(Path.home() / "aaronai" / "watcher_state.json")
DREAMER_STATE = str(Path.home() / "aaronai" / "dreamer_state.json") DREAMER_STATE = str(Path.home() / "aaronai" / "dreamer_state.json")
DREAMS_DIR = "/home/aaron/nextcloud/data/data/aaron/files/Journal/Dreams"
JOURNAL_DIR = "/home/aaron/nextcloud/data/data/aaron/files/Journal/Daily" JOURNAL_DIR = "/home/aaron/nextcloud/data/data/aaron/files/Journal/Daily"
# Nextcloud WebDAV config — proper API, works for any deployment
NEXTCLOUD_URL = os.getenv("NEXTCLOUD_URL", "https://nextcloud.aaronnelson.studio")
NEXTCLOUD_USER = os.getenv("NEXTCLOUD_USER", "aaron")
NEXTCLOUD_PASSWORD = os.getenv("NEXTCLOUD_PASSWORD", "")
DREAMS_WEBDAV = f"{NEXTCLOUD_URL}/remote.php/dav/files/{NEXTCLOUD_USER}/Journal/Dreams"
# ─── Mode similarity ranges (calibrated for all-MiniLM-L6-v2) ─────────────── # ─── Mode similarity ranges (calibrated for all-MiniLM-L6-v2) ───────────────
MODE_RANGES = { MODE_RANGES = {
"nrem": (0.60, 0.72), "nrem": (0.60, 0.72),
@@ -253,34 +258,47 @@ End with an offer to work on it together.""",
# ─── Stage 5: Deliver ─────────────────────────────────────────────────────── # ─── Stage 5: Deliver ───────────────────────────────────────────────────────
def deliver(dream_text, mode, task=None): def deliver(dream_text, mode, task=None):
dreams_dir = Path(DREAMS_DIR) import requests
dreams_dir.mkdir(parents=True, exist_ok=True)
date_str = datetime.now().strftime("%Y-%m-%d") date_str = datetime.now().strftime("%Y-%m-%d")
filename = f"{date_str}-{mode}.md" filename = f"{date_str}-{mode}.md"
filepath = dreams_dir / filename
counter = 1
while filepath.exists():
filename = f"{date_str}-{mode}-{counter}.md"
filepath = dreams_dir / filename
counter += 1
header = f"# Dream — {mode.upper()}{datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n" header = f"# Dream — {mode.upper()}{datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n"
if task: if task:
header += f"*Task: {task}*\n\n" header += f"*Task: {task}*\n\n"
header += "---\n\n" header += "---\n\n"
filepath.write_text(header + dream_text, encoding="utf-8") content = header + dream_text
print(f"Dream written to: {filepath}")
# Ensure Dreams folder exists via WebDAV MKCOL
auth = (NEXTCLOUD_USER, NEXTCLOUD_PASSWORD)
requests.request("MKCOL", DREAMS_WEBDAV, auth=auth, timeout=10)
# Write file via WebDAV PUT — handles any deployment
url = f"{DREAMS_WEBDAV}/{filename}"
# Handle filename collision
counter = 1
while True:
check = requests.request("PROPFIND", url, auth=auth, timeout=10)
if check.status_code == 404:
break
filename = f"{date_str}-{mode}-{counter}.md"
url = f"{DREAMS_WEBDAV}/{filename}"
counter += 1
response = requests.put(url, data=content.encode("utf-8"), auth=auth, timeout=30)
response.raise_for_status()
print(f"Dream written to Nextcloud: Journal/Dreams/{filename}")
state = load_dreamer_state() state = load_dreamer_state()
state["last_dream_timestamp"] = datetime.now().timestamp() state["last_dream_timestamp"] = datetime.now().timestamp()
state["last_dream_mode"] = mode state["last_dream_mode"] = mode
state["last_dream_file"] = str(filepath) state["last_dream_file"] = f"Journal/Dreams/{filename}"
save_dreamer_state(state) save_dreamer_state(state)
return str(filepath) return f"Journal/Dreams/{filename}"
# ─── State ────────────────────────────────────────────────────────────────── # ─── State ──────────────────────────────────────────────────────────────────