Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "engraphis-memory",
"source": "./",
"description": "Discipline for giving agents durable, scoped, explainable memory across sessions and repos with the Engraphis MCP tools.",
"version": "1.4.5"
"version": "1.5.0"
}
]
}
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "engraphis-memory",
"version": "1.4.5",
"version": "1.5.0",
"description": "Give agents durable, scoped, explainable memory across sessions and repos via the Engraphis MCP tools. Use when you learn something worth keeping, need prior context before acting, or ask why/how a fact changed. Covers remember/recall, why/timeline, forget/pin/correct, sessions, and code search.",
"author": {
"name": "The Engraphis Authors",
Expand Down
6 changes: 3 additions & 3 deletions .claude-plugin/skill-assets.sha256
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
e7e4ecd111d9b04c290ddd60e0fadb90e3afd8c67e39dcb8fbce0b50b5e3ce42 .claude-plugin/marketplace.json
65bff1596f3db2bc75b74c6970d87e806d46ef1cb3e612cd2002f19c3a8f6acb .claude-plugin/plugin.json
5d315146fd0bdcd5bb803bab482504c51e6c8e94d9666cd4910ca8f4a645b564 .claude-plugin/marketplace.json
a51eb5baab17efb66193759be7f68df32451594b799476e7ec6e3b076b7fdff5 .claude-plugin/plugin.json
56be8d078a2a8fc6e6cd1c2be5716605d8621dab953caa8cfcd20e2dce474305 skills/engraphis-memory/SKILL.md
45dd73ca6afdd9e12ecd38c48e4a612b7646c25a07a75a80ca0e68d0e0b85f0e skills/engraphis-memory/references/CONVENTIONS.md
529fff3bdbe73f83209087fd10055fad77c5e5224ad8a9e6b0254052aa50e109 skills/engraphis-memory/references/SCOPING.md
eecd861f0f8cc2a9def07a53387ca66d8cb68d8b62d9b048dcd1b0b250fa3fee skills/engraphis-memory/references/TOOLS.md
b2489b60159655e7e564e234d5aff24ba4d8df7cb82626edeaaaf89264007f85 skills/engraphis-memory/references/TOOLS.md
19 changes: 14 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,17 @@ ENGRAPHIS_API_TOKEN=
# ── Embeddings ──────────────────────────────────────────────────────────────
# Local sentence-transformers model (downloaded on first run, ~80-400 MB).
ENGRAPHIS_EMBED_MODEL=sentence-transformers/all-MiniLM-L6-v2
# Optional immutable Hugging Face commit for the embedding model. Required for remote
# models when ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=1; local:/paths remain permitted.
# ENGRAPHIS_EMBED_REVISION=<lowercase 40-character model commit>
# Reject mutable remote embedding, reranker, and chunk-tokenizer tags before loading. Off by default.
# ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=0
# Embedding dimension is auto-detected from the model. Override only if needed.
# ENGRAPHIS_EMBED_DIM=384
# Vector index backend for the v2 engine: "numpy" (default, deterministic reference
# index), "sqlite-vec" (require the accelerated ANN backend; needs the sqlite-vec
# package), or "auto" (use sqlite-vec when available, fall back to NumPy).
# ENGRAPHIS_VECTOR_BACKEND=numpy
# Vector index backend for server entrypoints: "auto" (default; use sqlite-vec when
# engraphis[vector] is installed and compatible, otherwise NumPy), "sqlite-vec"
# (require native exact-KNN acceleration), or "numpy" (force the reference index).
# ENGRAPHIS_VECTOR_BACKEND=auto

# ── LLM (external, you choose the provider) ─────────────────────────────────
# Provider: openai | anthropic | google | openrouter | custom
Expand Down Expand Up @@ -130,7 +135,7 @@ ENGRAPHIS_RETENTION_SUPERVISOR=none
# Standalone MCP-over-HTTP server (`engraphis-mcp-http`). Loopback-only by default;
# any non-loopback bind (via these or ENGRAPHIS_HOST) requires ENGRAPHIS_API_TOKEN.
# ENGRAPHIS_HTTP_HOST=127.0.0.1
# ENGRAPHIS_HTTP_PORT=8080
# ENGRAPHIS_HTTP_PORT=8711
# ENGRAPHIS_HTTP_TRANSPORT=streamable-http

# When running under Docker (auto-detected via /.dockerenv), the self-updater skips
Expand Down Expand Up @@ -195,6 +200,7 @@ ENGRAPHIS_LLM_MODEL=gpt-4o-mini

# Prefer the owner-only ~/.engraphis/cloud_session.json written by `engraphis connect`:
#
# engraphis connect --preflight # validate endpoints/storage; never reads or sends a token
# engraphis connect --token engr_ct_... # the command your account portal shows
# printf %s "$TOKEN" | engraphis connect --token - # keep the token out of shell history
#
Expand Down Expand Up @@ -310,6 +316,9 @@ ENGRAPHIS_LLM_MODEL=gpt-4o-mini
# decayed transients, and distills recurring episodic memories into semantic digests.
# ENGRAPHIS_LOOP_CONSOLIDATE=0
# ENGRAPHIS_RERANK_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2
# Optional immutable Hugging Face commit for the reranker. Required for remote
# rerankers when ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=1.
# ENGRAPHIS_RERANK_REVISION=<lowercase 40-character model commit>

# Workspace allow-list: comma-separated names. Empty = all allowed.
# ENGRAPHIS_WORKSPACES=acme,personal
Expand Down
14 changes: 14 additions & 0 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# CodeQL configuration for Engraphis
#
# The deterministic embedder uses SHA-1 solely for feature hashing (the
# "hashing trick") to map tokens to vector dimensions. This is not a security
# primitive: the output is never used for passwords, signatures, integrity
# checks, or any cryptographic purpose. The code sets usedforsecurity=False.
#
# Changing to SHA-256 would invalidate all existing local vectors and break
# the documented compatibility invariant in regression tests.

name: "Engraphis CodeQL config"

paths-ignore:
- engraphis/backends/embedder_deterministic.py
8 changes: 8 additions & 0 deletions .github/release-constraints.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Artifact-affecting release tooling. PIP_CONSTRAINT is exported by release.yml so
# PEP 517 build-isolation subprocesses use this exact backend/frontend toolchain.
pip==26.2
setuptools==83.0.0
wheel==0.47.0
build==1.5.0
twine==6.2.0
pip-audit==2.10.1
87 changes: 80 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,34 @@ jobs:
- name: Unit tests (full suite — extras-gated tests included)
run: |
python -c "import fastapi, httpx, mcp, multipart, pydantic, uvicorn"
python -m pytest -o addopts="" tests/ -q -rs
ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest"
- name: Retrieval eval gate
run: python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5
- name: Retrieval eval gate — CodeMem (coding-agent wedge, incl. conflict resolution)
run: python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5
- name: Ablation (vector-only vs hybrid)
run: python -m eval.ablation
- name: Reinforcement state-transition gate
run: python -m eval.reinforcement
- name: Adversarial memory prompt-boundary gate
run: python -m eval.adversarial_memory_security

typecheck:
name: core + backends typecheck (Python 3.11)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
cache: pip
cache-dependency-path: pyproject.toml
- name: Install typecheck dependencies
run: |
python -m pip install --upgrade pip
pip install -e ".[test]"
- name: Typecheck core and backends (Pyright)
run: pyright

encryption:
name: encryption driver gate (Python ${{ matrix.python-version }})
Expand All @@ -66,7 +87,9 @@ jobs:
# extension during the long general suite. Keep its real driver contract in
# this dedicated, short-lived process rather than skipping encryption coverage.
- name: Encryption at-rest integration tests
run: python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs
run: |
python -c "import sqlcipher3; print(sqlcipher3.__file__)"
ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest"

core-py39:
name: core floor (numpy-only, Python 3.9)
Expand All @@ -81,13 +104,59 @@ jobs:
- name: Install (numpy-only core — the minimum supported runtime)
run: |
python -m pip install --upgrade pip
pip install numpy pytest
pip install numpy "pytest<9"
- name: Unit tests (extras-gated tests skip; the core must pass)
run: python -m pytest -o addopts="" tests/ -q -rs
run: ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest"
- name: Retrieval eval gate
run: python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5
- name: Ablation
run: python -m eval.ablation
- name: Reinforcement state-transition gate
run: python -m eval.reinforcement
- name: Adversarial memory prompt-boundary gate
run: python -m eval.adversarial_memory_security
- name: Build and smoke installed core artifacts
shell: bash
run: |
set -euo pipefail
python -m pip install --disable-pip-version-check "build==1.2.2"
dist_dir="$RUNNER_TEMP/engraphis-py39-dist"
export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")"
python -m build --outdir "$dist_dir"
index=0
for artifact in "$dist_dir"/*.whl "$dist_dir"/*.tar.gz; do
index=$((index + 1))
venv="$RUNNER_TEMP/engraphis-py39-artifact-$index"
python -m venv "$venv"
"$venv/bin/python" -m pip install --disable-pip-version-check "$artifact"
"$venv/bin/python" -m pip check
(
cd "$RUNNER_TEMP"
"$venv/bin/python" - <<'PY'
import pathlib
import sys

import engraphis
from engraphis.core.engine import MemoryEngine

package = pathlib.Path(engraphis.__file__).resolve()
assert pathlib.Path(sys.prefix).resolve() in package.parents, package
engine = MemoryEngine.create(":memory:")
workspace_id = engine.store.get_or_create_workspace("py39-artifact")
memory_id = engine.remember(
"The Python 3.9 artifact marker is indigo.",
workspace_id=workspace_id,
resolve_conflicts=False,
)
result = engine.recall("Python 3.9 artifact marker", workspace_id=workspace_id, k=3)
assert any(chunk["id"] == memory_id for chunk in result.chunks)
engine.store.close()
PY
"$venv/bin/engraphis" --help
"$venv/bin/engraphis" --version
"$venv/bin/engraphis-cli" --help
)
done

coverage:
name: coverage gate (Python 3.11)
Expand All @@ -104,7 +173,7 @@ jobs:
python -m pip install --upgrade pip
pip install -e ".[test]" pytest-cov
- name: Coverage run (all extras-gated tests, tracked modules)
run: python -m pytest -o addopts="" tests/ -q -rs --cov=engraphis --cov-report=term-missing --cov-fail-under=60
run: ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" --cov=engraphis --cov-report=term-missing --cov-fail-under=60

hygiene:
name: repo hygiene gate (no stray DBs/logs)
Expand Down Expand Up @@ -239,7 +308,7 @@ jobs:
rm -rf "$audit_dir"
}
trap cleanup EXIT
python -m pip install --disable-pip-version-check --no-cache-dir pip-audit
python -m pip install --disable-pip-version-check --no-cache-dir pip-audit==2.10.1
docker create --name "$container" engraphis:ci >/dev/null
docker cp "$container":/usr/local/lib/python3.11/site-packages/. "$audit_dir"
python -m pip_audit --path "$audit_dir"
Expand Down Expand Up @@ -277,9 +346,13 @@ jobs:
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.11"
- name: Install pinned build and audit tooling
run: >-
python -m pip install --disable-pip-version-check
"build==1.5.0" "pip-audit==2.10.1"
- name: Build sdist + wheel and verify a clean install
run: |
python -m pip install --upgrade pip build pip-audit
export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")"
python -m build
python scripts/verify_distribution_contents.py dist/*
python -m venv .audit-venv
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ jobs:
with:
languages: ${{ matrix.language }}
build-mode: none
config-file: ./.github/codeql/codeql-config.yml
- name: Analyze
id: analyze
uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4
Expand Down
Loading