From 73c598e319ea3d42e233c12c1616ca07cdf75cd9 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:15:24 -0700 Subject: [PATCH] build: drop the hermes-agent[hindsight] extra MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The catalog plugin declares hindsight-client in its own plugin.yaml and the plugin installer resolves it (into HERMES_LAZY_INSTALL_TARGET on the sealed Docker image), so the pyproject extra, its exclude-newer entry and every consumer that pre-installed it — the Dockerfile, the nix full package / module examples / check override, and the CI `uv sync` matrices — stop naming it. uv.lock regenerated with `uv lock` (only the hindsight-client package and the extra leave the lock; the exclude-newer block is re-sorted by uv). --- .github/workflows/tests-os.yml | 2 +- .github/workflows/tests.yml | 6 +- Dockerfile | 12 +- nix/checks.nix | 2 +- nix/hermes-agent.nix | 2 +- nix/moduleCommon.nix | 4 +- nix/packages.nix | 1 - pyproject.toml | 10 +- tests/test_project_metadata.py | 2 +- uv.lock | 204 +++++++++++++++------------------ 10 files changed, 109 insertions(+), 136 deletions(-) diff --git a/.github/workflows/tests-os.yml b/.github/workflows/tests-os.yml index 58374492c0..aa385c02fe 100644 --- a/.github/workflows/tests-os.yml +++ b/.github/workflows/tests-os.yml @@ -92,7 +92,7 @@ jobs: # because it could not build here). uses: ./.github/actions/retry with: - command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra hindsight --extra parallel-web + command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra parallel-web - name: Minimize uv cache run: uv cache prune --ci diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cfe819a802..0f2a221f67 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -73,14 +73,14 @@ jobs: # The trailing extras beyond all/dev are the lazy-install features # (tools/lazy_deps.py) that tests exercise for real: provider.anthropic, # stt/tts.mistral, image.fal, terminal.modal, terminal.daytona, - # memory.hindsight, search.parallel. The hermetic test env forbids + # search.parallel. The hermetic test env forbids # mid-run pip installs (HERMES_DISABLE_LAZY_INSTALLS=1 in # tests/conftest.py), so the SDKs those tests need must be in the # venv up front — resolved from uv.lock like everything else, which # also honors the exact supply-chain pins these extras carry. uses: ./.github/actions/retry with: - command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra hindsight --extra parallel-web + command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra parallel-web - name: Minimize uv cache # Optimized for CI: prunes pre-built wheels that are cheap to @@ -204,7 +204,7 @@ jobs: # in the venv up front. uses: ./.github/actions/retry with: - command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra hindsight --extra parallel-web + command: uv sync --locked --python 3.11 --extra all --extra dev --extra anthropic --extra mistral --extra fal --extra modal --extra daytona --extra parallel-web - name: Minimize uv cache # Optimized for CI: prunes pre-built wheels that are cheap to diff --git a/Dockerfile b/Dockerfile index 30774bdf31..4cc04bc36e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -247,12 +247,10 @@ RUN cd plugins/platforms/photon/sidecar && \ # Health export is enabled. Collector and observability-backend dependencies # remain external and are not part of the Hermes production image. # -# The hindsight memory provider's client (hindsight-client) is baked in -# for the same reason: it lazy-installs into /opt/hermes/.venv at first -# use, which lives inside the (immutable) image layer rather than the -# mounted /opt/data volume, so it is lost on every container recreate / -# image update and recall/retain then fails with -# `ModuleNotFoundError: No module named 'hindsight_client'` (#38128). +# Catalog memory plugins (e.g. hindsight, since it left the tree) are not +# baked in: their pip dependencies install at plugin-install time through +# tools/lazy_deps.py into HERMES_LAZY_INSTALL_TARGET (the durable /opt/data +# volume, see below), so they survive container recreates (#38128). # # The Matrix gateway's deps ([matrix] extra) are baked in because # python-olm (transitive via mautrix[encryption]) builds from source on @@ -269,7 +267,7 @@ RUN cd plugins/platforms/photon/sidecar && \ # The editable link is created after the source copy below. COPY pyproject.toml uv.lock ./ RUN touch ./README.md -RUN uv sync --frozen --no-install-project --extra all --extra messaging --extra otlp --extra anthropic --extra bedrock --extra azure-identity --extra hindsight --extra matrix --extra google-chat +RUN uv sync --frozen --no-install-project --extra all --extra messaging --extra otlp --extra anthropic --extra bedrock --extra azure-identity --extra matrix --extra google-chat # ---------- Frontend build (cached independently from Python source) ---------- # Copy only the frontend source trees first so that Python-only changes don't diff --git a/nix/checks.nix b/nix/checks.nix index b47fe19c3d..80a5c1246e 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -380,7 +380,7 @@ json.dump(sorted(leaf_paths(DEFAULT_CONFIG)), sys.stdout, indent=2) # IS the default package, so a launcher that pinned the plain # default would look correct while it shipped a second # runtime to anyone who customises theirs. - extraDependencyGroups = [ "hindsight" ]; + extraDependencyGroups = [ "honcho" ]; backend = { mode = "serve"; port = 9231; diff --git a/nix/hermes-agent.nix b/nix/hermes-agent.nix index 2055c9cd6c..e3a61ca531 100644 --- a/nix/hermes-agent.nix +++ b/nix/hermes-agent.nix @@ -3,7 +3,7 @@ # callPackage auto-wires nixpkgs args; flake inputs are passed explicitly. # Users override via: # pkgs.hermes-agent.override { extraPythonPackages = [...]; } -# pkgs.hermes-agent.override { extraDependencyGroups = [ "hindsight" ]; } +# pkgs.hermes-agent.override { extraDependencyGroups = [ "honcho" ]; } { lib, stdenv, diff --git a/nix/moduleCommon.nix b/nix/moduleCommon.nix index cb0da9444a..1f6e7e7dd9 100644 --- a/nix/moduleCommon.nix +++ b/nix/moduleCommon.nix @@ -471,10 +471,10 @@ let dependencies — no PYTHONPATH patching or collision risk. Use this for optional extras already declared in hermes-agent's - pyproject.toml (e.g. "hindsight", "honcho", "voice"). + pyproject.toml (e.g. "honcho", "voice"). Use extraPythonPackages for external packages not in pyproject.toml. ''; - example = [ "hindsight" ]; + example = [ "honcho" ]; }; # ── Service behaviour ────────────────────────────────────────────── diff --git a/nix/packages.nix b/nix/packages.nix index a496f73a3e..8399feef59 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -33,7 +33,6 @@ "fal" "feishu" "firecrawl" - "hindsight" "honcho" "messaging" "modal" diff --git a/pyproject.toml b/pyproject.toml index 55caa670b0..f697bba62b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,8 +74,8 @@ dependencies = [ # ``packaging`` is imported directly on three production paths but was never # declared, so it only reached users transitively (pip/uv pull it for other # tools). The slim official Docker image ships without it, where the - # try/except-ImportError fallbacks silently degrade: Hindsight's - # ``_meets_minimum_version`` disables update_mode='append' (#40503), + # try/except-ImportError fallbacks silently degrade: memory plugins' + # version compares disable features (#40503), # tools/lazy_deps.py treats every version constraint as satisfied, and # hermes_cli/main.py drops to naive requirement parsing. Pure-Python # py3-none-any wheel, no compiled extensions — safe to ship everywhere. @@ -217,7 +217,6 @@ edge-tts = ["edge-tts==7.2.7"] modal = ["modal==1.3.4"] daytona = ["daytona==0.155.0"] vercel = ["vercel==0.7.2"] -hindsight = ["hindsight-client==0.6.1"] dev = ["debugpy==1.8.20", "pytest==9.1.1", "pytest-asyncio==1.3.0", "mcp==2.0.0", "httpx2==2.7.0", "starlette==1.3.1", "ty==0.0.21", "ruff==0.15.10", "setuptools==83.0.0"] # starlette: CVE-2026-48710; setuptools: 83 (torch >=2.13 requires setuptools 83) messaging = ["python-telegram-bot[webhooks]==22.8", "discord.py[voice]==2.7.1", "aiohttp==3.14.3", "brotlicffi==1.2.0.2", "slack-bolt==1.30.0", "slack-sdk==3.44.1", "qrcode==7.4.2"] # aiohttp 3.14.3: prior CVEs + GHSA-cq5v-8q36-5273/GHSA-mfx4-hv73-q22v/GHSA-mq44-7p77-q5h7 cron = [] # croniter is now a core dependency; this extra kept for back-compat @@ -260,9 +259,9 @@ honcho = ["honcho-ai==2.2.0"] # Cloud memory providers — opt-in, lazy-installed via tools/lazy_deps.py # (memory.supermemory / memory.mem0) at first use. Where BOTH pin exactly the # versions MUST match (enforced by tests/test_project_metadata.py); LAZY_DEPS -# entries that mirror a plugin.yaml range (mem0ai, hindsight-client) keep the +# entries that mirror a plugin.yaml range (mem0ai) keep the # extra as the floor install and never downgrade a newer compatible release. -# Deliberately excluded from [all] like honcho/hindsight so a quarantined +# Deliberately excluded from [all] like honcho so a quarantined # upstream release can't break fresh installs. supermemory = ["supermemory==3.50.0"] mem0 = ["mem0ai==2.0.10"] @@ -533,7 +532,6 @@ google-auth-httplib2 = false google-auth-oauthlib = false google-cloud-pubsub = false h2 = false -hindsight-client = false honcho-ai = false httplib2 = false httpx = false diff --git a/tests/test_project_metadata.py b/tests/test_project_metadata.py index 67de0b57c2..209a9b4e85 100644 --- a/tests/test_project_metadata.py +++ b/tests/test_project_metadata.py @@ -71,7 +71,7 @@ def test_lazy_installable_extras_excluded_from_all(): "voice", # faster-whisper / sounddevice / numpy "modal", "daytona", "vercel", "messaging", "slack", "matrix", "dingtalk", "feishu", "google-chat", - "honcho", "hindsight", + "honcho", "supermemory", "mem0", "mistral", # mistralai — Voxtral STT/TTS, lazy-installed (stt.mistral / tts.mistral) } diff --git a/uv.lock b/uv.lock index 80191e4477..3b2c8f39fc 100644 --- a/uv.lock +++ b/uv.lock @@ -12,105 +12,104 @@ exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for exclude-newer-span = "P14D" [options.exclude-newer-package] -elevenlabs = false -setuptools = false -modal = false -pyyaml = false -maturin = false -numpy = false -pvporcupine = false -google-auth = false -aiohttp = false -starlette = false -mistralai = false -firecrawl-py = false -parallel-web = false -markdown = false -opentelemetry-sdk = false -prompt-toolkit = false -fastapi = false -anthropic = false -pathspec = false -openwakeword = false -defusedxml = false -ruff = false -exa-py = false -mcp = false -python-olm = false -wheel = false -websockets = false -pytest = false -pillow = false -setuptools-rust = false -tenacity = false -pyjwt = false -slack-bolt = false -fal-client = false -asyncpg = false -boto3 = false -ruamel-yaml = false -sherpa-onnx = false -huggingface-hub = false -pytest-asyncio = false -google-cloud-pubsub = false -slack-sdk = false -discord-py = false -honcho-ai = false -faster-whisper = false -certifi = false -debugpy = false -packaging = false -rich = false -supermemory = false -unpaddedbase64 = false -h2 = false -youtube-transcript-api = false -edge-tts = false -microsoft-teams-apps = false -aiohttp-socks = false +agent-client-protocol = false ai-edge-litert = false -onnxruntime = false -croniter = false -opentelemetry-exporter-otlp-proto-http = false -azure-identity = false -lark-oapi = false -sentencepiece = false -firecrawl-anydoc = false -google-api-python-client = false -brotlicffi = false -mem0ai = false -qrcode = false -vercel = false +aiohttp = false +aiohttp-socks = false aiosqlite = false -tzdata = false -python-dotenv = false +alibabacloud-dingtalk = false +anthropic = false +asyncpg = false +azure-identity = false +boto3 = false +brotlicffi = false +certifi = false +concurrent-log-handler = false +croniter = false +cryptography = false daytona = false -uvicorn = false -nemo-relay = false -requests = false +debugpy = false +defusedxml = false +dingtalk-stream = false +discord-py = false +edge-tts = false +elevenlabs = false +exa-py = false +fal-client = false +fastapi = false +faster-whisper = false +fire = false +firecrawl-anydoc = false +firecrawl-py = false +google-api-python-client = false +google-auth = false +google-auth-httplib2 = false +google-auth-oauthlib = false +google-cloud-pubsub = false +h2 = false +honcho-ai = false httplib2 = false httpx = false -pyasn1 = false -snowballstemmer = false -concurrent-log-handler = false -cryptography = false -pydantic = false -agent-client-protocol = false -fire = false httpx2 = false -google-auth-oauthlib = false -python-multipart = false -ty = false -openai = false -mautrix = false -google-auth-httplib2 = false -python-telegram-bot = false -psutil = false +huggingface-hub = false jinja2 = false -hindsight-client = false +lark-oapi = false +markdown = false +maturin = false +mautrix = false +mcp = false +mem0ai = false +microsoft-teams-apps = false +mistralai = false +modal = false +nemo-relay = false +numpy = false +onnxruntime = false +openai = false +opentelemetry-exporter-otlp-proto-http = false +opentelemetry-sdk = false +openwakeword = false +packaging = false +parallel-web = false +pathspec = false +pillow = false +prompt-toolkit = false +psutil = false +pvporcupine = false +pyasn1 = false +pydantic = false +pyjwt = false +pytest = false +pytest-asyncio = false +python-dotenv = false +python-multipart = false +python-olm = false +python-telegram-bot = false +pyyaml = false +qrcode = false +requests = false +rich = false +ruamel-yaml = false +ruff = false +sentencepiece = false +setuptools = false +setuptools-rust = false +sherpa-onnx = false +slack-bolt = false +slack-sdk = false +snowballstemmer = false sounddevice = false -alibabacloud-dingtalk = false -dingtalk-stream = false +starlette = false +supermemory = false +tenacity = false +ty = false +tzdata = false +unpaddedbase64 = false +uvicorn = false +vercel = false +websockets = false +wheel = false +youtube-transcript-api = false [manifest] overrides = [ @@ -1860,9 +1859,6 @@ google-chat = [ { name = "httplib2" }, { name = "pyasn1" }, ] -hindsight = [ - { name = "hindsight-client" }, -] homeassistant = [ { name = "aiohttp" }, ] @@ -2054,7 +2050,6 @@ requires-dist = [ { name = "hermes-agent", extras = ["web"], marker = "extra == 'all'" }, { name = "hermes-agent", extras = ["web"], marker = "extra == 'termux-all'" }, { name = "hermes-agent", extras = ["youtube"], marker = "extra == 'all'" }, - { name = "hindsight-client", marker = "extra == 'hindsight'", specifier = "==0.6.1" }, { name = "honcho-ai", marker = "extra == 'honcho'", specifier = "==2.2.0" }, { name = "httplib2", marker = "extra == 'google'", specifier = "==0.32.0" }, { name = "httplib2", marker = "extra == 'google-chat'", specifier = "==0.32.0" }, @@ -2139,7 +2134,7 @@ requires-dist = [ { name = "websockets", specifier = "==15.0.1" }, { name = "youtube-transcript-api", marker = "extra == 'youtube'", specifier = "==1.2.4" }, ] -provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "fal", "edge-tts", "modal", "daytona", "vercel", "hindsight", "dev", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "google-chat", "youtube", "web", "all"] +provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "fal", "edge-tts", "modal", "daytona", "vercel", "dev", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "google-chat", "youtube", "web", "all"] [[package]] name = "hf-xet" @@ -2157,23 +2152,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/39/c6/988383e9dc17294d536fcbcd6fd16eed882e411ad16c954984a53e47b09c/hf_xet-1.5.2-cp38-abi3-win_arm64.whl", hash = "sha256:1da28519496eb7c8094c11e4d25509b4a468457a0302d58136099db2fd9a671d", size = 3816957, upload-time = "2026-07-16T17:29:54.991Z" }, ] -[[package]] -name = "hindsight-client" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "aiohttp-retry" }, - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "typing-extensions" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/26/8b8efa4be21fc3ba12ade3b1353d87f9837ec0d3ec2607e8adbf85bc9c63/hindsight_client-0.6.1.tar.gz", hash = "sha256:314d0bb9e13622e15586ba1586a799726d405b27bc20d78872474b5d6d96cd51", size = 99833, upload-time = "2026-05-08T13:01:23.537Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/4f/a1d0bc33ef933ecc52e76dc1514163594d25836a5d303c256a61bb61445d/hindsight_client-0.6.1-py3-none-any.whl", hash = "sha256:9fdda176ab50f7cec8d7339c6608c148f0cd9ad7e65d9d76192f2db730bc330a", size = 249379, upload-time = "2026-05-08T13:01:22.035Z" }, -] - [[package]] name = "honcho-ai" version = "2.2.0"