cryptomem 2026.6.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 (61) hide show
  1. cryptomem-2026.6.1/.gitignore +44 -0
  2. cryptomem-2026.6.1/PKG-INFO +86 -0
  3. cryptomem-2026.6.1/README.md +51 -0
  4. cryptomem-2026.6.1/cryptomem/__init__.py +51 -0
  5. cryptomem-2026.6.1/cryptomem/adapters/__init__.py +5 -0
  6. cryptomem-2026.6.1/cryptomem/adapters/base.py +11 -0
  7. cryptomem-2026.6.1/cryptomem/adapters/mock_adapter.py +14 -0
  8. cryptomem-2026.6.1/cryptomem/adapters/ollama_adapter.py +41 -0
  9. cryptomem-2026.6.1/cryptomem/cli.py +38 -0
  10. cryptomem-2026.6.1/cryptomem/client.py +361 -0
  11. cryptomem-2026.6.1/cryptomem/config.py +37 -0
  12. cryptomem-2026.6.1/cryptomem/crypto/__init__.py +5 -0
  13. cryptomem-2026.6.1/cryptomem/crypto/hashing.py +25 -0
  14. cryptomem-2026.6.1/cryptomem/crypto/keys.py +63 -0
  15. cryptomem-2026.6.1/cryptomem/crypto/merkle.py +59 -0
  16. cryptomem-2026.6.1/cryptomem/crypto/signer.py +52 -0
  17. cryptomem-2026.6.1/cryptomem/efficiency/__init__.py +12 -0
  18. cryptomem-2026.6.1/cryptomem/efficiency/budgeter.py +40 -0
  19. cryptomem-2026.6.1/cryptomem/efficiency/cache.py +32 -0
  20. cryptomem-2026.6.1/cryptomem/efficiency/compressor.py +38 -0
  21. cryptomem-2026.6.1/cryptomem/efficiency/deduper.py +25 -0
  22. cryptomem-2026.6.1/cryptomem/embeddings/__init__.py +5 -0
  23. cryptomem-2026.6.1/cryptomem/embeddings/base.py +26 -0
  24. cryptomem-2026.6.1/cryptomem/embeddings/minilm.py +36 -0
  25. cryptomem-2026.6.1/cryptomem/embeddings/stub.py +31 -0
  26. cryptomem-2026.6.1/cryptomem/models.py +49 -0
  27. cryptomem-2026.6.1/cryptomem/proactive/__init__.py +6 -0
  28. cryptomem-2026.6.1/cryptomem/proactive/extractor.py +27 -0
  29. cryptomem-2026.6.1/cryptomem/proactive/planner.py +45 -0
  30. cryptomem-2026.6.1/cryptomem/proactive/triggers.py +59 -0
  31. cryptomem-2026.6.1/cryptomem/proactive/writeback.py +35 -0
  32. cryptomem-2026.6.1/cryptomem/py.typed +0 -0
  33. cryptomem-2026.6.1/cryptomem/retrieval/__init__.py +3 -0
  34. cryptomem-2026.6.1/cryptomem/retrieval/retriever.py +80 -0
  35. cryptomem-2026.6.1/cryptomem/server/__init__.py +3 -0
  36. cryptomem-2026.6.1/cryptomem/server/app.py +186 -0
  37. cryptomem-2026.6.1/cryptomem/store/__init__.py +6 -0
  38. cryptomem-2026.6.1/cryptomem/store/base.py +29 -0
  39. cryptomem-2026.6.1/cryptomem/store/neo4j_store.py +156 -0
  40. cryptomem-2026.6.1/cryptomem/store/remote_store.py +74 -0
  41. cryptomem-2026.6.1/cryptomem/store/sqlite_store.py +119 -0
  42. cryptomem-2026.6.1/cryptomem/verification/__init__.py +15 -0
  43. cryptomem-2026.6.1/cryptomem/verification/citations.py +51 -0
  44. cryptomem-2026.6.1/cryptomem/verification/cove.py +51 -0
  45. cryptomem-2026.6.1/cryptomem/verification/entropy.py +65 -0
  46. cryptomem-2026.6.1/cryptomem/verification/faithfulness.py +47 -0
  47. cryptomem-2026.6.1/cryptomem/verification/grounding.py +26 -0
  48. cryptomem-2026.6.1/pyproject.toml +61 -0
  49. cryptomem-2026.6.1/tests/__init__.py +0 -0
  50. cryptomem-2026.6.1/tests/conftest.py +13 -0
  51. cryptomem-2026.6.1/tests/test_adapters.py +31 -0
  52. cryptomem-2026.6.1/tests/test_crypto.py +51 -0
  53. cryptomem-2026.6.1/tests/test_efficiency.py +60 -0
  54. cryptomem-2026.6.1/tests/test_enterprise.py +92 -0
  55. cryptomem-2026.6.1/tests/test_integration.py +55 -0
  56. cryptomem-2026.6.1/tests/test_neo4j_store.py +165 -0
  57. cryptomem-2026.6.1/tests/test_proactive.py +60 -0
  58. cryptomem-2026.6.1/tests/test_retrieval.py +34 -0
  59. cryptomem-2026.6.1/tests/test_server.py +137 -0
  60. cryptomem-2026.6.1/tests/test_store.py +68 -0
  61. cryptomem-2026.6.1/tests/test_verification.py +71 -0
@@ -0,0 +1,44 @@
1
+ # ---- Python ----
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .venv/
9
+ venv/
10
+ env/
11
+ .mypy_cache/
12
+ .ruff_cache/
13
+ .pytest_cache/
14
+ .hypothesis/
15
+ .coverage
16
+ htmlcov/
17
+ *.so
18
+
19
+ # ---- Rust ----
20
+ /rust/target/
21
+ target/
22
+ **/*.rs.bk
23
+ Cargo.lock # library crate: keep unlocked (binaries may commit it)
24
+
25
+ # ---- cryptomem local data / models ----
26
+ *.sqlite
27
+ *.sqlite3
28
+ *.db
29
+ models/
30
+ .cache/
31
+ *.onnx
32
+ # Never commit private keys
33
+ *.key
34
+ *.pem
35
+ secrets/
36
+ .env
37
+ .env.*
38
+
39
+ # ---- Editors / OS ----
40
+ .idea/
41
+ .vscode/
42
+ *.swp
43
+ .DS_Store
44
+ Thumbs.db
@@ -0,0 +1,86 @@
1
+ Metadata-Version: 2.4
2
+ Name: cryptomem
3
+ Version: 2026.6.1
4
+ Summary: Cryptographically verified, relational, persistent memory for AI agents.
5
+ Author: cryptomem contributors
6
+ License: MIT OR Apache-2.0
7
+ Keywords: agents,ai,cryptography,graphrag,memory,ollama
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Topic :: Security :: Cryptography
14
+ Requires-Python: >=3.10
15
+ Requires-Dist: httpx>=0.27
16
+ Requires-Dist: pydantic-settings>=2.2
17
+ Requires-Dist: pydantic>=2.6
18
+ Requires-Dist: pynacl>=1.5
19
+ Provides-Extra: dev
20
+ Requires-Dist: build>=1.2; extra == 'dev'
21
+ Requires-Dist: mypy>=1.10; extra == 'dev'
22
+ Requires-Dist: pytest>=8; extra == 'dev'
23
+ Requires-Dist: respx>=0.21; extra == 'dev'
24
+ Requires-Dist: ruff>=0.6; extra == 'dev'
25
+ Provides-Extra: local
26
+ Requires-Dist: onnxruntime>=1.17; extra == 'local'
27
+ Requires-Dist: sentence-transformers>=3.0; extra == 'local'
28
+ Provides-Extra: neo4j
29
+ Requires-Dist: neo4j>=5.14; extra == 'neo4j'
30
+ Provides-Extra: serve
31
+ Requires-Dist: fastapi>=0.110; extra == 'serve'
32
+ Requires-Dist: tiktoken>=0.7; extra == 'serve'
33
+ Requires-Dist: uvicorn>=0.29; extra == 'serve'
34
+ Description-Content-Type: text/markdown
35
+
36
+ # cryptomem
37
+
38
+ Cryptographically verified, relational, persistent memory for AI agents.
39
+
40
+ This package is the Python engine. Every fact is SHA-256 hashed and Ed25519
41
+ signed at write time; at read time each node is re-verified, and tampered or
42
+ unsigned facts are dropped so the agent abstains rather than guessing.
43
+
44
+ ```python
45
+ from cryptomem import MemoryClient
46
+
47
+ mem = MemoryClient()
48
+ mem.archive("Project Phoenix", "Budget approved at $4.2M for FY26.")
49
+
50
+ for hit in mem.query("What budget did Project Phoenix get?"):
51
+ print(hit.node.content, hit.confidence)
52
+
53
+ print(mem.answer("What budget did Project Phoenix get?"))
54
+ ```
55
+
56
+ Runs on CPU-only hardware with zero model downloads via the default stub
57
+ embedder and in-memory SQLite store. See the repository `docs/` for the full
58
+ architecture and roadmap.
59
+
60
+ ## Beyond retrieval
61
+
62
+ - `mem.respond(...)` — answer plus a provenance block (injected node ids,
63
+ verification status, Merkle root).
64
+ - `mem.proof(node_id)` — a verifiable Merkle **inclusion proof** against the
65
+ current ledger root.
66
+ - `mem.confidence(...)` — semantic-entropy confidence over sampled answers.
67
+ - `mem.verify_answer(draft)` — Chain-of-Verification re-check of a draft.
68
+ - `mem.contradictions()` — same-entity nodes whose content diverges.
69
+ - `mem.suggest(...)`, `mem.triggers()`, `mem.stage_facts(...)`,
70
+ `mem.pending()`, `mem.confirm(node_id)` — proactive planner, triggers, and
71
+ write-back of staged (pending) facts that you later confirm.
72
+
73
+ ## Store backends
74
+
75
+ Selected via `CRYPTOMEM_MODE` (or `Settings(mode=...)`):
76
+
77
+ - **`sqlite`** (default) — zero-config local store; Python-side vector search.
78
+ - **`neo4j`** — graph-native store over the Bolt driver
79
+ (`pip install "cryptomem[neo4j]"`, `CRYPTOMEM_NEO4J_URI=...`).
80
+ - **`remote`** — signs locally and POSTs verbatim to a `/cmem/v1/*` backend
81
+ (`CRYPTOMEM_BACKEND_URL=...`); falls back to SQLite if the backend is down.
82
+
83
+ ## Optional extras
84
+
85
+ `pip install "cryptomem[local]"` (MiniLM embeddings), `[serve]` (FastAPI
86
+ Ollama-compatible sidecar + CLI), `[neo4j]` (graph store), `[dev]` (tooling).
@@ -0,0 +1,51 @@
1
+ # cryptomem
2
+
3
+ Cryptographically verified, relational, persistent memory for AI agents.
4
+
5
+ This package is the Python engine. Every fact is SHA-256 hashed and Ed25519
6
+ signed at write time; at read time each node is re-verified, and tampered or
7
+ unsigned facts are dropped so the agent abstains rather than guessing.
8
+
9
+ ```python
10
+ from cryptomem import MemoryClient
11
+
12
+ mem = MemoryClient()
13
+ mem.archive("Project Phoenix", "Budget approved at $4.2M for FY26.")
14
+
15
+ for hit in mem.query("What budget did Project Phoenix get?"):
16
+ print(hit.node.content, hit.confidence)
17
+
18
+ print(mem.answer("What budget did Project Phoenix get?"))
19
+ ```
20
+
21
+ Runs on CPU-only hardware with zero model downloads via the default stub
22
+ embedder and in-memory SQLite store. See the repository `docs/` for the full
23
+ architecture and roadmap.
24
+
25
+ ## Beyond retrieval
26
+
27
+ - `mem.respond(...)` — answer plus a provenance block (injected node ids,
28
+ verification status, Merkle root).
29
+ - `mem.proof(node_id)` — a verifiable Merkle **inclusion proof** against the
30
+ current ledger root.
31
+ - `mem.confidence(...)` — semantic-entropy confidence over sampled answers.
32
+ - `mem.verify_answer(draft)` — Chain-of-Verification re-check of a draft.
33
+ - `mem.contradictions()` — same-entity nodes whose content diverges.
34
+ - `mem.suggest(...)`, `mem.triggers()`, `mem.stage_facts(...)`,
35
+ `mem.pending()`, `mem.confirm(node_id)` — proactive planner, triggers, and
36
+ write-back of staged (pending) facts that you later confirm.
37
+
38
+ ## Store backends
39
+
40
+ Selected via `CRYPTOMEM_MODE` (or `Settings(mode=...)`):
41
+
42
+ - **`sqlite`** (default) — zero-config local store; Python-side vector search.
43
+ - **`neo4j`** — graph-native store over the Bolt driver
44
+ (`pip install "cryptomem[neo4j]"`, `CRYPTOMEM_NEO4J_URI=...`).
45
+ - **`remote`** — signs locally and POSTs verbatim to a `/cmem/v1/*` backend
46
+ (`CRYPTOMEM_BACKEND_URL=...`); falls back to SQLite if the backend is down.
47
+
48
+ ## Optional extras
49
+
50
+ `pip install "cryptomem[local]"` (MiniLM embeddings), `[serve]` (FastAPI
51
+ Ollama-compatible sidecar + CLI), `[neo4j]` (graph store), `[dev]` (tooling).
@@ -0,0 +1,51 @@
1
+ from cryptomem.adapters.mock_adapter import MockAdapter
2
+ from cryptomem.adapters.ollama_adapter import OllamaAdapter
3
+ from cryptomem.client import ABSTAIN, MemoryClient
4
+ from cryptomem.config import Settings
5
+ from cryptomem.embeddings.minilm import MiniLMEmbedder
6
+ from cryptomem.embeddings.stub import StubEmbedder
7
+ from cryptomem.models import (
8
+ Contradiction,
9
+ CryptoEnvelope,
10
+ MemoryNode,
11
+ Relationship,
12
+ ScoredNode,
13
+ )
14
+ from cryptomem.proactive import Planner, TriggerEngine, WriteBack
15
+ from cryptomem.store.remote_store import RemoteStore
16
+ from cryptomem.store.sqlite_store import SqliteStore
17
+ from cryptomem.verification import (
18
+ ChainOfVerification,
19
+ Citer,
20
+ FaithfulnessChecker,
21
+ GroundingGate,
22
+ SemanticEntropy,
23
+ )
24
+
25
+ __version__ = "2026.06.1"
26
+
27
+ __all__ = [
28
+ "ABSTAIN",
29
+ "MemoryClient",
30
+ "Settings",
31
+ "MemoryNode",
32
+ "Relationship",
33
+ "CryptoEnvelope",
34
+ "ScoredNode",
35
+ "Contradiction",
36
+ "StubEmbedder",
37
+ "MiniLMEmbedder",
38
+ "MockAdapter",
39
+ "OllamaAdapter",
40
+ "GroundingGate",
41
+ "FaithfulnessChecker",
42
+ "Citer",
43
+ "SemanticEntropy",
44
+ "ChainOfVerification",
45
+ "Planner",
46
+ "TriggerEngine",
47
+ "WriteBack",
48
+ "SqliteStore",
49
+ "RemoteStore",
50
+ "__version__",
51
+ ]
@@ -0,0 +1,5 @@
1
+ from cryptomem.adapters.base import LLMAdapter
2
+ from cryptomem.adapters.mock_adapter import MockAdapter
3
+ from cryptomem.adapters.ollama_adapter import OllamaAdapter
4
+
5
+ __all__ = ["LLMAdapter", "MockAdapter", "OllamaAdapter"]
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+
5
+
6
+ class LLMAdapter(ABC):
7
+ """Uniform completion interface across model backends."""
8
+
9
+ @abstractmethod
10
+ def complete(self, prompt: str) -> str:
11
+ """Return the model completion for ``prompt``."""
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from cryptomem.adapters.base import LLMAdapter
4
+
5
+
6
+ class MockAdapter(LLMAdapter):
7
+ """Model-free adapter for deterministic, offline development and tests.
8
+
9
+ Echoes the verified context it was handed so grounding and abstention can
10
+ be asserted without downloading or running any model.
11
+ """
12
+
13
+ def complete(self, prompt: str) -> str:
14
+ return f"[mock] grounded answer based on:\n{prompt.strip()}"
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ import httpx
4
+
5
+ from cryptomem.adapters.base import LLMAdapter
6
+
7
+
8
+ class OllamaAdapter(LLMAdapter):
9
+ """Completion adapter that forwards prompts to a local Ollama server.
10
+
11
+ Speaks Ollama's native ``/api/generate`` wire protocol with streaming
12
+ disabled, so it works against any stock Ollama install with zero config.
13
+ """
14
+
15
+ def __init__(
16
+ self,
17
+ base_url: str = "http://localhost:11434",
18
+ model: str = "qwen2.5:0.5b",
19
+ timeout: float = 60.0,
20
+ ):
21
+ self.base_url = base_url.rstrip("/")
22
+ self.model = model
23
+ self._client = httpx.Client(base_url=self.base_url, timeout=timeout)
24
+
25
+ def complete(self, prompt: str) -> str:
26
+ resp = self._client.post(
27
+ "/api/generate",
28
+ json={"model": self.model, "prompt": prompt, "stream": False},
29
+ )
30
+ resp.raise_for_status()
31
+ return str(resp.json().get("response", ""))
32
+
33
+ def is_alive(self) -> bool:
34
+ """Return ``True`` if the Ollama server answers ``GET /api/tags``."""
35
+ try:
36
+ return self._client.get("/api/tags").status_code == 200
37
+ except httpx.HTTPError:
38
+ return False
39
+
40
+ def close(self) -> None:
41
+ self._client.close()
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+
5
+ from cryptomem import __version__
6
+
7
+
8
+ def main(argv: list[str] | None = None) -> int:
9
+ """Entry point for the ``cryptomem`` command."""
10
+ parser = argparse.ArgumentParser(prog="cryptomem", description="cryptomem CLI")
11
+ parser.add_argument("--version", action="version", version=f"cryptomem {__version__}")
12
+ sub = parser.add_subparsers(dest="command")
13
+
14
+ serve = sub.add_parser("serve", help="run the Ollama-compatible sidecar")
15
+ serve.add_argument("--host", default="127.0.0.1")
16
+ serve.add_argument("--port", type=int, default=8088)
17
+ serve.add_argument("--ollama-url", default="http://localhost:11434")
18
+
19
+ args = parser.parse_args(argv)
20
+
21
+ if args.command == "serve":
22
+ try:
23
+ import uvicorn
24
+
25
+ from cryptomem.server.app import create_app
26
+ except ImportError:
27
+ print("The sidecar needs the 'serve' extra: pip install 'cryptomem[serve]'")
28
+ return 1
29
+ app = create_app(ollama_url=args.ollama_url)
30
+ uvicorn.run(app, host=args.host, port=args.port)
31
+ return 0
32
+
33
+ parser.print_help()
34
+ return 0
35
+
36
+
37
+ if __name__ == "__main__":
38
+ raise SystemExit(main())