-
-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathpyproject.toml
More file actions
202 lines (192 loc) · 8.56 KB
/
Copy pathpyproject.toml
File metadata and controls
202 lines (192 loc) · 8.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
[build-system]
requires = [
# 83.0 fixes CVE-2026-59890 in sdist exclusion handling. Keep the Python 3.9
# core installable with the newest compatible backend; release builds run 3.11.
"setuptools>=83.0; python_version >= '3.10'",
"setuptools>=77.0; python_version < '3.10'",
"wheel",
]
build-backend = "setuptools.build_meta"
[project]
name = "engraphis"
version = "1.0.0"
description = "Local-first AI memory engine for agents — Ebbinghaus decay, interaction-aware recall, bi-temporal facts, hybrid retrieval, and an MCP server. You bring the LLM."
readme = "README.md"
license = "Apache-2.0"
license-files = ["LICENSE", "NOTICE"]
requires-python = ">=3.9"
authors = [{ name = "The Engraphis Authors" }]
keywords = ["ai", "agents", "memory", "mcp", "rag", "vector-search", "llm", "retrieval"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Software Development :: Libraries",
]
dependencies = [
"numpy>=1.24",
]
[project.optional-dependencies]
# The REST server + real embeddings (the full self-hosted stack).
server = [
# These floors exclude known request-parsing, StaticFiles/UNC, and URL-boundary
# vulnerabilities. Their patched releases require Python 3.10, so the marker is
# mandatory: without it `pip install engraphis[server]` cannot RESOLVE AT ALL on
# 3.9 (no matching distribution), which is the very command the launcher tells a
# 3.9 user to run. Marked, the install succeeds and scripts/start_server.py
# reports the 3.10 requirement itself. The NumPy-only core stays 3.9-clean.
"fastapi>=0.133.1,<1; python_version >= '3.10'",
"starlette>=1.3.1,<2; python_version >= '3.10'",
"uvicorn[standard]>=0.29",
"httpx>=0.25",
"pydantic>=2.0",
"python-dotenv>=1.0",
# fastapi Form/File routes (dashboard import/upload) need this at app-import time;
# without it a bare [server] install crashes on startup (mcp only brings it
# transitively, which is how CI stayed green while [server] was broken).
# Marked for the same reason as fastapi/starlette: every release satisfying this
# floor requires 3.10, so an unmarked entry makes the whole extra unresolvable on 3.9.
"python-multipart>=0.0.31; python_version >= '3.10'",
"sentence-transformers>=2.7",
]
# The MCP server — plug Engraphis into Claude Code, Cursor, Cline, Zed, etc.
# The upstream MCP SDK requires Python 3.10+; the numpy-only core remains Python 3.9.
mcp = [
# 1.28.1 contains the current 1.x transport-security fixes; upstream explicitly
# recommends the <2 cap because stable v2 is a breaking line.
"mcp>=1.28.1,<2; python_version >= '3.10'",
"python-multipart>=0.0.31; python_version >= '3.10'",
"starlette>=1.3.1,<2; python_version >= '3.10'",
"pydantic-settings>=2.14.2; python_version >= '3.10'",
"cryptography>=48.0.1; python_version >= '3.10'",
"pydantic>=2.0",
"sentence-transformers>=2.7",
]
# Code-symbol graph indexing. Optional: index_repo()/search_code()
# fall back to a dependency-free regex indexer without this — see backends/codegraph.py.
code = [
"tree-sitter>=0.23",
"tree-sitter-language-pack>=0.2",
]
# Local resource extraction. Text/code/HTML/DOCX remain stdlib-only; this adds PDF
# extraction and image OCR bindings (the Tesseract executable is installed separately).
documents = [
"pypdf>=4.0",
"Pillow>=12.3.0; python_version >= '3.10'",
"pytesseract>=0.3.10",
]
transcription = [
"faster-whisper>=1.0",
# onnxruntime 1.24+ dropped CPython 3.10 wheels; keep the advertised 3.10
# install path resolvable while faster-whisper still supports it.
"onnxruntime<1.24; python_version < '3.11'",
]
postgres = [
# psycopg is LGPL-3.0 — acceptable as an optional, user-installed, non-vendored
# extra of this Apache-2.0 project; noted here for license-audit clarity.
"psycopg[binary]>=3.1",
]
# Encryption at rest for the memory database (SQLCipher / AES-256). Opt-in: set
# ENGRAPHIS_DB_KEY (or ENGRAPHIS_DB_KEY_FILE). Without this the DB is plaintext.
encryption = [
# Upstream publishes CPython manylinux x86-64 wheels only. musl/Alpine is not
# machine-detectable in PEP 508; those users must provision a compatible driver.
"sqlcipher3-binary>=0.5.0; platform_python_implementation == 'CPython' and platform_system == 'Linux' and platform_machine == 'x86_64'",
]
# Everything available on the current platform, for a full self-hosted install.
# Encryption is intentionally separate: ``all`` must resolve on macOS, Windows, Linux
# ARM, and musl even though sqlcipher3-binary does not publish wheels for those targets.
all = [
"fastapi>=0.133.1,<1; python_version >= '3.10'",
"starlette>=1.3.1,<2; python_version >= '3.10'",
"uvicorn[standard]>=0.29",
"httpx>=0.25",
"pydantic>=2.0",
"python-dotenv>=1.0",
"python-multipart>=0.0.31; python_version >= '3.10'",
"sentence-transformers>=2.7",
"mcp>=1.28.1,<2; python_version >= '3.10'",
"pydantic-settings>=2.14.2; python_version >= '3.10'",
"cryptography>=48.0.1; python_version >= '3.10'",
"tree-sitter>=0.23",
"tree-sitter-language-pack>=0.2",
"pypdf>=4.0",
"Pillow>=12.3.0; python_version >= '3.10'",
"pytesseract>=0.3.10",
"faster-whisper>=1.0",
"onnxruntime<1.24; python_version < '3.11'",
"psycopg[binary]>=3.1",
]
dev = ["pytest>=8.0", "pytest-asyncio>=0.23", "ruff>=0.4"]
# Everything needed to run the FULL offline gate in CI (lint + all extras-gated tests)
# WITHOUT pulling torch/sentence-transformers — no test needs the real embedder.
test = [
"pytest>=8.0",
"pytest-asyncio>=0.23",
"ruff>=0.4",
"python-dotenv>=1.0",
"uvicorn[standard]>=0.29",
"fastapi>=0.133.1,<1; python_version >= '3.10'",
"starlette>=1.3.1,<2; python_version >= '3.10'",
"httpx>=0.25",
# explicit rather than transitive via mcp, so the dependency is stated where it is
# used (fastapi Form routes) instead of riding on another extra's resolution.
"python-multipart>=0.0.31; python_version >= '3.10'",
# exercises the real sqlite-vec ANN backend (k=? KNN + filtered widening) in CI.
"sqlite-vec>=0.1.6",
"mcp>=1.28.1,<2; python_version >= '3.10'",
"pydantic-settings>=2.14.2; python_version >= '3.10'",
"cryptography>=48.0.1; python_version >= '3.10'",
"tree-sitter>=0.23",
"tree-sitter-language-pack>=0.2",
"pypdf>=4.0",
"Pillow>=12.3.0; python_version >= '3.10'",
"pytesseract>=0.3.10",
"faster-whisper>=1.0",
"onnxruntime<1.24; python_version < '3.11'",
"psycopg[binary]>=3.1",
"sqlcipher3-binary>=0.5.0; platform_python_implementation == 'CPython' and platform_system == 'Linux' and platform_machine == 'x86_64'",
]
[project.urls]
Homepage = "https://github.com/Coding-Dev-Tools/engraphis"
Repository = "https://github.com/Coding-Dev-Tools/engraphis"
Issues = "https://github.com/Coding-Dev-Tools/engraphis/issues"
[project.scripts]
engraphis-server = "scripts.start_server:main"
engraphis-cli = "scripts.cli:main"
engraphis-mcp = "engraphis.mcp_cli:main"
engraphis-inspector = "scripts.inspector:main"
engraphis-dashboard = "scripts.start_dashboard:main"
engraphis-consolidate = "scripts.consolidate:main"
engraphis-graph = "scripts.graph_cli:main"
engraphis-graph-server = "scripts.graph_server:main"
engraphis-init = "scripts.init:main"
engraphis-update = "scripts.update:main"
[tool.setuptools]
include-package-data = false
[tool.setuptools.packages.find]
include = ["engraphis*", "scripts*"]
[tool.setuptools.package-data]
# Keep the shipped dashboard assets explicit. A recursive catch-all also packages ignored
# runtime artifacts such as static/__pycache__/*.pyc after a local compile check.
# vendor/**/* covers nested vendor assets too (vendor/* alone doesn't cross "/").
"engraphis.static" = ["*.html", "*.css", "*.js", "*.png", "*.ico", "vendor/*", "vendor/**/*"]
"engraphis" = ["commercial_manifest.json"]
[tool.setuptools.exclude-package-data]
"*" = ["*.pyc", "*.pyo", "__pycache__/*"]
[tool.ruff]
line-length = 100
target-version = "py39"
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-q"
filterwarnings = [
# Third-party (Starlette's TestClient), not our code and not fixable without a
# dependency bump — silence just this one message so the suite output stays clean.
"ignore:Using `httpx` with `starlette.testclient` is deprecated",
]