diff --git a/admin/index.html b/admin/index.html
index 908082b..b86dfbf 100644
--- a/admin/index.html
+++ b/admin/index.html
@@ -275,7 +275,11 @@
}
document.querySelectorAll('.tab').forEach(btn =>
- btn.addEventListener('click', () => switchTab(btn.dataset.tab))
+ btn.addEventListener('click', () => {
+ if (btn.dataset.tab === 'sessions') { sessState.search = ''; $('#sess-search').value = ''; }
+ if (btn.dataset.tab === 'memory') { memState.userId = null; }
+ switchTab(btn.dataset.tab);
+ })
);
const state = { usersLoaded: false, sessionsLoaded: false, memoryLoaded: false, profilesLoaded: false };
@@ -309,7 +313,11 @@
${esc(perms)} |
${fmtDate(u.created_at)} |
- |
+
+
+
+
+ |
`;
}
html += '';
@@ -325,6 +333,15 @@
showDrawer('User Detail', JSON.stringify(u, null, 2));
} catch (err) { alert(err.message); }
};
+window.showUserSessions = (id) => {
+ sessState.search = id;
+ $('#sess-search').value = id;
+ switchTab('sessions');
+};
+window.showUserMemory = (id) => {
+ memState.userId = id;
+ switchTab('memory');
+};
// ── Sessions ───────────────────────────────────────────────────────────────
const sessState = { limit: 50, offset: 0, search: '', sortBy: 'last_active', sortOrder: 'desc', total: 0, items: [] };
@@ -453,7 +470,7 @@
};
// ── Memory ─────────────────────────────────────────────────────────────────
-const memState = { limit: 50, offset: 0, search: '', sortBy: 'updated_at', sortOrder: 'desc', total: 0, items: [] };
+const memState = { limit: 50, offset: 0, search: '', userId: null, sortBy: 'updated_at', sortOrder: 'desc', total: 0, items: [] };
async function loadMemory() {
const el = $('#memory-content');
@@ -463,6 +480,7 @@
params.set('limit', String(memState.limit));
params.set('offset', String(memState.offset));
if (memState.search) params.set('search', memState.search);
+ if (memState.userId) params.set('user_id', memState.userId);
params.set('sort_by', memState.sortBy);
params.set('sort_order', memState.sortOrder);
const data = await api.memory(params.toString());
diff --git a/docs/api.md b/docs/api.md
index 751fc49..69e3d72 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -752,6 +752,7 @@
| `search` | — | Filter by key, value or category (case-insensitive) |
| `sort_by` | `updated_at` | `updated_at`, `category`, `key`, `confidence`, `source` |
| `sort_order` | `desc` | `asc` or `desc` |
+| `user_id` | — | If set, return only facts for this user instead of global view |
**Response `200`**
```json
diff --git a/navi/api/routes/admin.py b/navi/api/routes/admin.py
index 059ae62..d44aee2 100644
--- a/navi/api/routes/admin.py
+++ b/navi/api/routes/admin.py
@@ -183,6 +183,7 @@
search: str | None = None,
sort_by: str = "updated_at",
sort_order: str = "desc",
+ user_id: str | None = None,
):
"""Return memory facts with pagination, search and sorting."""
from navi.api.deps import get_memory_store
@@ -194,9 +195,14 @@
search=search or None,
sort_by=sort_by,
sort_order=sort_order,
- all_users=True,
+ user_id=user_id,
+ all_users=user_id is None,
)
- total = await memory.fact_count(all_users=True, search=search or None)
+ total = await memory.fact_count(
+ user_id=user_id,
+ all_users=user_id is None,
+ search=search or None,
+ )
return {"total": total, "limit": limit, "offset": offset, "items": facts}