feat(agent-memory): add Agent Memory workspace Overview UI - #6426
booleanhunter wants to merge 1 commit into
Conversation
Code Coverage - Backend unit tests
Test suite run success3795 tests passing in 327 suites. Report generated by 🧪jest coverage report action from 4753321 |
Code Coverage - Integration Tests
|
Code Coverage - Frontend unit tests
Test suite run success8130 tests passing in 885 suites. Report generated by 🧪jest coverage report action from 4753321 |
46c7695 to
e9b527f
Compare
e9b527f to
c85cb45
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c85cb45e1e
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| if (isStaleResponse(stateInit(), endpointId)) return | ||
|
|
||
| if (isStatusSuccessful(status)) { | ||
| dispatch(loadSessionsSuccess(data)) | ||
| if (autoPick) { | ||
| dispatch(setSessionId(data[0] ?? null)) |
There was a problem hiding this comment.
Discard session responses after the owner changes
When a user changes the owner twice before the first /sessions request completes, this response is validated only against endpointId, so the older request can overwrite the second owner's sessions and auto-select one of them. The subsequent working- and long-term-memory requests then display a session that does not belong to the currently selected owner; capture the requested userId and discard the response when it no longer matches the active filter.
Useful? React with 👍 / 👎.
| import EndpointConnectionFormWrapper from './components/connection-form/EndpointConnectionFormWrapper' | ||
| import * as S from './AgentMemoryPage.styles' | ||
|
|
||
| const PAGE_TITLE = 'Agent Memory' |
There was a problem hiding this comment.
Localize the new Agent Memory interface
When RedisInsight is running in Bulgarian, this title and the other newly added Agent Memory labels, buttons, placeholders, errors, and dialog text remain in English because they are literals rather than t/Trans keys; only the success notification was added to the locale files. Move the new user-facing copy into matching en.json and bg.json keys so the entire feature follows the selected locale.
AGENTS.md reference: AGENTS.md:L127-L127
Useful? React with 👍 / 👎.
| const staticAccents = { | ||
| accent: '#dcff1c', | ||
| dark: '#2d4754', |
There was a problem hiding this comment.
Replace hardcoded accent colors with semantic tokens
These fixed hex values, along with the additional hardcoded colors in the light/dark accent maps below, bypass the application theme. Consequently custom or accessibility themes cannot adjust the role tags, chips, and badges with the rest of the UI; define the palette through the theme's semantic color tokens instead.
AGENTS.md reference: AGENTS.md:L153-L153
Useful? React with 👍 / 👎.
| export const HeaderBar = styled(Row)` | ||
| padding: ${({ theme }) => theme.core.space.space150} | ||
| ${({ theme }) => theme.core.space.space300}; | ||
| min-height: 60px; |
There was a problem hiding this comment.
Replace fixed pixel dimensions with theme spacing
This fixed height is one of many raw pixel dimensions introduced throughout the workspace stylesheet. These values bypass the project's spacing scale and will not track theme-density changes; use the corresponding theme.core.space or component-size token rather than retaining extension-specific pixel metrics.
AGENTS.md reference: AGENTS.md:L176-L176
Useful? React with 👍 / 👎.
| dispatch(setConnectedEndpointSuccess({ endpoint })) | ||
| onSuccess?.() |
There was a problem hiding this comment.
Ignore superseded endpoint connection responses
When two endpoints are clicked quickly, or navigation changes endpoints while a connection request is pending, both requests can complete and this older response still overwrites connectedEndpoint and invokes its navigation callback. The user can therefore be taken to the endpoint from the first click rather than the latest one; associate connection state with the requested ID or a sequence token and ignore superseded results.
Useful? React with 👍 / 👎.
| const isKnownTab = ( | ||
| Object.values(AgentMemoryWorkspaceTab) as string[] | ||
| ).includes(tab ?? '') |
There was a problem hiding this comment.
Redirect unimplemented long-term-memory routes
A direct visit to /agent-memory/:endpointId/long-term-memory is accepted as a known tab because it is present in AgentMemoryWorkspaceTab, but the page only renders Overview and Configuration content and WORKSPACE_TABS contains only Overview. This leaves the workspace body blank instead of applying the documented unknown-tab redirect; restrict this check to implemented tabs until the long-term-memory view is rendered.
Useful? React with 👍 / 👎.
|
For feature request #6226 |
c85cb45 to
17570f9
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 17570f98cc
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| } catch (_err) { | ||
| // Keep the current session list on transient failures - replacing it | ||
| // with [] would also wipe the explorer's session filters. | ||
| } |
There was a problem hiding this comment.
Clear stale sessions when an owner lookup fails
When the /sessions request fails after an owner selection, this catch preserves the previous owner's session list and selected session, then changeScopeAction continues by refetching both panes with that stale session. In particular, CloudAgentMemoryClient.getWorkingMemory ignores the owner filter, so the workspace can indefinitely display the previous owner's working memory under the newly selected owner; clear the current session before the lookup or propagate failure so the pane refetches do not run.
Useful? React with 👍 / 👎.
| if (isStale()) return | ||
|
|
||
| if (isStatusSuccessful(status)) { | ||
| dispatch(getWorkingMemorySuccess(data)) |
There was a problem hiding this comment.
Discard superseded working-memory responses
When a working-memory refresh is already in flight and an add or clear operation triggers a newer fetch for the same session, both responses pass this session-only stale check. If the older response arrives last, it overwrites the newer state, potentially resurrecting cleared messages or hiding a newly appended event until another refresh; use a request sequence guard like the long-term-memory thunk.
Useful? React with 👍 / 👎.
| const bootstrap = async () => { | ||
| await dispatch(discoverFiltersAction(endpointId)) | ||
| refreshAll() | ||
| } |
There was a problem hiding this comment.
Failed discovery still loads LTM
Medium Severity
bootstrap always calls refreshAll after discoverFiltersAction, even when discovery fails and owner/session stay null. Overview LTM then runs an unscoped match-all search instead of staying empty.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 17570f9. Configure here.
|
|
||
| dispatch(fetchWorkingMemoryAction(endpointId)) | ||
| dispatch(fetchOverviewLongTermMemoryAction(endpointId)) | ||
| } |
There was a problem hiding this comment.
Owner change keeps stale session
Medium Severity
changeScopeAction updates userId but leaves the previous sessionId until sessions are re-listed. During that await, refreshes can run against the new owner paired with the old session.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 17570f9. Configure here.
Add the feature-flagged Agent Memory workspace and its Overview screen for inspecting a Redis Agent Memory store. Endpoint home: - List and connect to saved endpoints, with a first-run empty state - Add or edit a Redis Agent Memory endpoint connection Workspace shell: - Header, tab bar, and configuration panel - Scope by owner and session via filter pills - Opt-in per-pane auto-refresh Overview screen: - Working memory for the selected session: message log, running summary, session namespace, and add-event / clear-session actions - Long-term memory: the latest records for the selected scope
17570f9 to
4753321
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 47533211b3
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| if (isStatusSuccessful(status)) { | ||
| dispatch(endpointChangingSuccess()) | ||
| dispatch(fetchEndpointsAction()) | ||
| onSuccess?.(data) |
There was a problem hiding this comment.
Invalidate the cached endpoint after edits
When a previously connected endpoint is edited after returning to the home page, this success path leaves connectedEndpoint unchanged. Opening that endpoint again passes the workspace's ID-only isConnected check, so it skips reconnection and continues showing the old name and URL in the header; update the cached endpoint from data or reset it after a successful edit.
Useful? React with 👍 / 👎.
| setSessionId: (state, { payload }: PayloadAction<Nullable<string>>) => { | ||
| state.filters.sessionId = payload | ||
| state.workingMemory.data = null | ||
| }, |
There was a problem hiding this comment.
Reset working-memory status when clearing the session
When the user selects (none) or an owner lookup yields no sessions after a working-memory failure, this reducer clears only the data, so the previous session's error remains rendered beneath the no-session state. If the previous request is still pending, its stale-response guard also exits without clearing loading; reset the working-memory loading and error fields when the selected session changes.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 4753321. Configure here.
| : 'Pick a session to inspect its working memory.'} | ||
| </S.EmptyListText> | ||
| </li> | ||
| )} |
There was a problem hiding this comment.
Empty state shown with summary
Medium Severity
The empty-list message is gated only on messages.length, so a session with a running summary and no remaining messages still shows “No messages in working memory yet.” under the summary card. That makes a valid summarized session look empty.
Reviewed by Cursor Bugbot for commit 4753321. Configure here.


Add the feature-flagged Agent Memory workspace and its Overview screen for inspecting a Redis Agent Memory store.
Endpoint home:
Workspace shell:
Overview screen:
Note
Medium Risk
Large new UI that stores API keys and talks to remote Agent Memory endpoints (connect, mutate working memory, search LTM). Gated by a feature flag and built on existing API modules.
Overview
Adds a feature-flagged Agent Memory home and workspace so users can connect to Redis Agent Memory stores and inspect working and long-term memory.
The home tab lists saved endpoints (add/edit/delete, API key on create) and connects into a workspace. Overview shows a resizable split: session working memory (messages, running summary, add event, clear) and latest long-term records, scoped by owner and session, with per-pane auto-refresh and a read-only configuration view.
Wires
agentMemorythrough feature config, routes, and Redux (endpoints + workspace thunks that drop stale responses). Also extracts sharedvisuallyHiddenCssand an optionalariaLabelonPopoverDelete.Reviewed by Cursor Bugbot for commit 4753321. Bugbot is set up for automated code reviews on this repo. Configure here.