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}