feat: extend memory search and attachment mapping
This commit is contained in:
@ -96,9 +96,13 @@ class MemoryRepository:
|
||||
now = utc_now()
|
||||
where = "id = ? AND deleted_at IS NULL"
|
||||
params: tuple[Any, ...] = (now, now, resource_id)
|
||||
attachment_where = "resource_id = ? AND deleted_at IS NULL"
|
||||
attachment_params: tuple[Any, ...] = (now, resource_id)
|
||||
if user_id is not None:
|
||||
where += " AND user_id = ?"
|
||||
params = (now, now, resource_id, user_id)
|
||||
attachment_where += " AND user_id = ?"
|
||||
attachment_params = (now, resource_id, user_id)
|
||||
with connect(self.db_path) as conn:
|
||||
conn.execute(
|
||||
f"""
|
||||
@ -108,6 +112,14 @@ class MemoryRepository:
|
||||
""",
|
||||
params,
|
||||
)
|
||||
conn.execute(
|
||||
f"""
|
||||
UPDATE memory_attachments
|
||||
SET deleted_at = ?
|
||||
WHERE {attachment_where}
|
||||
""",
|
||||
attachment_params,
|
||||
)
|
||||
conn.commit()
|
||||
return self.get_resource(resource_id)
|
||||
|
||||
@ -215,6 +227,62 @@ class MemoryRepository:
|
||||
).fetchall()
|
||||
return [dict(row) for row in rows]
|
||||
|
||||
def create_attachment(self, **values: Any) -> dict[str, Any]:
|
||||
attachment_id = str(values.get("id") or f"a_{uuid.uuid4().hex}")
|
||||
payload = {
|
||||
"id": attachment_id,
|
||||
"created_at": utc_now(),
|
||||
"deleted_at": None,
|
||||
**values,
|
||||
}
|
||||
with connect(self.db_path) as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT OR IGNORE INTO memory_attachments (
|
||||
id, user_id, app_id, project_id, session_id, resource_id,
|
||||
content_type, name, internal_uri, source, sha256,
|
||||
created_at, deleted_at
|
||||
) VALUES (
|
||||
:id, :user_id, :app_id, :project_id, :session_id, :resource_id,
|
||||
:content_type, :name, :internal_uri, :source, :sha256,
|
||||
:created_at, :deleted_at
|
||||
)
|
||||
""",
|
||||
payload,
|
||||
)
|
||||
row = conn.execute(
|
||||
"""
|
||||
SELECT * FROM memory_attachments
|
||||
WHERE user_id = ? AND session_id = ? AND internal_uri = ?
|
||||
""",
|
||||
(
|
||||
payload["user_id"],
|
||||
payload["session_id"],
|
||||
payload["internal_uri"],
|
||||
),
|
||||
).fetchone()
|
||||
conn.commit()
|
||||
attachment = _row_to_dict(row)
|
||||
if attachment is None:
|
||||
raise RuntimeError("created attachment could not be read back")
|
||||
return attachment
|
||||
|
||||
def list_attachments_for_session(
|
||||
self,
|
||||
user_id: str,
|
||||
session_id: str,
|
||||
) -> list[dict[str, Any]]:
|
||||
with connect(self.db_path) as conn:
|
||||
rows = conn.execute(
|
||||
"""
|
||||
SELECT * FROM memory_attachments
|
||||
WHERE user_id = ? AND session_id = ? AND deleted_at IS NULL
|
||||
ORDER BY created_at ASC, id ASC
|
||||
""",
|
||||
(user_id, session_id),
|
||||
).fetchall()
|
||||
return [dict(row) for row in rows]
|
||||
|
||||
def add_tombstone(
|
||||
self,
|
||||
user_id: str,
|
||||
|
||||
Reference in New Issue
Block a user