feat(memory): scale Agent Memory with bounded workloads#1939
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (21)
💤 Files with no reviewable changes (1)
✅ Files skipped from review due to trivial changes (3)
🚧 Files skipped from review as they are similar to previous changes (13)
📝 WalkthroughWalkthroughAdds bounded agent-memory recall, ingestion projection, embedding and maintenance orchestration, keyset pagination, Unicode/content validation, performance instrumentation, native SQLite performance CI, and regression and scale tests. ChangesAgent memory performance and scale
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (9)
docs/architecture/agent-memory-performance-and-scale/tasks.md (1)
116-116: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueOptional: rephrase "with success" for conciseness.
The LanguageTool static analysis flags "with success" as potentially wordy. Consider rephrasing to "successful" or similar for brevity, though the current phrasing is grammatically correct and clear in context.
As per coding guidelines, static analysis hints should be selectively incorporated. This is a minor style suggestion that can be deferred.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/architecture/agent-memory-performance-and-scale/tasks.md` at line 116, Rephrase the checklist item near “Key embedding connection warmup” to replace “with success” with the more concise “successful” while preserving the existing meaning.Source: Linters/SAST tools
src/main/presenter/memoryPresenter/services/writeCoordinator.ts (1)
644-650: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider using
DECISION_BATCH_MAX_BATCHESinstead of hardcoded2.The
maxBatchesargument2matchesDECISION_BATCH_MAX_BATCHESfrombatchDecision.ts, but if that constant changes, partitions beyond 2 would be silently skipped and their candidates sent to fallback. Importing and using the constant makes this relationship explicit and prevents a subtle regression.♻️ Proposed refactor
import { + DECISION_BATCH_MAX_BATCHES, parseBatchDecisionResults, partitionBatchDecisions, type BatchDecisionInput } from '../core/batchDecision'const initialBatch = await this.requestBatchDecisions( agentId, model, initialDecisionInputs, - 2, + DECISION_BATCH_MAX_BATCHES, operationFence )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/presenter/memoryPresenter/services/writeCoordinator.ts` around lines 644 - 650, Replace the hardcoded maxBatches value 2 in writeCoordinator’s initial requestBatchDecisions call with the DECISION_BATCH_MAX_BATCHES constant imported from batchDecision.ts, preserving the existing behavior while keeping it synchronized with the configured limit.test/main/presenter/memoryMaintenanceBudget.test.ts (1)
1-8: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueTest file combines two unrelated source modules, deviating from mirrored layout.
This file tests both
AsyncSemaphore(src/main/lib/asyncSemaphore.ts) andMaintenanceBudget/selectMaintenanceRowsWithinTokenBudget(src/main/presenter/memoryPresenter/core/maintenanceBudget.ts) in one file undertest/main/presenter/. A strict mirror would place theAsyncSemaphoresuite undertest/main/lib/asyncSemaphore.test.ts.As per coding guidelines, "Place main-process Vitest suites under
test/main/and mirror the source layout there."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/main/presenter/memoryMaintenanceBudget.test.ts` around lines 1 - 8, The test file mixes AsyncSemaphore tests with maintenance budget tests, violating the mirrored test layout. Move the AsyncSemaphore suite and its import to test/main/lib/asyncSemaphore.test.ts, leaving MaintenanceBudget and selectMaintenanceRowsWithinTokenBudget tests in the presenter test file.Source: Coding guidelines
src/main/presenter/sqlitePresenter/tables/deepchatTapeEffectiveSemantics.ts (1)
120-131: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low valueUnrecognized/missing tool status silently treated as "final".
tapeToolRanktreats any non-'pending'value (includingnullwhenmeta_json.statusis absent or non-string) as terminal (rank 2). If atool_callrow's status hasn't been recorded yet for reasons other than being explicitly'pending', it would be treated as a completed/final tool call by callers usingincludePending=false, e.g.applyAppendedEntryindeepchatMemoryIngestionProjection.ts.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/presenter/sqlitePresenter/tables/deepchatTapeEffectiveSemantics.ts` around lines 120 - 131, Update tapeToolRank to distinguish explicit terminal statuses from missing or unrecognized statuses: preserve the existing pending handling, but return a non-terminal rank for null or unsupported status values so callers such as applyAppendedEntry do not treat them as completed. Use readTapeToolStatus as the status source and define the accepted terminal status values explicitly.test/main/presenter/agentRuntimePresenter/agentRuntimePresenter.test.ts (1)
1213-1296: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueGood regression coverage for rebuild-then-cache and fallback paths; incremental
applyAppendedEntrypath remains untested here.Both new tests validate that
buildMemoryExtractionWindowrebuilds the projection once and then relies on bounded range reads, and that areadCurrentRangefailure safely falls back to the authoritative Tape view while invalidating the projection. The mock'sappendunconditionally setsmemoryIngestionProjectionCurrent = false(Line 360), so these tests never exercise the productionapplyAppendedEntryincremental-update code path (deepchatMemoryIngestionProjection.ts), which can keep the projection current without a full invalidate/rebuild when entries are appended sequentially. Consider adding a follow-up test elsewhere that exercisesapplyAppendedEntrydirectly against the realDeepChatMemoryIngestionProjectionTable.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/main/presenter/agentRuntimePresenter/agentRuntimePresenter.test.ts` around lines 1213 - 1296, Add regression coverage for the incremental applyAppendedEntry path using the real DeepChatMemoryIngestionProjectionTable, rather than the mock that always marks the projection stale. Append sequential entries, call applyAppendedEntry directly, then verify readCurrentRange returns the updated bounded rows without invalidation or full rebuild.src/main/presenter/sqlitePresenter/tables/deepchatMemoryIngestionProjection.ts (1)
150-165: 🧹 Nitpick | 🔵 TrivialRetraction and non-sequential apply always force a full invalidate/rebuild.
Any retraction event or non-sequential append forces
invalidateSession(full rebuild on next read) rather than a targeted correction. This trades some rebuild cost for correctness/simplicity, which is a reasonable choice for a cache invalidation design, but worth confirming this doesn't become a hot path under bursty retraction/edit workloads at scale (per this PR's stated scale goals).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/presenter/sqlitePresenter/tables/deepchatMemoryIngestionProjection.ts` around lines 150 - 165, The retraction and non-sequential append paths in the projection handler always trigger full session invalidation, which may be costly during bursts. Review the callers and implementation of invalidateSession and the surrounding ingestion logic, then confirm this rebuild strategy is acceptable at the expected scale; if not, replace it with targeted correction or deduplicated/deferred invalidation while preserving correctness.src/main/presenter/memoryPresenter/services/maintenanceService.ts (1)
509-515: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winAvoid wasted neighbor queries once the token budget is exhausted.
The budget precheck at Line 511 runs
continueafter the expensivequeryNeighborsByMemoryIdcall (Line 475). Whenbudget.snapshot().inputTokensapproaches/exceedsMAINTENANCE_MAX_INPUT_TOKENS, every remaining scan row still triggers a vector neighbor query before hitting thecontinue, potentially wasting up toCONSOLIDATION_MAX_NEIGHBOR_SCANSqueries. Since the budget only grows within a pass, add an earlybreakat the top of the loop when no remaining capacity exists.♻️ Suggested guard at loop start (Line 466)
for (const row of scanRows) { lastScanned = row + if (MAINTENANCE_MAX_INPUT_TOKENS - budget.snapshot().inputTokens <= 0) break if (merged.has(row.id)) continue🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/presenter/memoryPresenter/services/maintenanceService.ts` around lines 509 - 515, Add an early budget-capacity guard at the start of the scan loop in the maintenance service, before any query such as queryNeighborsByMemoryId runs. Break when budget.snapshot().inputTokens has reached MAINTENANCE_MAX_INPUT_TOKENS; retain the existing per-candidate precheck for prompt-size validation.src/main/presenter/memoryPresenter/services/reflectionService.ts (1)
73-76: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider naming the 256 token overhead buffer.
The
256subtracted fromavailableTokensis a prompt-template overhead allowance. If this value is too small and the template grows,budget.reserveat line 85 will silently fail and skip reflection. Extracting it as a named constant (e.g.,REFLECTION_PROMPT_OVERHEAD_TOKENS) alongside the other constants inruntimeConstants.tswould make the intent explicit and simplify future tuning.♻️ Optional refactor
const availableTokens = Math.max( 0, - MAINTENANCE_MAX_INPUT_TOKENS - budget.snapshot().inputTokens - 256 + MAINTENANCE_MAX_INPUT_TOKENS - budget.snapshot().inputTokens - REFLECTION_PROMPT_OVERHEAD_TOKENS )And in
runtimeConstants.ts:+export const REFLECTION_PROMPT_OVERHEAD_TOKENS = 256🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/presenter/memoryPresenter/services/reflectionService.ts` around lines 73 - 76, Replace the magic 256 token subtraction in the reflection token calculation with a named REFLECTION_PROMPT_OVERHEAD_TOKENS constant defined alongside the other runtime constants, then use that constant in the availableTokens calculation and update any related references.test/main/routes/dispatcher.test.ts (1)
2262-2314: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a guard-branch case for
memory.page.Every other
memory.*dispatch test here (getByIds,archive,reindex,getHealth,getLifecycle) verifies both the non-deepchat-agent guard and the success path. The newmemory.pagetest only exercises the success path — worth adding a companion case assertingpageMemoriesis not called and an empty page is returned for a non-managed agent, matching the sibling tests' pattern.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/main/routes/dispatcher.test.ts` around lines 2262 - 2314, Add a companion `memory.page` dispatch test for a non-managed agent, following the guard-branch pattern used by the other `memory.*` tests. Assert `pageMemories` is not called and the result contains an empty items array (with no next cursor), then retain the existing deepchat success-path test.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/architecture/agent-memory-system/spec.md`:
- Around line 126-133: Update the module table entry for asyncSemaphore to
reference src/main/lib/asyncSemaphore.ts instead of
memoryPresenter/infra/asyncSemaphore.ts, preserving its existing description.
In `@src/main/presenter/agentRuntimePresenter/index.ts`:
- Around line 2798-2932: Persistent failures in rebuildMemoryIngestionRange
leave extraction permanently unable to commit its cursor, causing the same tape
tail to rebuild on every run. Add a bounded retry or circuit-breaker around
projectionTable.replaceSession, tracking failures per session and suppressing
repeated rebuild attempts for a cooldown or threshold; alternatively propagate
an explicit degraded state that buildMemoryExtractionWindow can handle without
repeatedly clearing cursorCommitOrderSeq. Update listMemoryIngestionRange and
rebuildMemoryIngestionRange consistently so recovery after a successful
replacement resets the failure state.
In `@src/renderer/settings/components/MemoryListView.vue`:
- Around line 151-161: Hide the load-more footer while a search is active by
adding a !searchActive condition to the existing v-if around the
memory-load-more Button. Locate the template block using
data-testid="memory-load-more"; retain the existing initialLoading and
nextCursor guards alongside the new searchActive guard.
In `@test/main/presenter/agentMemoryAuditRetention.test.ts`:
- Around line 39-41: Update the query-plan assertion in
agentMemoryAuditRetention tests to require the exact replacement index name,
changing the expected value to idx_agent_memory_audit_operational_retention_v2
rather than the shared prefix.
In `@test/main/presenter/agentMemoryTable.test.ts`:
- Around line 1630-1651: Guard the test “drops a partial FTS build and fails
open to one bounded LIKE query” against the required-native environment by
temporarily clearing DEEPCHAT_REQUIRE_NATIVE_SQLITE for its duration and
restoring the original value afterward. Keep the existing simulated FTS failure
and LIKE fallback assertions unchanged.
In `@test/main/presenter/memoryPresenter.test.ts`:
- Around line 5916-5931: Fix the copy-paste error in the target ID setup by
changing the repo.updateStatus call inside the targetIds map callback to use the
loop’s id for both the row identifier and embeddingId, ensuring each target-N
record receives the intended embedding metadata.
---
Nitpick comments:
In `@docs/architecture/agent-memory-performance-and-scale/tasks.md`:
- Line 116: Rephrase the checklist item near “Key embedding connection warmup”
to replace “with success” with the more concise “successful” while preserving
the existing meaning.
In `@src/main/presenter/memoryPresenter/services/maintenanceService.ts`:
- Around line 509-515: Add an early budget-capacity guard at the start of the
scan loop in the maintenance service, before any query such as
queryNeighborsByMemoryId runs. Break when budget.snapshot().inputTokens has
reached MAINTENANCE_MAX_INPUT_TOKENS; retain the existing per-candidate precheck
for prompt-size validation.
In `@src/main/presenter/memoryPresenter/services/reflectionService.ts`:
- Around line 73-76: Replace the magic 256 token subtraction in the reflection
token calculation with a named REFLECTION_PROMPT_OVERHEAD_TOKENS constant
defined alongside the other runtime constants, then use that constant in the
availableTokens calculation and update any related references.
In `@src/main/presenter/memoryPresenter/services/writeCoordinator.ts`:
- Around line 644-650: Replace the hardcoded maxBatches value 2 in
writeCoordinator’s initial requestBatchDecisions call with the
DECISION_BATCH_MAX_BATCHES constant imported from batchDecision.ts, preserving
the existing behavior while keeping it synchronized with the configured limit.
In
`@src/main/presenter/sqlitePresenter/tables/deepchatMemoryIngestionProjection.ts`:
- Around line 150-165: The retraction and non-sequential append paths in the
projection handler always trigger full session invalidation, which may be costly
during bursts. Review the callers and implementation of invalidateSession and
the surrounding ingestion logic, then confirm this rebuild strategy is
acceptable at the expected scale; if not, replace it with targeted correction or
deduplicated/deferred invalidation while preserving correctness.
In `@src/main/presenter/sqlitePresenter/tables/deepchatTapeEffectiveSemantics.ts`:
- Around line 120-131: Update tapeToolRank to distinguish explicit terminal
statuses from missing or unrecognized statuses: preserve the existing pending
handling, but return a non-terminal rank for null or unsupported status values
so callers such as applyAppendedEntry do not treat them as completed. Use
readTapeToolStatus as the status source and define the accepted terminal status
values explicitly.
In `@test/main/presenter/agentRuntimePresenter/agentRuntimePresenter.test.ts`:
- Around line 1213-1296: Add regression coverage for the incremental
applyAppendedEntry path using the real DeepChatMemoryIngestionProjectionTable,
rather than the mock that always marks the projection stale. Append sequential
entries, call applyAppendedEntry directly, then verify readCurrentRange returns
the updated bounded rows without invalidation or full rebuild.
In `@test/main/presenter/memoryMaintenanceBudget.test.ts`:
- Around line 1-8: The test file mixes AsyncSemaphore tests with maintenance
budget tests, violating the mirrored test layout. Move the AsyncSemaphore suite
and its import to test/main/lib/asyncSemaphore.test.ts, leaving
MaintenanceBudget and selectMaintenanceRowsWithinTokenBudget tests in the
presenter test file.
In `@test/main/routes/dispatcher.test.ts`:
- Around line 2262-2314: Add a companion `memory.page` dispatch test for a
non-managed agent, following the guard-branch pattern used by the other
`memory.*` tests. Assert `pageMemories` is not called and the result contains an
empty items array (with no next cursor), then retain the existing deepchat
success-path test.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: dd89b399-80a8-4db7-bdff-248a6732d6c7
📒 Files selected for processing (120)
.github/workflows/prcheck.ymldocs/architecture/agent-memory-performance-and-scale/plan.mddocs/architecture/agent-memory-performance-and-scale/spec.mddocs/architecture/agent-memory-performance-and-scale/tasks.mddocs/architecture/agent-memory-system/spec.mdpackage.jsonscripts/architecture-guard.mjssrc/main/lib/asyncSemaphore.tssrc/main/presenter/agentRuntimePresenter/index.tssrc/main/presenter/agentRuntimePresenter/memoryExtractionChunks.tssrc/main/presenter/agentRuntimePresenter/tapeEffectiveView.tssrc/main/presenter/agentRuntimePresenter/tapeFacts.tssrc/main/presenter/configPresenter/index.tssrc/main/presenter/index.tssrc/main/presenter/memoryPresenter/context.tssrc/main/presenter/memoryPresenter/core/batchDecision.tssrc/main/presenter/memoryPresenter/core/decision.tssrc/main/presenter/memoryPresenter/core/extraction.tssrc/main/presenter/memoryPresenter/core/jsonExtraction.tssrc/main/presenter/memoryPresenter/core/lifecycle.tssrc/main/presenter/memoryPresenter/core/maintenanceBudget.tssrc/main/presenter/memoryPresenter/core/recallKeyword.tssrc/main/presenter/memoryPresenter/index.tssrc/main/presenter/memoryPresenter/infra/embeddingPipeline.tssrc/main/presenter/memoryPresenter/infra/memoryVectorStore.tssrc/main/presenter/memoryPresenter/infra/providerGateway.tssrc/main/presenter/memoryPresenter/infra/vectorStoreManager.tssrc/main/presenter/memoryPresenter/ports.tssrc/main/presenter/memoryPresenter/runtimeConstants.tssrc/main/presenter/memoryPresenter/services/conflictService.tssrc/main/presenter/memoryPresenter/services/maintenanceService.tssrc/main/presenter/memoryPresenter/services/managementService.tssrc/main/presenter/memoryPresenter/services/personaService.tssrc/main/presenter/memoryPresenter/services/reflectionService.tssrc/main/presenter/memoryPresenter/services/retrievalService.tssrc/main/presenter/memoryPresenter/services/workingMemoryService.tssrc/main/presenter/memoryPresenter/services/writeCoordinator.tssrc/main/presenter/memoryPresenter/types.tssrc/main/presenter/sqlitePresenter/importData.tssrc/main/presenter/sqlitePresenter/index.tssrc/main/presenter/sqlitePresenter/schemaCatalog.tssrc/main/presenter/sqlitePresenter/sqliteCopyExclusions.tssrc/main/presenter/sqlitePresenter/tables/agentMemory.tssrc/main/presenter/sqlitePresenter/tables/agentMemoryAudit.tssrc/main/presenter/sqlitePresenter/tables/agentMemoryFtsPolicy.tssrc/main/presenter/sqlitePresenter/tables/deepchatMemoryIngestionProjection.tssrc/main/presenter/sqlitePresenter/tables/deepchatTapeEffectiveSemantics.tssrc/main/presenter/sqlitePresenter/tables/deepchatTapeEntries.tssrc/main/presenter/toolPresenter/agentTools/agentMemoryTools.tssrc/main/presenter/workspacePresenter/concurrencyLimiter.tssrc/main/presenter/workspacePresenter/fileSearcher.tssrc/main/routes/index.tssrc/renderer/api/MemoryClient.tssrc/renderer/settings/components/MemoryLifecyclePanel.vuesrc/renderer/settings/components/MemoryListView.vuesrc/renderer/settings/components/MemorySettings.vuesrc/renderer/src/i18n/da-DK/settings.jsonsrc/renderer/src/i18n/de-DE/settings.jsonsrc/renderer/src/i18n/en-US/settings.jsonsrc/renderer/src/i18n/es-ES/settings.jsonsrc/renderer/src/i18n/fa-IR/settings.jsonsrc/renderer/src/i18n/fr-FR/settings.jsonsrc/renderer/src/i18n/he-IL/settings.jsonsrc/renderer/src/i18n/id-ID/settings.jsonsrc/renderer/src/i18n/it-IT/settings.jsonsrc/renderer/src/i18n/ja-JP/settings.jsonsrc/renderer/src/i18n/ko-KR/settings.jsonsrc/renderer/src/i18n/ms-MY/settings.jsonsrc/renderer/src/i18n/pl-PL/settings.jsonsrc/renderer/src/i18n/pt-BR/settings.jsonsrc/renderer/src/i18n/ru-RU/settings.jsonsrc/renderer/src/i18n/tr-TR/settings.jsonsrc/renderer/src/i18n/vi-VN/settings.jsonsrc/renderer/src/i18n/zh-CN/settings.jsonsrc/renderer/src/i18n/zh-HK/settings.jsonsrc/renderer/src/i18n/zh-TW/settings.jsonsrc/shared/contracts/routes.tssrc/shared/contracts/routes/memory.routes.tssrc/shared/lib/unicodeText.tssrc/shared/types/agent-memory.tstest/main/nativeSqliteHarness.tstest/main/performance/memory/fixtures.tstest/main/performance/memory/maintenanceScale.perf.tstest/main/performance/memory/memoryBaseline.perf.tstest/main/performance/memory/performanceObserver.tstest/main/performance/memory/recallScale.perf.tstest/main/performance/memory/tapeScale.perf.tstest/main/performance/memory/timing.tstest/main/performance/memory/workloadBounds.perf.tstest/main/presenter/agentMemoryAuditRetention.test.tstest/main/presenter/agentMemoryPaginationNative.test.tstest/main/presenter/agentMemoryTable.test.tstest/main/presenter/agentRuntimePresenter/agentRuntimePresenter.test.tstest/main/presenter/agentRuntimePresenter/memoryExtractionChunks.test.tstest/main/presenter/configPresenter/deprecatedProviderCleanup.test.tstest/main/presenter/fakes/memoryFakes.tstest/main/presenter/memoryAdd.test.tstest/main/presenter/memoryAuditRetention.test.tstest/main/presenter/memoryBatchDecision.test.tstest/main/presenter/memoryEmbeddingScale.test.tstest/main/presenter/memoryExtraction.test.tstest/main/presenter/memoryLifecycle.test.tstest/main/presenter/memoryMaintenanceBudget.test.tstest/main/presenter/memoryNativeMigration.test.tstest/main/presenter/memoryPagination.test.tstest/main/presenter/memoryPresenter.test.tstest/main/presenter/memoryRetrieval.eval.test.tstest/main/presenter/memoryUpdate.test.tstest/main/presenter/memoryVectorStore.test.tstest/main/presenter/recallKeyword.test.tstest/main/presenter/sqlitePresenter/deepchatMemoryIngestionProjection.test.tstest/main/presenter/toolPresenter/agentTools/agentMemoryTools.test.tstest/main/routes/dispatcher.test.tstest/main/routes/memoryDto.test.tstest/main/scripts/architectureGuard.test.tstest/main/shared/unicodeText.test.tstest/renderer/api/clients.test.tstest/renderer/components/MemoryListView.test.tstest/renderer/components/MemorySettings.test.tsvitest.config.memory-perf.ts
💤 Files with no reviewable changes (1)
- src/main/presenter/workspacePresenter/concurrencyLimiter.ts
Summary
Scale Agent Memory for large memory corpora, long Tape histories, and multi-agent workloads while preserving existing correctness, privacy, and compatibility guarantees.
Changes
memory.pagekeyset pagination while retaining deprecatedmemory.listcompatibility.Summary by CodeRabbit
content-too-large.