agmem 0.1.6__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. {agmem-0.1.6/agmem.egg-info → agmem-0.2.1}/PKG-INFO +15 -8
  2. {agmem-0.1.6 → agmem-0.2.1}/README.md +8 -6
  3. {agmem-0.1.6 → agmem-0.2.1/agmem.egg-info}/PKG-INFO +15 -8
  4. {agmem-0.1.6 → agmem-0.2.1}/agmem.egg-info/SOURCES.txt +15 -0
  5. {agmem-0.1.6 → agmem-0.2.1}/agmem.egg-info/requires.txt +6 -0
  6. {agmem-0.1.6 → agmem-0.2.1}/docs/FEDERATED.md +12 -5
  7. {agmem-0.1.6 → agmem-0.2.1}/docs/TEST_REPORT.md +7 -3
  8. {agmem-0.1.6 → agmem-0.2.1}/memvcs/__init__.py +1 -1
  9. {agmem-0.1.6 → agmem-0.2.1}/memvcs/cli.py +1 -1
  10. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/daemon.py +37 -1
  11. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/distill.py +6 -0
  12. agmem-0.2.1/memvcs/coordinator/__init__.py +5 -0
  13. agmem-0.2.1/memvcs/coordinator/server.py +239 -0
  14. agmem-0.2.1/memvcs/core/compression_metrics.py +248 -0
  15. agmem-0.2.1/memvcs/core/delta.py +258 -0
  16. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/distiller.py +76 -61
  17. agmem-0.2.1/memvcs/core/fast_similarity.py +404 -0
  18. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/federated.py +13 -2
  19. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/gardener.py +8 -68
  20. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/pack.py +192 -34
  21. agmem-0.2.1/memvcs/core/privacy_validator.py +187 -0
  22. agmem-0.2.1/memvcs/core/protocol_builder.py +198 -0
  23. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/remote.py +82 -2
  24. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/zk_proofs.py +62 -5
  25. agmem-0.2.1/memvcs/health/__init__.py +25 -0
  26. agmem-0.2.1/memvcs/health/monitor.py +452 -0
  27. {agmem-0.1.6 → agmem-0.2.1}/pyproject.toml +12 -1
  28. {agmem-0.1.6 → agmem-0.2.1}/setup.py +1 -1
  29. agmem-0.2.1/tests/test_compression_pipeline.py +158 -0
  30. agmem-0.2.1/tests/test_delta_encoding.py +297 -0
  31. agmem-0.2.1/tests/test_distiller_dp.py +52 -0
  32. agmem-0.2.1/tests/test_health_monitor.py +393 -0
  33. agmem-0.2.1/tests/test_ipfs_integration.py +134 -0
  34. {agmem-0.1.6 → agmem-0.2.1}/tests/test_pack_gc.py +61 -0
  35. agmem-0.2.1/tests/test_performance_benchmarks.py +257 -0
  36. {agmem-0.1.6 → agmem-0.2.1}/LICENSE +0 -0
  37. {agmem-0.1.6 → agmem-0.2.1}/MANIFEST.in +0 -0
  38. {agmem-0.1.6 → agmem-0.2.1}/agmem.egg-info/dependency_links.txt +0 -0
  39. {agmem-0.1.6 → agmem-0.2.1}/agmem.egg-info/entry_points.txt +0 -0
  40. {agmem-0.1.6 → agmem-0.2.1}/agmem.egg-info/top_level.txt +0 -0
  41. {agmem-0.1.6 → agmem-0.2.1}/docs/AGMEM_PUBLISHING_SETUP.md +0 -0
  42. {agmem-0.1.6 → agmem-0.2.1}/docs/CONFIG.md +0 -0
  43. {agmem-0.1.6 → agmem-0.2.1}/docs/GTM.md +0 -0
  44. {agmem-0.1.6 → agmem-0.2.1}/docs/KNOWLEDGE_GRAPH.md +0 -0
  45. {agmem-0.1.6 → agmem-0.2.1}/docs/SEQUENTIAL_VALIDATION.md +0 -0
  46. {agmem-0.1.6 → agmem-0.2.1}/docs/aux/INSTALL.md +0 -0
  47. {agmem-0.1.6 → agmem-0.2.1}/examples/basic_workflow.sh +0 -0
  48. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/__init__.py +0 -0
  49. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/add.py +0 -0
  50. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/audit.py +0 -0
  51. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/base.py +0 -0
  52. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/blame.py +0 -0
  53. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/branch.py +0 -0
  54. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/checkout.py +0 -0
  55. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/clean.py +0 -0
  56. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/clone.py +0 -0
  57. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/commit.py +0 -0
  58. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/decay.py +0 -0
  59. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/diff.py +0 -0
  60. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/federated.py +0 -0
  61. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/fsck.py +0 -0
  62. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/garden.py +0 -0
  63. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/gc.py +0 -0
  64. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/graph.py +0 -0
  65. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/init.py +0 -0
  66. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/log.py +0 -0
  67. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/mcp.py +0 -0
  68. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/merge.py +0 -0
  69. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/pack.py +0 -0
  70. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/prove.py +0 -0
  71. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/pull.py +0 -0
  72. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/push.py +0 -0
  73. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/recall.py +0 -0
  74. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/reflog.py +0 -0
  75. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/remote.py +0 -0
  76. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/repair.py +0 -0
  77. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/reset.py +0 -0
  78. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/resolve.py +0 -0
  79. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/resurrect.py +0 -0
  80. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/search.py +0 -0
  81. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/serve.py +0 -0
  82. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/show.py +0 -0
  83. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/stash.py +0 -0
  84. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/status.py +0 -0
  85. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/tag.py +0 -0
  86. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/test.py +0 -0
  87. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/timeline.py +0 -0
  88. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/tree.py +0 -0
  89. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/verify.py +0 -0
  90. {agmem-0.1.6 → agmem-0.2.1}/memvcs/commands/when.py +0 -0
  91. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/__init__.py +0 -0
  92. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/access_index.py +0 -0
  93. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/audit.py +0 -0
  94. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/compression_pipeline.py +0 -0
  95. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/config_loader.py +0 -0
  96. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/consistency.py +0 -0
  97. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/constants.py +0 -0
  98. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/crypto_verify.py +0 -0
  99. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/decay.py +0 -0
  100. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/diff.py +0 -0
  101. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/encryption.py +0 -0
  102. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/hooks.py +0 -0
  103. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/ipfs_remote.py +0 -0
  104. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/knowledge_graph.py +0 -0
  105. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/llm/__init__.py +0 -0
  106. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/llm/anthropic_provider.py +0 -0
  107. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/llm/base.py +0 -0
  108. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/llm/factory.py +0 -0
  109. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/llm/openai_provider.py +0 -0
  110. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/merge.py +0 -0
  111. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/objects.py +0 -0
  112. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/pii_scanner.py +0 -0
  113. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/privacy_budget.py +0 -0
  114. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/refs.py +0 -0
  115. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/repository.py +0 -0
  116. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/schema.py +0 -0
  117. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/staging.py +0 -0
  118. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/storage/__init__.py +0 -0
  119. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/storage/base.py +0 -0
  120. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/storage/gcs.py +0 -0
  121. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/storage/local.py +0 -0
  122. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/storage/s3.py +0 -0
  123. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/temporal_index.py +0 -0
  124. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/test_runner.py +0 -0
  125. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/trust.py +0 -0
  126. {agmem-0.1.6 → agmem-0.2.1}/memvcs/core/vector_store.py +0 -0
  127. {agmem-0.1.6 → agmem-0.2.1}/memvcs/integrations/__init__.py +0 -0
  128. {agmem-0.1.6 → agmem-0.2.1}/memvcs/integrations/mcp_server.py +0 -0
  129. {agmem-0.1.6 → agmem-0.2.1}/memvcs/integrations/web_ui/__init__.py +0 -0
  130. {agmem-0.1.6 → agmem-0.2.1}/memvcs/integrations/web_ui/server.py +0 -0
  131. {agmem-0.1.6 → agmem-0.2.1}/memvcs/retrieval/__init__.py +0 -0
  132. {agmem-0.1.6 → agmem-0.2.1}/memvcs/retrieval/base.py +0 -0
  133. {agmem-0.1.6 → agmem-0.2.1}/memvcs/retrieval/pack.py +0 -0
  134. {agmem-0.1.6 → agmem-0.2.1}/memvcs/retrieval/recaller.py +0 -0
  135. {agmem-0.1.6 → agmem-0.2.1}/memvcs/retrieval/strategies.py +0 -0
  136. {agmem-0.1.6 → agmem-0.2.1}/memvcs/utils/__init__.py +0 -0
  137. {agmem-0.1.6 → agmem-0.2.1}/memvcs/utils/helpers.py +0 -0
  138. {agmem-0.1.6 → agmem-0.2.1}/setup.cfg +0 -0
  139. {agmem-0.1.6 → agmem-0.2.1}/tests/test_access_index.py +0 -0
  140. {agmem-0.1.6 → agmem-0.2.1}/tests/test_advanced_commands.py +0 -0
  141. {agmem-0.1.6 → agmem-0.2.1}/tests/test_audit.py +0 -0
  142. {agmem-0.1.6 → agmem-0.2.1}/tests/test_commit_importance.py +0 -0
  143. {agmem-0.1.6 → agmem-0.2.1}/tests/test_consistency.py +0 -0
  144. {agmem-0.1.6 → agmem-0.2.1}/tests/test_crypto_verify.py +0 -0
  145. {agmem-0.1.6 → agmem-0.2.1}/tests/test_decay.py +0 -0
  146. {agmem-0.1.6 → agmem-0.2.1}/tests/test_edge_cases.py +0 -0
  147. {agmem-0.1.6 → agmem-0.2.1}/tests/test_encryption.py +0 -0
  148. {agmem-0.1.6 → agmem-0.2.1}/tests/test_federated.py +0 -0
  149. {agmem-0.1.6 → agmem-0.2.1}/tests/test_ipfs_remote.py +0 -0
  150. {agmem-0.1.6 → agmem-0.2.1}/tests/test_llm_provider.py +0 -0
  151. {agmem-0.1.6 → agmem-0.2.1}/tests/test_objects.py +0 -0
  152. {agmem-0.1.6 → agmem-0.2.1}/tests/test_pii.py +0 -0
  153. {agmem-0.1.6 → agmem-0.2.1}/tests/test_plan_features.py +0 -0
  154. {agmem-0.1.6 → agmem-0.2.1}/tests/test_privacy_budget.py +0 -0
  155. {agmem-0.1.6 → agmem-0.2.1}/tests/test_repository.py +0 -0
  156. {agmem-0.1.6 → agmem-0.2.1}/tests/test_resolve_helpers.py +0 -0
  157. {agmem-0.1.6 → agmem-0.2.1}/tests/test_retrieval.py +0 -0
  158. {agmem-0.1.6 → agmem-0.2.1}/tests/test_temporal_index.py +0 -0
  159. {agmem-0.1.6 → agmem-0.2.1}/tests/test_trust.py +0 -0
  160. {agmem-0.1.6 → agmem-0.2.1}/tests/test_zk_proofs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agmem
3
- Version: 0.1.6
3
+ Version: 0.2.1
4
4
  Summary: Agentic Memory Version Control System - Git for AI agent memories
5
5
  Home-page: https://github.com/vivek-tiwari-vt/agmem
6
6
  Author: agmem Team
@@ -10,7 +10,7 @@ Project-URL: Homepage, https://github.com/vivek-tiwari-vt/agmem
10
10
  Project-URL: Documentation, https://github.com/vivek-tiwari-vt/agmem#readme
11
11
  Project-URL: Repository, https://github.com/vivek-tiwari-vt/agmem
12
12
  Project-URL: Bug Tracker, https://github.com/vivek-tiwari-vt/agmem/issues
13
- Keywords: ai,agent,memory,version-control,git,vcs,llm,merkle,audit,encryption,differential-privacy,trust,multi-agent
13
+ Keywords: ai,agent,memory,version-control,git,vcs,llm,merkle,audit,encryption,differential-privacy,trust,multi-agent,health-monitoring,delta-encoding,ipfs,federated
14
14
  Classifier: Development Status :: 3 - Alpha
15
15
  Classifier: Intended Audience :: Developers
16
16
  Classifier: License :: OSI Approved :: MIT License
@@ -71,6 +71,10 @@ Provides-Extra: ipfs
71
71
  Requires-Dist: requests>=2.28.0; extra == "ipfs"
72
72
  Provides-Extra: ipfs-daemon
73
73
  Requires-Dist: ipfshttpclient>=0.8.0; extra == "ipfs-daemon"
74
+ Provides-Extra: coordinator
75
+ Requires-Dist: fastapi>=0.100.0; extra == "coordinator"
76
+ Requires-Dist: uvicorn[standard]>=0.22.0; extra == "coordinator"
77
+ Requires-Dist: pydantic>=2.0.0; extra == "coordinator"
74
78
  Provides-Extra: all
75
79
  Requires-Dist: mcp>=1.0.0; extra == "all"
76
80
  Requires-Dist: cryptography>=41.0.0; extra == "all"
@@ -88,6 +92,7 @@ Requires-Dist: networkx>=3.0; extra == "all"
88
92
  Requires-Dist: tiktoken>=0.5.0; extra == "all"
89
93
  Requires-Dist: presidio-analyzer>=2.2.0; extra == "all"
90
94
  Requires-Dist: requests>=2.28.0; extra == "all"
95
+ Requires-Dist: pydantic>=2.0.0; extra == "all"
91
96
  Dynamic: author
92
97
  Dynamic: home-page
93
98
  Dynamic: license-file
@@ -132,13 +137,15 @@ agmem solves all of these problems with a familiar Git-like interface.
132
137
  - ✅ **Tamper-evident audit trail** — Append-only hash-chained log (init, add, commit, checkout, merge, push, pull, config); `agmem audit` and `agmem audit --verify`
133
138
  - ✅ **Multi-agent trust** — Trust store (full / conditional / untrusted) per public key; applied on pull/merge; clone copies remote keys
134
139
  - ✅ **Conflict resolution** — `agmem resolve` with ours/theirs/both; conflicts persisted in `.mem/merge/`; path-safe
135
- - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden`; noise applied to counts and frontmatter
140
+ - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden`; noise applies to fact-level data only (metadata fields excluded)
136
141
  - ✅ **Pack files & GC** — `agmem gc [--repack]` (reachable from refs, prune loose, optional pack file + index); ObjectStore reads from pack when loose missing
137
142
  - ✅ **Multi-provider LLM** — OpenAI and Anthropic via `memvcs.core.llm`; config/repo or env; used by gardener, distiller, consistency, merge
138
143
  - ✅ **Temporal querying** — Point-in-time and range queries in temporal index; frontmatter timestamps
139
- - ✅ **Federated collaboration** — `agmem federated push|pull`; real summaries (topic counts, fact hashes); optional DP on outbound; coordinator API in docs/FEDERATED.md
140
- - ✅ **Zero-knowledge proofs** — `agmem prove` (hash/signature-based): keyword containment (Merkle set membership), memory freshness (signed timestamp)
141
- - ✅ **Daemon health** — Periodic Merkle verification in daemon loop; safe auto-remediation hooks
144
+ - ✅ **Federated collaboration** — `agmem federated push|pull`; protocol-compliant summaries (agent_id, timestamp, topic_counts, fact_hashes); optional DP on outbound; coordinator API in docs/FEDERATED.md
145
+ - ✅ **Zero-knowledge proofs** — `agmem prove` (hash/signature-based): keyword containment (Merkle set membership), memory freshness (signed timestamp). **Note:** Current implementation is proof-of-knowledge with known limitations; see docs for migration to true zk-SNARKs.
146
+ - ✅ **Daemon health** — 4-point health monitoring (storage, redundancy, staleness, graph consistency) with periodic checks; visible warnings and JSON reports
147
+ - ✅ **Delta encoding** — 5-10x compression for similar objects using Levenshtein distance and SequenceMatcher; enabled in GC repack with multi-tier similarity filtering
148
+ - ✅ **Performance safeguards** — Multi-tier similarity filter (length ratio + SimHash) avoids O(n²×m²) worst-case comparisons
142
149
  - ✅ **GPU acceleration** — Vector store detects GPU for embedding model when available
143
150
  - ✅ **Optional** — `serve`, `daemon` (watch + auto-commit), `garden` (episode archival), MCP server; install extras as needed
144
151
 
@@ -469,8 +476,8 @@ The following 18 capabilities are implemented (or stubbed) per the agmem feature
469
476
 
470
477
  | # | Feature | Description |
471
478
  |---|---------|-------------|
472
- | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. |
473
- | **8** | **Zero-knowledge proofs** | zk-SNARK-style proofs for keyword containment and memory freshness. **Command:** `agmem prove --memory <path> --property keyword|freshness --value <v> [-o out]` (stub). |
479
+ | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. **Note:** Now correctly applied to actual facts during extraction, not metadata counts. |
480
+ | **8** | **Cryptographic proofs (proof-of-knowledge)** | Hash/signature-based proofs for keyword containment (Merkle set membership) and memory freshness (signed timestamp). **Command:** `agmem prove --memory <path> --property keyword\|freshness --value <v> [-o out]`. **IMPORTANT:** These are proof-of-knowledge, not true zero-knowledge proofs. Keyword proof leaks word count and allows verifier to test other words. Freshness proof relies on forgeable filesystem mtime. See `memvcs/core/zk_proofs.py` for details and migration path to zk-SNARKs. |
474
481
 
475
482
  ### Tier 4 — Storage and distribution
476
483
 
@@ -37,13 +37,15 @@ agmem solves all of these problems with a familiar Git-like interface.
37
37
  - ✅ **Tamper-evident audit trail** — Append-only hash-chained log (init, add, commit, checkout, merge, push, pull, config); `agmem audit` and `agmem audit --verify`
38
38
  - ✅ **Multi-agent trust** — Trust store (full / conditional / untrusted) per public key; applied on pull/merge; clone copies remote keys
39
39
  - ✅ **Conflict resolution** — `agmem resolve` with ours/theirs/both; conflicts persisted in `.mem/merge/`; path-safe
40
- - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden`; noise applied to counts and frontmatter
40
+ - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden`; noise applies to fact-level data only (metadata fields excluded)
41
41
  - ✅ **Pack files & GC** — `agmem gc [--repack]` (reachable from refs, prune loose, optional pack file + index); ObjectStore reads from pack when loose missing
42
42
  - ✅ **Multi-provider LLM** — OpenAI and Anthropic via `memvcs.core.llm`; config/repo or env; used by gardener, distiller, consistency, merge
43
43
  - ✅ **Temporal querying** — Point-in-time and range queries in temporal index; frontmatter timestamps
44
- - ✅ **Federated collaboration** — `agmem federated push|pull`; real summaries (topic counts, fact hashes); optional DP on outbound; coordinator API in docs/FEDERATED.md
45
- - ✅ **Zero-knowledge proofs** — `agmem prove` (hash/signature-based): keyword containment (Merkle set membership), memory freshness (signed timestamp)
46
- - ✅ **Daemon health** — Periodic Merkle verification in daemon loop; safe auto-remediation hooks
44
+ - ✅ **Federated collaboration** — `agmem federated push|pull`; protocol-compliant summaries (agent_id, timestamp, topic_counts, fact_hashes); optional DP on outbound; coordinator API in docs/FEDERATED.md
45
+ - ✅ **Zero-knowledge proofs** — `agmem prove` (hash/signature-based): keyword containment (Merkle set membership), memory freshness (signed timestamp). **Note:** Current implementation is proof-of-knowledge with known limitations; see docs for migration to true zk-SNARKs.
46
+ - ✅ **Daemon health** — 4-point health monitoring (storage, redundancy, staleness, graph consistency) with periodic checks; visible warnings and JSON reports
47
+ - ✅ **Delta encoding** — 5-10x compression for similar objects using Levenshtein distance and SequenceMatcher; enabled in GC repack with multi-tier similarity filtering
48
+ - ✅ **Performance safeguards** — Multi-tier similarity filter (length ratio + SimHash) avoids O(n²×m²) worst-case comparisons
47
49
  - ✅ **GPU acceleration** — Vector store detects GPU for embedding model when available
48
50
  - ✅ **Optional** — `serve`, `daemon` (watch + auto-commit), `garden` (episode archival), MCP server; install extras as needed
49
51
 
@@ -374,8 +376,8 @@ The following 18 capabilities are implemented (or stubbed) per the agmem feature
374
376
 
375
377
  | # | Feature | Description |
376
378
  |---|---------|-------------|
377
- | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. |
378
- | **8** | **Zero-knowledge proofs** | zk-SNARK-style proofs for keyword containment and memory freshness. **Command:** `agmem prove --memory <path> --property keyword|freshness --value <v> [-o out]` (stub). |
379
+ | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. **Note:** Now correctly applied to actual facts during extraction, not metadata counts. |
380
+ | **8** | **Cryptographic proofs (proof-of-knowledge)** | Hash/signature-based proofs for keyword containment (Merkle set membership) and memory freshness (signed timestamp). **Command:** `agmem prove --memory <path> --property keyword\|freshness --value <v> [-o out]`. **IMPORTANT:** These are proof-of-knowledge, not true zero-knowledge proofs. Keyword proof leaks word count and allows verifier to test other words. Freshness proof relies on forgeable filesystem mtime. See `memvcs/core/zk_proofs.py` for details and migration path to zk-SNARKs. |
379
381
 
380
382
  ### Tier 4 — Storage and distribution
381
383
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agmem
3
- Version: 0.1.6
3
+ Version: 0.2.1
4
4
  Summary: Agentic Memory Version Control System - Git for AI agent memories
5
5
  Home-page: https://github.com/vivek-tiwari-vt/agmem
6
6
  Author: agmem Team
@@ -10,7 +10,7 @@ Project-URL: Homepage, https://github.com/vivek-tiwari-vt/agmem
10
10
  Project-URL: Documentation, https://github.com/vivek-tiwari-vt/agmem#readme
11
11
  Project-URL: Repository, https://github.com/vivek-tiwari-vt/agmem
12
12
  Project-URL: Bug Tracker, https://github.com/vivek-tiwari-vt/agmem/issues
13
- Keywords: ai,agent,memory,version-control,git,vcs,llm,merkle,audit,encryption,differential-privacy,trust,multi-agent
13
+ Keywords: ai,agent,memory,version-control,git,vcs,llm,merkle,audit,encryption,differential-privacy,trust,multi-agent,health-monitoring,delta-encoding,ipfs,federated
14
14
  Classifier: Development Status :: 3 - Alpha
15
15
  Classifier: Intended Audience :: Developers
16
16
  Classifier: License :: OSI Approved :: MIT License
@@ -71,6 +71,10 @@ Provides-Extra: ipfs
71
71
  Requires-Dist: requests>=2.28.0; extra == "ipfs"
72
72
  Provides-Extra: ipfs-daemon
73
73
  Requires-Dist: ipfshttpclient>=0.8.0; extra == "ipfs-daemon"
74
+ Provides-Extra: coordinator
75
+ Requires-Dist: fastapi>=0.100.0; extra == "coordinator"
76
+ Requires-Dist: uvicorn[standard]>=0.22.0; extra == "coordinator"
77
+ Requires-Dist: pydantic>=2.0.0; extra == "coordinator"
74
78
  Provides-Extra: all
75
79
  Requires-Dist: mcp>=1.0.0; extra == "all"
76
80
  Requires-Dist: cryptography>=41.0.0; extra == "all"
@@ -88,6 +92,7 @@ Requires-Dist: networkx>=3.0; extra == "all"
88
92
  Requires-Dist: tiktoken>=0.5.0; extra == "all"
89
93
  Requires-Dist: presidio-analyzer>=2.2.0; extra == "all"
90
94
  Requires-Dist: requests>=2.28.0; extra == "all"
95
+ Requires-Dist: pydantic>=2.0.0; extra == "all"
91
96
  Dynamic: author
92
97
  Dynamic: home-page
93
98
  Dynamic: license-file
@@ -132,13 +137,15 @@ agmem solves all of these problems with a familiar Git-like interface.
132
137
  - ✅ **Tamper-evident audit trail** — Append-only hash-chained log (init, add, commit, checkout, merge, push, pull, config); `agmem audit` and `agmem audit --verify`
133
138
  - ✅ **Multi-agent trust** — Trust store (full / conditional / untrusted) per public key; applied on pull/merge; clone copies remote keys
134
139
  - ✅ **Conflict resolution** — `agmem resolve` with ours/theirs/both; conflicts persisted in `.mem/merge/`; path-safe
135
- - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden`; noise applied to counts and frontmatter
140
+ - ✅ **Differential privacy** — Epsilon/delta budget in `.mem/privacy_budget.json`; `--private` on `agmem distill` and `agmem garden`; noise applies to fact-level data only (metadata fields excluded)
136
141
  - ✅ **Pack files & GC** — `agmem gc [--repack]` (reachable from refs, prune loose, optional pack file + index); ObjectStore reads from pack when loose missing
137
142
  - ✅ **Multi-provider LLM** — OpenAI and Anthropic via `memvcs.core.llm`; config/repo or env; used by gardener, distiller, consistency, merge
138
143
  - ✅ **Temporal querying** — Point-in-time and range queries in temporal index; frontmatter timestamps
139
- - ✅ **Federated collaboration** — `agmem federated push|pull`; real summaries (topic counts, fact hashes); optional DP on outbound; coordinator API in docs/FEDERATED.md
140
- - ✅ **Zero-knowledge proofs** — `agmem prove` (hash/signature-based): keyword containment (Merkle set membership), memory freshness (signed timestamp)
141
- - ✅ **Daemon health** — Periodic Merkle verification in daemon loop; safe auto-remediation hooks
144
+ - ✅ **Federated collaboration** — `agmem federated push|pull`; protocol-compliant summaries (agent_id, timestamp, topic_counts, fact_hashes); optional DP on outbound; coordinator API in docs/FEDERATED.md
145
+ - ✅ **Zero-knowledge proofs** — `agmem prove` (hash/signature-based): keyword containment (Merkle set membership), memory freshness (signed timestamp). **Note:** Current implementation is proof-of-knowledge with known limitations; see docs for migration to true zk-SNARKs.
146
+ - ✅ **Daemon health** — 4-point health monitoring (storage, redundancy, staleness, graph consistency) with periodic checks; visible warnings and JSON reports
147
+ - ✅ **Delta encoding** — 5-10x compression for similar objects using Levenshtein distance and SequenceMatcher; enabled in GC repack with multi-tier similarity filtering
148
+ - ✅ **Performance safeguards** — Multi-tier similarity filter (length ratio + SimHash) avoids O(n²×m²) worst-case comparisons
142
149
  - ✅ **GPU acceleration** — Vector store detects GPU for embedding model when available
143
150
  - ✅ **Optional** — `serve`, `daemon` (watch + auto-commit), `garden` (episode archival), MCP server; install extras as needed
144
151
 
@@ -469,8 +476,8 @@ The following 18 capabilities are implemented (or stubbed) per the agmem feature
469
476
 
470
477
  | # | Feature | Description |
471
478
  |---|---------|-------------|
472
- | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. |
473
- | **8** | **Zero-knowledge proofs** | zk-SNARK-style proofs for keyword containment and memory freshness. **Command:** `agmem prove --memory <path> --property keyword|freshness --value <v> [-o out]` (stub). |
479
+ | **7** | **Differential privacy** | Epsilon/delta budget per repo in `.mem/privacy_budget.json`. **Usage:** `agmem distill --private`, `agmem garden --private`; blocks when budget exceeded. Config: `differential_privacy.max_epsilon`, `delta`. **Note:** Now correctly applied to actual facts during extraction, not metadata counts. |
480
+ | **8** | **Cryptographic proofs (proof-of-knowledge)** | Hash/signature-based proofs for keyword containment (Merkle set membership) and memory freshness (signed timestamp). **Command:** `agmem prove --memory <path> --property keyword\|freshness --value <v> [-o out]`. **IMPORTANT:** These are proof-of-knowledge, not true zero-knowledge proofs. Keyword proof leaks word count and allows verifier to test other words. Freshness proof relies on forgeable filesystem mtime. See `memvcs/core/zk_proofs.py` for details and migration path to zk-SNARKs. |
474
481
 
475
482
  ### Tier 4 — Storage and distribution
476
483
 
@@ -65,18 +65,23 @@ memvcs/commands/timeline.py
65
65
  memvcs/commands/tree.py
66
66
  memvcs/commands/verify.py
67
67
  memvcs/commands/when.py
68
+ memvcs/coordinator/__init__.py
69
+ memvcs/coordinator/server.py
68
70
  memvcs/core/__init__.py
69
71
  memvcs/core/access_index.py
70
72
  memvcs/core/audit.py
73
+ memvcs/core/compression_metrics.py
71
74
  memvcs/core/compression_pipeline.py
72
75
  memvcs/core/config_loader.py
73
76
  memvcs/core/consistency.py
74
77
  memvcs/core/constants.py
75
78
  memvcs/core/crypto_verify.py
76
79
  memvcs/core/decay.py
80
+ memvcs/core/delta.py
77
81
  memvcs/core/diff.py
78
82
  memvcs/core/distiller.py
79
83
  memvcs/core/encryption.py
84
+ memvcs/core/fast_similarity.py
80
85
  memvcs/core/federated.py
81
86
  memvcs/core/gardener.py
82
87
  memvcs/core/hooks.py
@@ -87,6 +92,8 @@ memvcs/core/objects.py
87
92
  memvcs/core/pack.py
88
93
  memvcs/core/pii_scanner.py
89
94
  memvcs/core/privacy_budget.py
95
+ memvcs/core/privacy_validator.py
96
+ memvcs/core/protocol_builder.py
90
97
  memvcs/core/refs.py
91
98
  memvcs/core/remote.py
92
99
  memvcs/core/repository.py
@@ -107,6 +114,8 @@ memvcs/core/storage/base.py
107
114
  memvcs/core/storage/gcs.py
108
115
  memvcs/core/storage/local.py
109
116
  memvcs/core/storage/s3.py
117
+ memvcs/health/__init__.py
118
+ memvcs/health/monitor.py
110
119
  memvcs/integrations/__init__.py
111
120
  memvcs/integrations/mcp_server.py
112
121
  memvcs/integrations/web_ui/__init__.py
@@ -122,16 +131,22 @@ tests/test_access_index.py
122
131
  tests/test_advanced_commands.py
123
132
  tests/test_audit.py
124
133
  tests/test_commit_importance.py
134
+ tests/test_compression_pipeline.py
125
135
  tests/test_consistency.py
126
136
  tests/test_crypto_verify.py
127
137
  tests/test_decay.py
138
+ tests/test_delta_encoding.py
139
+ tests/test_distiller_dp.py
128
140
  tests/test_edge_cases.py
129
141
  tests/test_encryption.py
130
142
  tests/test_federated.py
143
+ tests/test_health_monitor.py
144
+ tests/test_ipfs_integration.py
131
145
  tests/test_ipfs_remote.py
132
146
  tests/test_llm_provider.py
133
147
  tests/test_objects.py
134
148
  tests/test_pack_gc.py
149
+ tests/test_performance_benchmarks.py
135
150
  tests/test_pii.py
136
151
  tests/test_plan_features.py
137
152
  tests/test_privacy_budget.py
@@ -17,6 +17,7 @@ networkx>=3.0
17
17
  tiktoken>=0.5.0
18
18
  presidio-analyzer>=2.2.0
19
19
  requests>=2.28.0
20
+ pydantic>=2.0.0
20
21
 
21
22
  [anthropic]
22
23
  anthropic>=0.18.0
@@ -25,6 +26,11 @@ anthropic>=0.18.0
25
26
  boto3>=1.34.0
26
27
  google-cloud-storage>=2.0.0
27
28
 
29
+ [coordinator]
30
+ fastapi>=0.100.0
31
+ uvicorn[standard]>=0.22.0
32
+ pydantic>=2.0.0
33
+
28
34
  [crypto]
29
35
  cryptography>=41.0.0
30
36
 
@@ -23,7 +23,7 @@ In `.mem/config.json` or user config:
23
23
 
24
24
  - `coordinator_url`: Base URL of the coordinator (no trailing slash).
25
25
  - `memory_types`: Which memory dirs to include in the summary.
26
- - `differential_privacy.enabled`: If true, numeric fields in the summary are noised before push.
26
+ - `differential_privacy.enabled`: If true, fact-level numeric fields are noised before push (metadata is exempt).
27
27
 
28
28
  ## Coordinator API
29
29
 
@@ -33,15 +33,22 @@ The coordinator must expose two endpoints.
33
33
 
34
34
  **Request**
35
35
 
36
- - Body: JSON object (local summary from `produce_local_summary`).
36
+ - Body: JSON object (protocol-compliant summary envelope).
37
37
  - `Content-Type: application/json`.
38
38
 
39
39
  **Summary shape**
40
40
 
41
+ Top-level envelope:
42
+
43
+ - `summary`: object containing the fields below.
44
+
45
+ Summary fields:
46
+
47
+ - `agent_id`: deterministic client identifier (SHA-256).
48
+ - `timestamp`: ISO-8601 UTC timestamp.
41
49
  - `memory_types`: list of strings (e.g. `["episodic", "semantic"]`).
42
- - `topics`: dict of memory type → integer count (file count per type; may be noised if DP enabled).
43
- - `topic_hashes`: dict of memory type → list of topic labels (no raw content).
44
- - `fact_count`: integer (total fact/file count; may be noised if DP enabled).
50
+ - `topic_counts`: dict of memory type → integer count (may be noised if DP enabled).
51
+ - `fact_hashes`: list of strings (hashes; no raw content).
45
52
 
46
53
  **Response**
47
54
 
@@ -1,6 +1,8 @@
1
1
  # agmem Test Report — What Works and What Doesn’t
2
2
 
3
- This report is based on full-flow tests (`scripts/test_full_flow.py`), manual command runs, security fixes, and the knowledge graph feature.
3
+ This report is based on full-flow tests (`scripts/test_full_flow.py`), automated pytest runs, manual command runs, security fixes, and the knowledge graph feature.
4
+
5
+ **Latest automated run (2026-02-01):** 246 passed, 5 skipped in ~45s.
4
6
 
5
7
  ---
6
8
 
@@ -82,11 +84,13 @@ This report is based on full-flow tests (`scripts/test_full_flow.py`), manual co
82
84
  |------|--------|------|
83
85
  | **Crypto** | ✅ Tests | Merkle build/verify, tampered blob fails verification, signature present but no public key. |
84
86
  | **Encryption** | ✅ Tests | Round-trip, wrong key fails, corrupted ciphertext fails. |
85
- | **Privacy budget** | ✅ Tests | load_budget, spend_epsilon, add_noise, Gardener/Distiller DP integration (mocked). |
87
+ | **Privacy budget** | ✅ Tests | load_budget, spend_epsilon, add_noise, Gardener/Distiller DP integration (mocked), DP sampling (no fixed seed), metadata fields exempted from noise. |
86
88
  | **Pack/GC** | ✅ Tests | list_loose_objects, run_gc, write_pack, retrieve_from_pack, ObjectStore read from pack, run_repack dry-run. |
87
89
  | **ZK proofs** | ✅ Tests | prove_keyword_containment / verify_proof round-trip; keyword not in file returns False; freshness (skipped without signing key). |
88
- | **Federated** | ✅ Tests | produce_local_summary (topic_hashes, fact_count), DP noising; push/pull with mock coordinator. |
90
+ | **Federated** | ✅ Tests | protocol-compliant summary (agent_id, timestamp, topic_counts, fact_hashes), DP noising; push/pull with mock coordinator. |
89
91
  | **IPFS** | ✅ Tests | parse_ipfs_url, bundle/unbundle round-trip; push/pull with mock gateway. |
92
+ | **Protocol & privacy** | ✅ Tests | schema validation, privacy audit (metadata noise rejection), strict mode enforcement. |
93
+ | **Performance** | ✅ Tests | Levenshtein, SimHash, multi-tier similarity filtering regression checks. |
90
94
 
91
95
  ### Security (vulnerability check)
92
96
 
@@ -4,6 +4,6 @@ agmem - Agentic Memory Version Control System
4
4
  A Git-inspired version control system for AI agent memory artifacts.
5
5
  """
6
6
 
7
- __version__ = "0.1.6"
7
+ __version__ = "0.2.1"
8
8
  __author__ = "agmem Team"
9
9
  __license__ = "MIT"
@@ -141,7 +141,7 @@ For more information: https://github.com/vivek-tiwari-vt/agmem
141
141
  """,
142
142
  )
143
143
 
144
- parser.add_argument("--version", "-v", action="version", version="%(prog)s 0.1.0")
144
+ parser.add_argument("--version", "-v", action="version", version="%(prog)s 0.2.1")
145
145
 
146
146
  parser.add_argument("--verbose", action="store_true", help="Enable verbose output")
147
147
 
@@ -227,11 +227,12 @@ class DaemonCommand:
227
227
  while running:
228
228
  time.sleep(1)
229
229
 
230
- # Periodic health check (Merkle/signature, optional). Alert only; no destructive action.
230
+ # Periodic health check (Merkle/signature + operational metrics). Alert only; no destructive action.
231
231
  if (
232
232
  health_check_interval
233
233
  and (time.time() - last_health_check) >= health_check_interval
234
234
  ):
235
+ # Cryptographic integrity check
235
236
  try:
236
237
  from ..core.crypto_verify import verify_commit, load_public_key
237
238
 
@@ -251,6 +252,41 @@ class DaemonCommand:
251
252
  sys.stderr.write("Run 'agmem fsck' for safe integrity check.\n")
252
253
  except Exception:
253
254
  pass
255
+
256
+ # Operational health checks (storage, redundancy, stale memory, graph consistency)
257
+ try:
258
+ from ..health.monitor import HealthMonitor
259
+
260
+ health_monitor = HealthMonitor(repo.root)
261
+ report = health_monitor.perform_all_checks()
262
+
263
+ if report.get("warnings"):
264
+ for warning in report["warnings"]:
265
+ sys.stderr.write(f"Health warning: {warning}\n")
266
+
267
+ # Log summary metrics
268
+ if report.get("storage"):
269
+ storage = report["storage"]
270
+ if "total_size_mb" in storage:
271
+ sys.stderr.write(
272
+ f"Storage: {storage['total_size_mb']:.1f}MB "
273
+ f"({storage['packed_objects']} packed objects)\n"
274
+ )
275
+ if report.get("redundancy"):
276
+ red = report["redundancy"]
277
+ if "redundancy_percentage" in red:
278
+ sys.stderr.write(
279
+ f"Redundancy: {red['redundancy_percentage']:.1f}%\n"
280
+ )
281
+ if report.get("stale_memory"):
282
+ stale = report["stale_memory"]
283
+ if "stale_percentage" in stale:
284
+ sys.stderr.write(
285
+ f"Stale memory: {stale['stale_percentage']:.1f}%\n"
286
+ )
287
+ except Exception:
288
+ pass
289
+
254
290
  last_health_check = time.time()
255
291
 
256
292
  if handler.pending:
@@ -46,6 +46,11 @@ class DistillCommand:
46
46
  action="store_true",
47
47
  help="Use differential privacy (spend epsilon from budget)",
48
48
  )
49
+ parser.add_argument(
50
+ "--no-compress",
51
+ action="store_true",
52
+ help="Disable compression pipeline preprocessing",
53
+ )
49
54
 
50
55
  @staticmethod
51
56
  def execute(args) -> int:
@@ -73,6 +78,7 @@ class DistillCommand:
73
78
  source_dir=args.source,
74
79
  target_dir=args.target,
75
80
  create_safety_branch=not args.no_branch,
81
+ use_compression_pipeline=not getattr(args, "no_compress", False),
76
82
  use_dp=use_dp,
77
83
  dp_epsilon=dp_epsilon,
78
84
  dp_delta=dp_delta,
@@ -0,0 +1,5 @@
1
+ """Coordinator package for federated collaboration."""
2
+
3
+ from .server import app, FASTAPI_AVAILABLE
4
+
5
+ __all__ = ["app", "FASTAPI_AVAILABLE"]