[project] name = "iai-pme" version = "3.3.0" description = "MCP server giving Claude persistent autistic-style memory + learning" authors = [{ name = "Areg Noya" }] requires-python = ">=3.11,<3.13" dependencies = [ "numpy>=1.26.0,<2.3.0", # networkx evicted from main deps. The σ assembly and the # graph-algorithm consumer surface route through the native Rust # ``iai_mcp_native.graph`` namespace + the pure-Python rich-club # helper. The legacy MemoryGraph storage backend lazy-imports # networkx inside ``__init__``; it remains an internal # implementation detail and is pinned exactly to ``networkx==3.3`` # in ``[project.optional-dependencies.dev]`` to double-duty as the # σ-baseline oracle and the MemoryGraph test backend. "scipy>=1.13.0", # CSR build glue for the σ assembly helpers. "numba>=0.59", # Numba JIT for the community-detection kernels. BSD-2 license, MIT-compatible. # anthropic SDK removed in v7.5: subscription-billed `claude -p` # subprocess replaces api.anthropic.com direct calls. Bench harness uses # the tiktoken cl100k proxy for token counting where needed. "tiktoken>=0.7.0", # offline tokeniser fallback for bench/tokens.py + 3 tests "cryptography>=42.0.0", # AES-256-GCM at rest (pyca/cryptography, audited primitive) "keyring>=24.0.0", # OS keychain (macOS / Linux Secret Service / Windows Credential Manager) "cachetools>=5.3.0", # TTLCache for HIPPEA activation-cascade LRU warmer "psutil>=5.9.0", # self-process CPU sampling for daemon CPU watchdog. Already used 4x in doctor.py via transitive resolution; this declaration makes a clean `pip install -e .` reach psutil without [compress] extra. "pandas>=2.0,<3.0", # DataFrame is the Hippo query-result format on the .to_pandas() read path; required at runtime by hippo/store/events/core. "zstandard>=0.22,<1.0", # python-zstandard codec inside the AES-GCM envelope on the 4 text/JSON content columns (literal_surface, provenance_json, profile_modulation_gain_json, events.data_json); critical synchronous at-rest path — NOT an optional extra. "pypdf>=4.0", # pure-Python PDF text extraction for the `iai upload .pdf` ingestion path; lazy-imported inside the .pdf branch of iai_mcp.ingest._parsers so .txt/.md/.csv uploads work without pypdf at runtime. "setproctitle==1.3.7", # daemon process title (cosmetic, fail-soft) # Removed after the 2026-05-25 dependency audit: # - torch-hd: superseded by in-tree `iai_mcp.lilli` (BSC/FHRR/sparse VSA tiers) # - pydantic: declared but zero imports anywhere in `src/` # - structlog: declared but zero references anywhere (stdlib `logging` is the actual logger) # - langdetect: dropped 2026-05-28; the English-Only Brain invariant makes # language guessing on stored text unnecessary (the surface translates # inbound on the way in). All call sites now write language='en' directly. ] [project.optional-dependencies] dev = [ "pytest>=8.0", # Honors the per-test @pytest.mark.timeout overrides on the prod-scale # multi-minute gates; without it a lane-wide --timeout kills them mid-run. "pytest-timeout>=2.3", # Fast-lane parallel runs (worksteal only — the load/loadfile schedulers # lose a worker on this suite; the sequential run stays the release gate). "pytest-xdist>=3.5", "reportlab>=4.0", # builds a 1-page PDF fixture on demand inside the ingestion test suite; never imported at runtime by the production package. "defusedxml>=0.7", # hardened XML parse of the Windows scheduled-task fixtures in the daemon-install and fdlimit test suites; never imported at runtime by the production package. "ruff>=0.5.0", # networkx is the σ-baseline oracle in tests/fixtures/sigma_baseline.json # (the locked SHA-pinned fixture was generated via networkx 3.3); it also # backs MemoryGraph's lazy-imported internal storage. Exact pin so the # baseline reproducibility check stays stable. "networkx==3.3", # Differential property-based harness for the σ baseline oracle. "hypothesis-networkx>=0.3", # sklearn.metrics oracle for the mosaic LFR gauntlet (was previously a # transitive dep of the old embedder stack; now declared directly). "scikit-learn>=1.3", ] # One-time migration from legacy LanceDB store to Hippo. # Install with: pip install iai-pme[migration] # Then run: python scripts/migrate_lance_to_hippo.py migration = ["lancedb>=0.11.0,<1.0"] [project.scripts] iai-mcp-core = "iai_mcp.core:main" iai-mcp-server = "iai_mcp.mcp_server_entry:main" iai-mcp = "iai_mcp.cli:main" iai = "iai_mcp.iai_cli:main" iai-tools = "iai_mcp.tools_cli:main" [build-system] requires = ["setuptools>=68", "setuptools-rust>=1.10"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] iai_mcp = [ "_deploy/launchd/*.plist", "_deploy/systemd/*.service", "_deploy/windows/*.xml", "_deploy/hooks/*.sh", "_deploy/hooks/*.ps1", "_deploy/hooks/*.py", "_deploy/brainview/*.html", "_wrapper/*.js", ] # The iai_mcp_native Rust extension is declared in setup.py, not here: # its feature set is platform-conditional (Apple Accelerate BLAS on macOS), # and pyproject ext-modules entries are static. [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["src"] norecursedirs = ["_manual", ".*", "build", "dist", "node_modules", "*.egg"] markers = [ "slow: opt-in via --runslow (subprocess-heavy bench-shim resolution tests)", "perf: opt-in via --perf (wall-clock latency benches, out of the default correctness gate)", "live: opt-in via --live (real daemon-subprocess E2E gate, out of the default correctness gate)", "bench: opt-in via --bench (bench-harness smoke against local HF caches and bench artifacts, out of the default correctness gate)", "realstore: opt-in via --runrealstore (opens a copy of the operator's real store, non-hermetic and slow, out of the default correctness gate)", ]