● Zion Boggan
repos/Darwin/cortex/adapters/inbox.py
zionboggan.com ↗
73 lines · python
History for this file →
1
"""Inbox adapter - Memos REST API on CT244.
2
 
3
Memos runs on CT244 at internal port 5230 (docker bind 127.0.0.1:5230 on CT244).
4
From CT215 we reach it via its public URL: https://REDACTED-HOST
5
API endpoint: GET /api/v1/memos  (Memos v0.29.x REST API)
6
 
7
The API requires auth. We read the access token from env MEMOS_ACCESS_TOKEN.
8
If unset or unreachable we degrade to status:"down".
9
 
10
Authority tier: agent-memory (user captures, may be stale).
11
"""
12
from __future__ import annotations
13
 
14
import os
15
from datetime import datetime, timezone
16
 
17
import httpx
18
 
19
from models import Hit
20
from adapters.base import BaseAdapter
21
 
22
MEMOS_BASE = os.environ.get("MEMOS_BASE_URL", "https://REDACTED-HOST")
23
MEMOS_TOKEN = os.environ.get("MEMOS_ACCESS_TOKEN", "")
24
 
25
 
26
def _parse_memos(data: list[dict]) -> list[Hit]:
27
    hits = []
28
    for m in data:
29
        if not isinstance(m, dict):
30
            continue
31
        dt = None
32
        for field in ("displayTime", "createTime", "updateTime"):
33
            raw = m.get(field)
34
            if raw:
35
                try:
36
                    dt = datetime.fromisoformat(str(raw).replace("Z", "+00:00"))
37
                except Exception:
38
                    pass
39
                break
40
        content = m.get("content") or ""
41
        hits.append(Hit(
42
            engine="inbox",
43
            title=content[:60].replace("\n", " "),
44
            path=m.get("name", ""),
45
            snippet=content[:300],
46
            score=0.5,
47
            last_seen=dt,
48
            confidence=0.65,
49
            authority_tier="agent-memory",
50
        ))
51
    return hits
52
 
53
 
54
class InboxAdapter(BaseAdapter):
55
    engine = "inbox"
56
    authority_tier = "agent-memory"
57
 
58
    async def _fetch(self, query: str, k: int) -> list[Hit]:
59
        if not MEMOS_TOKEN:
60
            raise RuntimeError("MEMOS_ACCESS_TOKEN not set")
61
 
62
        headers = {"Authorization": f"Bearer {MEMOS_TOKEN}"}
63
        params = {"pageSize": k, "filter": f'content.contains("{query}")'}
64
        async with httpx.AsyncClient(timeout=3.5, verify=False) as client:
65
            resp = await client.get(
66
                f"{MEMOS_BASE}/api/v1/memos",
67
                headers=headers,
68
                params=params,
69
            )
70
            resp.raise_for_status()
71
            body = resp.json()
72
            memos = body if isinstance(body, list) else body.get("memos", [])
73
            return _parse_memos(memos)[:k]