Add dream.py — WebDAV delivery, four validated modes, calibrated similarity ranges
This commit is contained in:
+32
-14
@@ -18,9 +18,14 @@ DB_PATH = str(Path.home() / "aaronai" / "db")
|
||||
CONVERSATIONS_DB = str(Path.home() / "aaronai" / "conversations.db")
|
||||
WATCHER_STATE = str(Path.home() / "aaronai" / "watcher_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"
|
||||
|
||||
# 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_RANGES = {
|
||||
"nrem": (0.60, 0.72),
|
||||
@@ -253,34 +258,47 @@ End with an offer to work on it together.""",
|
||||
# ─── Stage 5: Deliver ───────────────────────────────────────────────────────
|
||||
|
||||
def deliver(dream_text, mode, task=None):
|
||||
dreams_dir = Path(DREAMS_DIR)
|
||||
dreams_dir.mkdir(parents=True, exist_ok=True)
|
||||
import requests
|
||||
|
||||
date_str = datetime.now().strftime("%Y-%m-%d")
|
||||
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"
|
||||
if task:
|
||||
header += f"*Task: {task}*\n\n"
|
||||
header += "---\n\n"
|
||||
|
||||
filepath.write_text(header + dream_text, encoding="utf-8")
|
||||
print(f"Dream written to: {filepath}")
|
||||
content = header + dream_text
|
||||
|
||||
# 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["last_dream_timestamp"] = datetime.now().timestamp()
|
||||
state["last_dream_mode"] = mode
|
||||
state["last_dream_file"] = str(filepath)
|
||||
state["last_dream_file"] = f"Journal/Dreams/{filename}"
|
||||
save_dreamer_state(state)
|
||||
|
||||
return str(filepath)
|
||||
return f"Journal/Dreams/{filename}"
|
||||
|
||||
# ─── State ──────────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user