Releases: joslat/agent-memory-dotnet
Release list
v1.3.0
What's Changed
- feat: structured ingestion outcomes for partial extraction/persistence failures (#101) by @joslat in #116
- feat: pluggable task-aware automatic recall policy for the MAF adapter (#88) by @joslat in #117
- feat: memory-context admission policy — Phase 2 of trust boundaries (#92) by @joslat in #118
- feat: trust-metadata foundation — Phase 3 of trust boundaries (#92) by @joslat in #119
- feat: configurable recall message role for trust-gated demotion (#92 Phase 4) by @joslat in #120
- feat: monotonic trust for facts on re-extraction (#92 Phase 5) by @joslat in #121
- feat: extend trust boundaries to the Semantic Kernel adapter (#92 Phase 6) by @joslat in #123
- fix: correct orphaned FactId on re-extraction, refresh stale docs (post-Phase-5 audit) by @joslat in #122
- feat: gate recalled-message role, close caller-controlled role hole (#92 Phase 7) by @joslat in #124
- Trust boundaries, Phase 8: recalled-message content admission (#92) by @joslat in #126
- Bump OpenTelemetry.Api from 1.12.0 to 1.15.3 by @dependabot[bot] in #106
- build(deps): bump the actions group across 1 directory with 5 updates by @dependabot[bot] in #125
- Bump Microsoft.Extensions.AI.Abstractions and 7 others by @dependabot[bot] in #115
- Stabilization pass: 25 issues fixed by a 5-angle repo audit (Phase 0 of NAMS prep) by @joslat in #127
- NAMS Phase 0: baseline freeze + contract discovery by @joslat in #129
- NAMS Phase 1: AgentMemory.Nams additive package skeleton by @joslat in #130
- NAMS Phase 2: low-level REST client and error model (AgentMemory.Nams) by @joslat in #131
- NAMS Phase 3: identity and conversation mapping (AgentMemory.Nams) by @joslat in #132
- NAMS Phase 4: recall and context mapping (AgentMemory.Nams) by @joslat in #133
- NAMS Phase 5: post-turn persistence (AgentMemory.Nams) by @joslat in #134
- NAMS Phase 6: dedicated MAF provider (AgentMemory.AgentFramework.Nams) by @joslat in #135
- NAMS: well-known endpoint, X-Workspace-Id fix, live-integration test scaffold by @joslat in #136
- NAMS Phase 11: NamsAgent sample (AgentMemory.Sample.NamsAgent) by @joslat in #137
- NAMS Phase 9: observability (spans, metrics, health checks) by @joslat in #138
- NAMS Phase 10: expand live scenario coverage (concurrency, cancellation, Unicode) by @joslat in #139
- NAMS Phase 8: MCP/capability-aware tools (AgentMemory.McpServer.Nams) by @joslat in #140
- NAMS Phase 10a: SearchMessagesAsync + payload edge-case live tests by @joslat in #141
- NAMS Phase 10b: data lifecycle -- delete conversation by @joslat in #142
- NAMS Phase 10c: multi-instance mapping live test by @joslat in #143
- NAMS Phase 10d: session-restore asserted live test by @joslat in #144
- NAMS Phase 10e: TCK Platinum live-probe spike findings by @joslat in #145
- NAMS Phase 10f: conversation lifecycle & context completion by @joslat in #146
- NAMS Phase 10g: entity feedback + graph by @joslat in #147
- NAMS Phase 10h: reasoning & provenance by @joslat in #148
- NAMS Phase 10i: Cypher query console (gated capability) by @joslat in #149
- NAMS Phase 10 post-completion review: fix real findings, consolidate duplication by @joslat in #150
- NAMS client: replace bool isIdempotent with a NamsRetryEligibility enum by @joslat in #151
- NAMS Phase 10j: CreateEntityAsync (add_entity), needed for the TCK Platinum bridge by @joslat in #152
- NAMS TCK Platinum bridge: official upstream conformance suite support by @joslat in #153
- NAMS MCP tools: entity-graph and reasoning/provenance operations by @joslat in #154
- NAMS TCK Platinum bridge: add missing DTO wire-contract unit tests by @joslat in #155
- NAMS: fix real bugs found by a fresh code-review round by @joslat in #156
- NAMS round 3: fix real bugs found by a regression audit + fresh sweep by @joslat in #157
- NAMS round 4: fix a real body-stream exception-handling gap by @joslat in #158
- NAMS round 5: close a redaction-bypass gap in exception logging by @joslat in #159
- NAMS round 6: fix an unbounded-backoff crash bug shared with Enrichment by @joslat in #160
New Contributors
- @dependabot[bot] made their first contribution in #106
Full Changelog: v1.2.0...v1.3.0
v1.2.0
Added
AgentFrameworkOptions.ExposeMemoryToolsFromContextProvider— optional memory-tool exposure viaAIContext.Tools(#86).Neo4jMemoryContextProvidercan now surface the six standard memory tools (MemoryToolFactory.CreateAIFunctions()) itself throughAIContext.Tools, soAIContextProviders = [memoryProvider]alone is enough to give an agent LLM-callable memory tools — no separateChatOptions.Tools = [.. memoryTools]wiring required.
Defaults tofalse:AddAgentMemoryFrameworkregistersMemoryToolFactoryunconditionally, and its tools include write-capable ones (remember_fact,remember_preference), so exposure must stay opt-in rather than firing just because the factory is present in DI. EveryBuildContextAsyncbranch (a recall hit, an empty recall, a recall failure, or no user message at all) shares oneAIContext-construction helper, so tool availability never silently drops on a quiet turn.ContextFormatOptions.MaxChatHistoryMessages(#91, see Fixed below) — the new name for what wasMaxContextMessages.
Fixed
AddGraphRagAdapter()could never actually resolveIGraphRagContextSource—IDriverwas never registered in DI.Neo4jGraphRagContextSourcetakesIDrivervia constructor injection, butAddNeo4jAgentMemoryonly registeredINeo4jDriverFactory(which wrapsIDriverviaGetDriver()), neverIDriveritself. Any host that calledAddGraphRagAdapter()hitInvalidOperationException: Unable to resolve service for type 'Neo4j.Driver.IDriver'the first time GraphRAG retrieval ran — this broke the feature for every consumer, not just the sample that surfaced it. Fixed by registeringIDriverfrom the existingINeo4jDriverFactorysingleton inAddNeo4jAgentMemory.ContextFormatOptions.MaxContextMessagesrenamed toMaxChatHistoryMessages, old name kept as an[Obsolete]compatibility alias (#91). The option was documented as capping the complete injected context, but the implementation always preserved the context prefix and every memory-derived block (entities/facts/preferences/reasoning traces/GraphRAG) — only recalled chat history was ever truncated to fit. The renamed option's implementation now matches its name: it bounds only recalled chat history, independent of the prefix/memory-block count. Negative values are rejected by option validation;MaxChatHistoryMessages = 0means no recalled chat history, but memory blocks may still be included. UseContextBudget.MaxTokens/MaxCharactersfor a hard cap on total prompt size.
Changed
-
Every sample now calls a real Azure OpenAI chat and/or embedding model — no mocks. Removed
EchoChatClient/ShoppingEchoChatClient/StubEmbeddingGeneratorfrom every sample (AgentWithMemory, RealAgent, MemoryToolsAgent, ChatHistoryProvider, ShoppingAssistant, BlendedAgent, MinimalAgent, McpHost, and the AspireDemo app). A newsamples/AgentMemory.Samples.Sharedproject centralizes the wiring:RealAzureOpenAI.TryCreateresolvesAZURE_OPENAI_*environment variables and fails fast with setup instructions if they're missing (no silent mock fallback).MemoryTraceChatClientprints the<recalled_memory>context the provider injects before each live model call.SampleConsolegives each sample color-coded user/assistant/memory-action console output.
The five agent samples now let the model decide on its own when to call memory/product tools, rather than scripting the calls a mock model couldn't make itself.
Full Changelog: see CHANGELOG.md
v1.1.0
What's Changed
- ci: verify main, harden release validation, add replacement CI by @joslat in #93
- ci: delete Squad automation, rewrite release.yml with OIDC trusted publishing by @joslat in #94
- ci: current-head-only tag policy, dedicated package-consumer smoke tests by @joslat in #95
- ci: wire up Codecov, add Dependabot, pin actions to SHA by @joslat in #96
- docs: correct the absolute multi-tenant isolation claim by @joslat in #98
- docs: draft and publish the threat model and security policy by @joslat in #103
- tests: close the two live owner-isolation coverage gaps by @joslat in #104
- Add a library-wide strict multi-tenant isolation mode (#100 Stage 1) by @joslat in #105
- Guarantee owner scoping across the complete MAF invocation (#90) by @joslat in #107
- Stop promoting raw recalled memory into unrestricted system messages (#92 Phase 1) by @joslat in #108
- Wire configured RecallOptions into native MAF recall (#87) by @joslat in #109
- Persist and extract from the complete turn, not just the response (#89) by @joslat in #110
- fix: idempotent cross-component message persistence + non-text-content policy (#89) by @joslat in #111
- docs+build: fix stale/inaccurate docs and wire ShoppingAssistant into CI by @joslat in #112
- Complete StrictMultiTenant coverage across remaining adapters and MCP tools (#100 Stage 2) by @joslat in #113
Full Changelog: v1.0.3...v1.1.0
v1.0.3
v1.0.2
What's Changed
- docs: Microsoft Agent Framework integration guide (Neo4j memory provider for .NET) by @joslat in #84
- samples: add ShoppingAssistant — .NET port of the official Neo4j retail-assistant for MAF by @joslat in #85
Full Changelog: v1.0.1...v1.0.2
v1.0.1
v1.0.0
What's Changed
- TCK Bronze HTTP bridge + full Bronze conformance (93/93) + two Cypher bug fixes by @joslat in #70
- TCK Silver tier (67/67) + post-Bronze hardening (docs, MQ005 de-flake, query sweep) by @joslat in #73
- Add TCK Gold tier to the compatibility bridge by @joslat in #74
- 1.0 API surface (1/4): internalize implementation types behind the public interfaces by @joslat in #75
- 1.0 API surface (2/4): interface follow-ups + MergeEntitiesAsync return value by @joslat in #76
- 1.0 API surface (3/4): correctness & contract-honesty pass by @joslat in #77
- 1.0 API surface (4/4): naming, enum & deprecated-surface freeze by @joslat in #78
- 1.0 API surface (5): type-safety shape changes (enums + collapsed overloads) by @joslat in #79
- 1.0 API surface (6): MemoryNodeKind enum (replace string nodeLabel) by @joslat in #80
- 1.0 API surface (7): rename ct -> cancellationToken (library-wide) by @joslat in #81
- 1.0 API surface (8): Diffbot keyed-DI (opt-in enrichment provider) by @joslat in #82
- Merge: re-point all typed RELATED_TO relationships onto the survivor by @joslat in #83
Full Changelog: v0.1.0-preview.4...v1.0.0
v0.1.0-preview.4
What's Changed
- feat(di): meta AddNeo4jAgentMemory forwards configureStore + multi-store docs by @joslat in #16
- docs: reconcile drift with shipped code (counts, versions, statuses) by @joslat in #17
- docs: ROADMAP (overarching plan+status) + reorganize docs into folders by @joslat in #18
- feat(cli): add schema-check command (runtime schema conformance) by @joslat in #19
- refactor(core): extract ITruncationStrategy from MemoryContextAssembler (S9) by @joslat in #20
- feat(neo4j): implement ISchemaManager — versioned :Schema node persistence (G4) by @joslat in #21
- feat(benchmarks): BenchmarkDotNet harness for hot-path Neo4j operations by @joslat in #22
- chore(ci): Node-20→24 action bumps + xUnit1026 fixes + G4 E2E shakedown by @joslat in #23
- fix(benchmarks): assert result counts in the --smoke self-test by @joslat in #24
- fix(extraction): guard streaming chunker against Overlap >= ChunkSize (infinite loop / OOM) by @joslat in #26
- fix: five audit-confirmed correctness defects (Truncated flag, datetime, lat/lon, MCP status, base URL) by @joslat in #27
- fix(di): LLM extractors must Replace Core stubs (LLM extraction was silently dead) by @joslat in #25
- fix(neo4j): Fact upsert ON MATCH must not clobber stable id or supersession valid_until by @joslat in #28
- fix(core): embedding back-fill must make forward progress (infinite-loop guard) by @joslat in #29
- fix(core): wire D3 ranking context + guard as-of recall on empty embedding by @joslat in #30
- fix(extraction): propagate caller cancellation instead of swallowing it by @joslat in #31
- fix: CLI dash-value scope-widening + MCP relationship owner + Diffbot culture + Lucene test gap by @joslat in #32
- fix(neo4j): dedup-on-create must exclude soft-invalidated nodes (re-asserted knowledge was lost) by @joslat in #33
- fix(core): EmbeddingOrchestrator must propagate cancellation, not mask it as an empty vector by @joslat in #34
- fix(enrichment): background queue must retry transient Error/RateLimited results, not treat them as success by @joslat in #35
- fix(maf): context provider must not drop recalled memory when chat fills the budget by @joslat in #36
- fix(core): honor ExtractionOptions.EnableAutoMerge (dead toggle → silent destructive merge) by @joslat in #37
- fix(core): wire LongTermMemoryOptions.MinConfidenceThreshold into Add* persistence by @joslat in #38
- fix(extraction): wire LlmExtractionOptions.EntityTypes into the entity prompt by @joslat in #39
- fix(reasoning): enforce ReasoningMemoryOptions.MaxTracesPerSession retention cap by @joslat in #40
- fix(enrichment): wire EnrichmentOptions/GeocodingOptions.MaxRetries (retry policy) by @joslat in #41
- fix(enrichment): keep background worker alive on non-cancellation faults by @joslat in #42
- fix(core): propagate caller cancellation in ContextCompressor LLM calls by @joslat in #43
- fix(analytics): re-probe GDS after a transient failure; log the exception by @joslat in #44
- fix(core): correct as-of recall total, backfill update count, and recall docs by @joslat in #45
- fix(core): tolerate a vanished dedup target in MarkDeduplicated by @joslat in #46
- fix(core): honor ShortTermMemoryOptions.DefaultRecentMessageLimit by @joslat in #47
- fix(mcp): report McpServerOptions.ServerName/ServerVersion to MCP clients by @joslat in #48
- fix(maf): honor AgentFrameworkOptions.PersistReasoningTraces by @joslat in #49
- fix(reasoning): honor StoreToolCalls + GenerateTaskEmbeddings by @joslat in #50
- refactor(options): remove dead duplicate options (EnableEntityResolution, EnableAutoExtraction) by @joslat in #51
- refactor(options): remove dead MemoryDecayOptions.MaxMemoriesPerSession by @joslat in #52
- test(core): fix CS8620 nullable warnings in dedup mock setups by @joslat in #53
- fix(neo4j): re-asserting a Fact triple restores it to live recall + lands embedding/provenance by @joslat in #54
- fix(neo4j): make the empty-embedding guard a search-boundary invariant by @joslat in #55
- fix(reasoning): trace prune confines to one owner bucket — never cross-evict (regression from #40) by @joslat in #56
- fix(extraction): honor caller cancellation in the entity-resolution loop by @joslat in #57
- fix(core): clamp token→char budget so a huge MaxTokens can't overflow to empty context by @joslat in #58
- fix(enrichment): don't cache transient (Error/RateLimited) enrichment results by @joslat in #59
- fix(mcp): surface confidence-gate skip in add tools (R5 #1) by @joslat in #60
- test(mcp): pin graph_query read-only enforcement (R5 #11) by @joslat in #61
- fix(neo4j): align Fact UpsertBatch MERGE key with single-upsert triple (R5 #10) by @joslat in #62
- fix(agentframework): honor caller cancellation across MAF adapters (R6-A) by @joslat in #63
- fix(neo4j): exclude soft-invalidated entities from resolution/dedup (R6-B) by @joslat in #64
- fix(isolation): confine ClearSession/DeleteBySession to one owner bucket (R6-C) by @joslat in #65
- fix(context): keep newest messages, not oldest, on truncation (R6-D) by @joslat in #66
- fix(reasoning): handle concurrent trace deletion in update/add-step (R6-E) by @joslat in #67
- chore(src): enforce ConfigureAwait(false) in library code via CA2007 (R6 cleanup) by @joslat in #68
- chore: remaining R6 LOW cleanup — culture, telemetry status, dead option by @joslat in #69
Full Changelog: v0.1.0-preview.3...v0.1.0-preview.4
v0.1.0-preview.3
What's Changed
- DELETE_SESSION_DATA Gap: batch session delete + ReasoningTrace cleanup by @joslat in #1
- Remediation: multi-user isolation (R1/R1b), decay adapter, hardening — v0.1.0-preview.1 prep by @joslat in #2
- Decay/bitemporal (D1–D7), R2 isolation, schema-parity kit, observability deflake by @joslat in #3
- Expose invalidate/supersede on the public API (completes D5/D7) by @joslat in #4
- Cycle-1 throat-check fixes: graph-walk path isolation + doc fixes by @joslat in #5
- AgentMemory.Analytics — optional GDS PageRank + community detection by @joslat in #6
- Cycle-2 review fixes: GDS robustness/isolation + self-supersede guard by @joslat in #7
- fix(review): cycle-3 — extraction/persistence durability + adapter isolation/ordering by @joslat in #8
- feat(isolation): host-facing BeginOwnerScope — proper closure for cycle-3 #4 by @joslat in #9
- fix(review): cycle-4 — CLI exit codes + SK tool contract + observability spans by @joslat in #10
- fix(review): cycle-5 — GraphRAG retrieval + MCP isolation + assembler correctness by @joslat in #11
- fix(review): cycle-6 — Enrichment HTTP timeouts + sample host disposal by @joslat in #12
- docs: capstone cross-cutting review (0 confirmed — library is clean) by @joslat in #13
- release: cut 0.1.0-preview.3 (version + CHANGELOG) by @joslat in #14
- release: date preview.3 changelog to 2026-06-14 by @joslat in #15
New Contributors
Full Changelog: https://github.com/joslat/agent-memory-dotnet/commits/v0.1.0-preview.3