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")
|
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 ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user