From 285768fdfbbd8ab1619d9059039849dc81ec5fba Mon Sep 17 00:00:00 2001 From: fangliquan Date: Fri, 25 Sep 2026 09:16:13 +0800 Subject: [PATCH 1/3] fix(pm): drop stale Hindsight extra Merge 27df3b8847 brought back the hermes-agent[hindsight] extra (hindsight-client==0.6.1) that 73c598e319 removed. The catalog Hindsight plugin now requires hindsight-client>=0.10.1,<1, so any workspace containing it fails `uv lock`. Remove the extra, its exclude-newer entry and its legacy-takeover mapping, and regenerate uv.lock. The workspace-member rename from the original PR is dropped here; #122098 landed that half. Salvaged from #122092. --- pm/extras.py | 1 - pyproject.toml | 3 +-- tests/test_project_metadata.py | 2 +- uv.lock | 24 +----------------------- 4 files changed, 3 insertions(+), 27 deletions(-) diff --git a/pm/extras.py b/pm/extras.py index f890086a71..042cb2d6fb 100644 --- a/pm/extras.py +++ b/pm/extras.py @@ -41,7 +41,6 @@ ANCHORS: dict[str, str | tuple[str, ...]] = { "wake-porcupine": "pvporcupine", "fal": "fal_client", "honcho": "honcho", - "hindsight": "hindsight_client", "supermemory": "supermemory", "mem0": "mem0", "messaging": "telegram", diff --git a/pyproject.toml b/pyproject.toml index 7ada412519..ef4c6fa5f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -254,7 +254,6 @@ piper = [ modal = ["modal==1.3.4"] daytona = ["daytona==0.155.0"] vercel = ["vercel==0.7.2"] -hindsight = ["hindsight-client==0.6.1"] google-meet = ["playwright==1.62.0", "websockets==15.0.1"] messaging = [ "python-telegram-bot[webhooks]==22.8", @@ -723,7 +722,7 @@ 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 32387727fe..e2417abc89 100644 --- a/tests/test_project_metadata.py +++ b/tests/test_project_metadata.py @@ -119,7 +119,7 @@ def test_lazy_installable_extras_excluded_from_all(): "telegram", "discord", "wake", "wake-openwakeword", "wake-sherpa", "wake-porcupine", "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 40e1f8de0a..953221d85b 100644 --- a/uv.lock +++ b/uv.lock @@ -112,7 +112,6 @@ google-auth-httplib2 = false psutil = false python-telegram-bot = false jinja2 = false -hindsight-client = false sounddevice = false alibabacloud-dingtalk = false dingtalk-stream = false @@ -2442,9 +2441,6 @@ google-meet = [ { name = "playwright" }, { name = "websockets" }, ] -hindsight = [ - { name = "hindsight-client" }, -] homeassistant = [ { name = "aiohttp" }, ] @@ -2686,7 +2682,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 = "httptools", marker = "python_full_version >= '3.14'", specifier = ">=0.6.3,<0.9" }, @@ -2788,7 +2783,7 @@ requires-dist = [ { name = "winrt-windows-services-store", marker = "python_full_version >= '3.14' and sys_platform == 'win32'", specifier = ">=3.2.1,<4" }, { name = "youtube-transcript-api", marker = "extra == 'youtube'", specifier = "==1.2.4" }, ] -provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "ddgs", "fal", "edge-tts", "neutts", "kittentts", "piper", "modal", "daytona", "vercel", "hindsight", "google-meet", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "telegram", "discord", "stt-whisper", "audio-io", "silk", "wake-openwakeword", "wake-sherpa", "wake-porcupine", "google-chat", "doc-extract", "trace-upload", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "langfuse", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "youtube", "web", "all"] +provides-extras = ["uvloop", "anthropic", "exa", "firecrawl", "parallel-web", "ddgs", "fal", "edge-tts", "neutts", "kittentts", "piper", "modal", "daytona", "vercel", "google-meet", "messaging", "cron", "slack", "matrix", "wecom", "tts-premium", "voice", "wake", "honcho", "telegram", "discord", "stt-whisper", "audio-io", "silk", "wake-openwakeword", "wake-sherpa", "wake-porcupine", "google-chat", "doc-extract", "trace-upload", "supermemory", "mem0", "vision", "pty", "mcp", "nemo-relay", "homeassistant", "sms", "teams", "computer-use", "acp", "mistral", "otlp", "langfuse", "bedrock", "vertex", "azure-identity", "termux", "termux-all", "dingtalk", "feishu", "google", "youtube", "web", "all"] [package.metadata.requires-dev] dev = [ @@ -2831,23 +2826,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/63/ca511b6f802f28cf3489b280fe77475bcca8de85e81a6299d7916b5b5555/hf_xet-1.6.0-cp38-abi3-win_arm64.whl", hash = "sha256:3dc3e35441ba395006af5aaacc40ef2e603c51ef46c3530b9156185f00935ea3", size = 3859359, upload-time = "2026-08-03T22:33:11.725Z" }, ] -[[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" From 425c5c1167839b3c823ba7484f0e90854f46a111 Mon Sep 17 00:00:00 2001 From: fangliquan Date: Fri, 25 Sep 2026 09:27:21 +0800 Subject: [PATCH 2/3] test(pm): exclude catalog Hindsight from legacy extra selection --- tests/pm/test_extras.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/pm/test_extras.py b/tests/pm/test_extras.py index 727583094a..e2aa79f217 100644 --- a/tests/pm/test_extras.py +++ b/tests/pm/test_extras.py @@ -126,7 +126,6 @@ def test_available_missing_module(): @pytest.mark.parametrize(("extra", "module"), [ - ("hindsight", "hindsight_client"), ("teams", "microsoft_teams.apps"), ]) def test_available_counts_sys_modules_fakes(monkeypatch, extra, module): @@ -230,6 +229,7 @@ def test_legacy_selection_carries_extras_the_main_era_venv_lazily_installed(monk (site / "google").mkdir() (site / "google" / "auth").mkdir() (site / "exa_py.cpython-311-x86_64-linux-gnu.so").write_bytes(b"") + (site / "hindsight_client").mkdir() selection = extras.legacy_selection(tmp_path) @@ -237,6 +237,7 @@ def test_legacy_selection_carries_extras_the_main_era_venv_lazily_installed(monk assert {"fal", "telegram", "vertex", "exa"} <= set(selection) assert "messaging" not in selection assert "piper" not in selection + assert "hindsight" not in selection # Catalog plugin owns this dependency, not a core extra. assert extras.legacy_selection(tmp_path / "no-venv") == ["all"] From 3aa215fdc935efa93425dea164c24c665f081bab Mon Sep 17 00:00:00 2001 From: ethernet Date: Thu, 24 Sep 2026 22:15:15 -0400 Subject: [PATCH 3/3] build: remove leftover references to the dropped hindsight extra The extra removal left CI, the Docker image and the nix package still requesting `hindsight`. Once the extra is gone, `--extra hindsight` and extraDependencyGroups = [ "hindsight" ] ask for something that no longer exists. Drop them the same way 73c598e319 originally did: remove it from the CI extras lists, the Docker sealed-venv build and the nix default groups, and point the nix examples/check at honcho. Also remove the stray blank line left in the exclude-newer table. --- .github/workflows/tests-os.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- Dockerfile | 9 +-------- nix/checks.nix | 2 +- nix/hermes-agent.nix | 2 +- nix/moduleCommon.nix | 4 ++-- nix/packages.nix | 1 - pyproject.toml | 3 +-- 8 files changed, 10 insertions(+), 19 deletions(-) diff --git a/.github/workflows/tests-os.yml b/.github/workflows/tests-os.yml index 206a74c8bc..c2b5507545 100644 --- a/.github/workflows/tests-os.yml +++ b/.github/workflows/tests-os.yml @@ -84,7 +84,7 @@ jobs: # the verified Git pin once, before per-file parallelism; otherwise # each isolated PowerShell stage races to download/extract the archive. packages: ${{ matrix.marker == 'windows' && 'git,ripgrep' || 'ripgrep' }} - extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]' + extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "parallel-web"]' test-environment: 'true' prune-python-cache: true @@ -194,7 +194,7 @@ jobs: uses: ./.github/actions/setup-pm with: packages: git,ripgrep - extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]' + extras: '["all", "telegram", "anthropic", "mistral", "fal", "modal", "daytona", "parallel-web"]' test-environment: 'true' prune-python-cache: true diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4bf418b247..81887d1b28 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -44,7 +44,7 @@ jobs: - name: Set up locked Python and test dependencies uses: ./.github/actions/setup-pm with: - extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]' + extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "parallel-web"]' test-environment: 'true' prune-python-cache: true @@ -143,7 +143,7 @@ jobs: uses: ./.github/actions/setup-pm with: toolchain: all - extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "hindsight", "parallel-web"]' + extras: '["all", "anthropic", "bedrock", "mistral", "fal", "modal", "daytona", "parallel-web"]' test-environment: 'true' prune-python-cache: true diff --git a/Dockerfile b/Dockerfile index 7d5b9f22a6..3091eb2768 100644 --- a/Dockerfile +++ b/Dockerfile @@ -259,13 +259,6 @@ FROM runtime_base AS python_deps # 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). -# # The Matrix gateway's deps ([matrix] extra) are baked in because # python-olm (transitive via mautrix[encryption]) builds from source on # Python/image combinations without usable wheels. The Docker image is @@ -283,7 +276,7 @@ RUN touch ./README.md RUN python3 -m pm.build_env --source /opt/hermes --python /usr/local/bin/python3 \ --out /opt/hermes/.venv --no-install-project --sealed \ --extra all --extra messaging --extra otlp --extra anthropic --extra bedrock \ - --extra azure-identity --extra hindsight --extra matrix --extra google-chat + --extra azure-identity --extra matrix --extra google-chat # Icons render on the runtime environment: Pillow and resvg-py are core # dependencies. A stage of its own so the frontend stage keeps building its diff --git a/nix/checks.nix b/nix/checks.nix index d059bac11e..e280818425 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -421,7 +421,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 1c15746544..88b92b511f 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 8581a8a0d1..c75ee383c1 100644 --- a/nix/moduleCommon.nix +++ b/nix/moduleCommon.nix @@ -474,10 +474,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 8d3cb677b5..b1120a9b1f 100644 --- a/nix/packages.nix +++ b/nix/packages.nix @@ -58,7 +58,6 @@ "fal" "feishu" "firecrawl" - "hindsight" "honcho" "messaging" "modal" diff --git a/pyproject.toml b/pyproject.toml index ef4c6fa5f6..3380055aa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -361,7 +361,7 @@ google-chat = [ doc-extract = ["firecrawl-anydoc==0.2.4"] trace-upload = ["huggingface-hub==1.24.0"] # Cloud memory providers are opt-in PM extras. They stay outside [all], -# like honcho/hindsight, so a quarantined release cannot break fresh installs. +# like honcho, so a quarantined release cannot break fresh installs. supermemory = ["supermemory==3.50.0"] # mem0ai pulls qdrant-client → grpcio, which has no win_arm64 wheel — same # win32-arm64 gate as google-chat. mem0 is lazy-installed, so on arm64 the @@ -722,7 +722,6 @@ google-auth-httplib2 = false google-auth-oauthlib = false google-cloud-pubsub = false h2 = false - honcho-ai = false httplib2 = false httpx = false