Merge fallout (my resolution errors, all caught by CI): - hermes_cli/backup.py + gateway.py: `theirs` on those hunks re-imported clusters HEAD had already moved to backup_restore.py / kept in the facade. backup.py loses the 349-line duplicate (main's #110179 fix is ported into backup_restore._import_db_member); the systemd service-unit cluster returns to gateway.py (PM's _prepare_service_launcher / _pm_managed_node_dirs / _systemd_command have no home in main's extraction) with main's utf-8-sig read. gateway_service_unit.py is dropped. - gateway/run.py: main's plugin-update chore is not profile-scoped (the housekeeping ordering test pins the scope/drain sequence). - pyproject + 30 test files: `import yaml` -> `import hermes_yaml as yaml` (pm-clean has no pyyaml); gateway/config._bundled_platform_manifest_name reads through hermes_yaml. - tests re-seamed onto pm-clean's shape: residency admission (installed_engine), supervisor child env (binary is a constructor argument), update import guard (update_cmd_deps is gone; our probe already scrubs PYTHONPATH — both #115032 invariants pass), shallow-count git responses (stash path asks `status --porcelain -z`); dropped tests for retired code (_run_node_bootstrap/_ensure_tui_node, Windows resume demotion). - tests/tools/test_local_env_blocklist.py: restore the two helpers the suite-reduction commit dropped and the blocklist import. Real fixes: - pm: classify_uv_failure/ResolutionConflict move beside the uv runner (pm.environment, stdlib-only). pm.workspace imports tomllib at module level and cannot load on the 3.10 bootstrap python that streams uv output in the Docker arm64 image. - tools/browser_tool.warm_agent_browser_npx_cache: back as a permanent definition — it is on the frozen old-updater surface, and the revert-scheduled compat pointer does not count. - hermes_cli/memory_setup: the dashboard's pip row uses pm.environments. running_from_selected_environment for installed vs restart_required. - scripts/windows-build-deps.ps1: export DISTUTILS_USE_SDK/MSSdk so setuptools trusts the primed MSVC environment instead of asking vswhere (`env -i` test runner on win32-arm64 compiling ruamel-yaml-clib); run_tests.sh forwards them. - tests/pm/test_windows_build_deps.py: start the protocol test from a parent env without the toolchain variables the runner job already exports. - tests/conftest.py scrubs HERMES_BUNDLED_PLUGINS (Nix-wrapped hermes on the dev host); tests/home_io_guard.py treats sys.path site-packages under the real home as the interpreter's installation (PM-activated developer shell). - tests-js: four `curly` lint errors from main's new scripts.
40 lines
1.6 KiB
Python
40 lines
1.6 KiB
Python
"""``save_config`` of the holographic provider writes config.yaml through the canonical writer.
|
|
|
|
The provider used to ``yaml.dump`` straight over config.yaml, bypassing the config lock, the
|
|
managed-mode refusal and the atomic replace. Two contracts pin the canonical path: unrelated
|
|
sections survive a provider save, and a managed install refuses the write.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import hermes_yaml as yaml
|
|
|
|
from plugins.memory.holographic import HolographicMemoryProvider
|
|
|
|
|
|
def _provider():
|
|
return HolographicMemoryProvider(config={})
|
|
|
|
|
|
def test_save_config_merges_into_existing_yaml(tmp_path, monkeypatch):
|
|
monkeypatch.setenv("HERMES_HOME", str(tmp_path))
|
|
(tmp_path / "config.yaml").write_text("model:\n default: keep-me\nmemory:\n provider: holographic\n")
|
|
|
|
_provider().save_config({"db_path": "custom.db", "hrr_dim": "512"}, str(tmp_path))
|
|
|
|
raw = yaml.safe_load((tmp_path / "config.yaml").read_text())
|
|
assert raw["plugins"]["hermes-memory-store"] == {"db_path": "custom.db", "hrr_dim": "512"}
|
|
assert raw["model"]["default"] == "keep-me"
|
|
assert raw["memory"]["provider"] == "holographic"
|
|
|
|
|
|
def test_save_config_respects_managed_mode(tmp_path, monkeypatch):
|
|
monkeypatch.setenv("HERMES_HOME", str(tmp_path))
|
|
before = "model:\n default: managed\n"
|
|
(tmp_path / "config.yaml").write_text(before)
|
|
monkeypatch.setattr("hermes_cli.config.is_managed", lambda: True)
|
|
monkeypatch.setattr("hermes_cli.config.managed_error", lambda *_a, **_k: None)
|
|
|
|
_provider().save_config({"db_path": "custom.db"}, str(tmp_path))
|
|
|
|
assert (tmp_path / "config.yaml").read_text() == before
|