refactor(memory): refactor TestMemoryStore to use the unified storage interface - #3260
Conversation
|
Assessment: Comment Clean, well-motivated refactor — moving Review themes
Nice work dropping the load-memoization complexity and improving browser-bundle safety with the static |
9ee577e to
6f46a1f
Compare
61e0ba8 to
e7f6484
Compare
Re-review (latest push, merge commit
|
|
Docs haven't yet been released, the TestMemoryStore was released last week. So breaking change seems acceptable to me. |
Re-review (updated after force-push)Assessment: Comment — the two substantive concerns from my first pass are addressed in code. One follow-up (test coverage) and one process item remain, neither blocking. Status of prior feedback
Housekeeping: my earlier tooling retried and created duplicate inline threads on lines 149/150. I lack permission to delete/edit them, so I've replied marking the extra copies as duplicates — please disregard those. Nice, focused iteration on the namespacing fix. |
|
What if |
|
@pgrayy that's the crux of the bar-raising decision, so let me lay out the tradeoff both ways rather than pick a side. Your framing (keep
What that gives up — i.e., "does it need anything other than
There's also a consistency dimension: Possible middle ground worth weighing: keep an ergonomic persistence default (so the common call site doesn't silently lose data) and accept an optional Net: if the team's read is that this store will only ever realistically be local-file or in-memory, your under-the-hood approach is the lower-risk call. If browser/community backends are in scope (the TS browser-safety work suggests they are), exposing |
|
@pgrayy good question to pressure-test the whole approach — I think it splits into two parts: "Does "Keep the same constructor args but build The hybrid worth considering (close to @opieter-aws's earlier sketch, minus the deprecation): accept new TestMemoryStore({ name }) // persists to ~/.strands/memory (unchanged — no data loss)
new TestMemoryStore({ name, persist: false }) // ephemeral
new TestMemoryStore({ name, path: '/data/notes.json' })// custom file
new TestMemoryStore({ name, storage: new S3Storage() })// any backendThat gets backwards-compat + zero silent migration surprises + full extensibility. The price is a wider config surface and a precedence rule to document (what happens if both Net: the pure "constructor-args-only, LocalFileStorage under the hood" option is the simplest but forfeits the browser story that partly motivated the migration; the hybrid keeps that story while erasing the breaking-change concerns. Given docs aren't released and usage is ~zero, the clean |
|
@strandly-the-agent review latest implementation |
Re-review of the latest implementationThis pivot is a clean resolution — nicely done. The store now runs on the unified
One actionable item (Important) — PR metadata is now staleThe code is no longer a breaking change, but the PR still advertises one:
Please update the title (drop the Minor / optional
Assessment: Approve (pending the metadata cleanup). The implementation is correct, backwards-compatible, well-tested, and preserves the guarantees of the original. This ended up in a much better place than a breaking change — good call incorporating the backwards-compatible route. |
Description
TestMemoryStorehand-rolled its own filesystem persistence in both SDKs — path resolution, atomic temp-file writes, plus a records cache with load memoization to paper over cold-load races. The unifiedStorageinterface exists precisely to delete this per-subsystem re-invention, and the storage design doc names the memory store as a consumer to migrate. This moves persistence onto aStoragebackend internally.The public config is unchanged:
persist/pathand the~/.strands/memory/<name>.jsondefault behave exactly as before. Internally the store now resolves a backend from that config —persist: false→InMemoryStorage, otherwise aLocalFileStoragerooted so an explicitpathstill writes to that exact file and the default still lands at the home-dir location. Dropping the bespoke cache also let the read-modify-write inaddread fresh under a lock, closing the cold-load race by construction rather than guarding against it.Related Issues
#3099
#3253
Documentation PR
N/A
Type of Change
Other (please describe): internal refactor — no public API or behavior change
Testing
Ran the
TestMemoryStoreunit suites in both SDKs (Python pytest, TS Node), plus type-check, lint, and format for each; all pass. Exercised each store end to end against both backends, confirming the default home-dir path, an explicitpath,persist: falseephemerality, dedup, and cross-loop reuse from a synchronous agent all behave as before.hatch run prepareChecklist
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.