Skip to content

Releases: joslat/agent-memory-dotnet

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 19:54

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

Full Changelog: v1.2.0...v1.3.0

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 15 Jul 19:19
1480e52

Added

  • AgentFrameworkOptions.ExposeMemoryToolsFromContextProvider — optional memory-tool exposure via AIContext.Tools (#86). Neo4jMemoryContextProvider can now surface the six standard memory tools (MemoryToolFactory.CreateAIFunctions()) itself through AIContext.Tools, so AIContextProviders = [memoryProvider] alone is enough to give an agent LLM-callable memory tools — no separate ChatOptions.Tools = [.. memoryTools] wiring required.
    Defaults to false: AddAgentMemoryFramework registers MemoryToolFactory unconditionally, 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. Every BuildContextAsync branch (a recall hit, an empty recall, a recall failure, or no user message at all) shares one AIContext-construction helper, so tool availability never silently drops on a quiet turn.
  • ContextFormatOptions.MaxChatHistoryMessages (#91, see Fixed below) — the new name for what was MaxContextMessages.

Fixed

  • AddGraphRagAdapter() could never actually resolve IGraphRagContextSourceIDriver was never registered in DI. Neo4jGraphRagContextSource takes IDriver via constructor injection, but AddNeo4jAgentMemory only registered INeo4jDriverFactory (which wraps IDriver via GetDriver()), never IDriver itself. Any host that called AddGraphRagAdapter() hit InvalidOperationException: 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 registering IDriver from the existing INeo4jDriverFactory singleton in AddNeo4jAgentMemory.
  • ContextFormatOptions.MaxContextMessages renamed to MaxChatHistoryMessages, 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 = 0 means no recalled chat history, but memory blocks may still be included. Use ContextBudget.MaxTokens/MaxCharacters for 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/StubEmbeddingGenerator from every sample (AgentWithMemory, RealAgent, MemoryToolsAgent, ChatHistoryProvider, ShoppingAssistant, BlendedAgent, MinimalAgent, McpHost, and the AspireDemo app). A new samples/AgentMemory.Samples.Shared project centralizes the wiring:

    • RealAzureOpenAI.TryCreate resolves AZURE_OPENAI_* environment variables and fails fast with setup instructions if they're missing (no silent mock fallback).
    • MemoryTraceChatClient prints the <recalled_memory> context the provider injects before each live model call.
    • SampleConsole gives 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

Choose a tag to compare

@github-actions github-actions released this 15 Jul 15:17
2da9af0

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

Choose a tag to compare

@github-actions github-actions released this 13 Jul 22:55

Full Changelog: v1.0.2...v1.0.3

v1.0.2

Choose a tag to compare

@github-actions github-actions released this 13 Jul 22:39

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

Choose a tag to compare

@github-actions github-actions released this 13 Jul 16:25

Full Changelog: v1.0.0...v1.0.1

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 12 Jul 23:44

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

Choose a tag to compare

@github-actions github-actions released this 21 Jun 11:45

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

Choose a tag to compare

@github-actions github-actions released this 14 Jun 06:36
156d9b2

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

  • @joslat made their first contribution in #1

Full Changelog: https://github.com/joslat/agent-memory-dotnet/commits/v0.1.0-preview.3