From 86e01ba3edd493c750b52c8a67f9518e57a16ed8 Mon Sep 17 00:00:00 2001 From: ethernet Date: Thu, 24 Sep 2026 23:44:25 -0400 Subject: [PATCH] fix(pm): a lazily installed extra swaps into the running process ensure_import synced the extra into a new generation and then always raised "restart Hermes to activate", so choosing a provider whose SDK is an opt-in extra (anthropic, bedrock, ...) failed the first message in every fresh install or worktree even though the install had succeeded. adopt_selected() already knows when swapping a live process onto a new generation is safe (it was on the generation selected before the sync, and nothing it imported changed version). Call it after the sync; raise only when adoption was refused, naming restart_needed()'s reason. --- pm/extras.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pm/extras.py b/pm/extras.py index 042cb2d6fb..395a21f004 100644 --- a/pm/extras.py +++ b/pm/extras.py @@ -220,17 +220,22 @@ def ensure_import(extra: str) -> None: from pm.client import sync_venv sync_venv([extra]) - # Activation is a process-boot operation. Never mix a newly resolved - # dependency tree with libraries already imported by this process. + # The sync published a new generation. Swap this process onto it when nothing + # already imported would change underneath it (adopt_selected); otherwise only + # a restart can load it. from pm.environments import selected_venv, site_packages + from pm.environments_adopt import adopt_selected, restart_needed from pm.paths import repo_root, runtime_facts_path import sys from pathlib import Path if runtime_facts_path().is_file(): - selected = site_packages(selected_venv(repo_root())).resolve() + root = repo_root() + adopt_selected(root) + selected = site_packages(selected_venv(root)).resolve() if selected not in {Path(entry).resolve() for entry in sys.path}: - raise InstallError("venv", f"{extra} installed; restart Hermes to activate the new dependency environment") + reason = restart_needed(root) or "this process does not run from the install's dependency environment" + raise InstallError("venv", f"{extra} installed; restart Hermes to activate it ({reason})") def ensure_and_bind(extra, importer, target_globals) -> bool: