hermes-agent/tests/honcho_plugin
Teknium 47d5177a7d
fix(plugins): thread-safe lazy-singleton helpers; fix honcho TOCTOU (#24759) (#42150)
* fix(plugins): add thread-safe lazy-singleton helpers, fix honcho TOCTOU (#24759)

get_honcho_client() and fal's _load_fal_client() used unlocked
check-then-init: racing threads both ran the expensive build and the
loser's client (open connection) leaked.

Rather than one-off locks, add plugins/plugin_utils.py with two
reusable primitives every plugin author can drop in:
- lazy_singleton: decorator for zero-arg accessors
- SingletonSlot: manual slot for config-keyed accessors (first wins)

Both use double-checked locking; factory runs at most once; failed
builds aren't cached. honcho is the reference consumer; fal's sibling
TOCTOU gets a matching double-checked lock. Plugin dev guide documents
the pattern so future plugins don't reintroduce the race.

Closes #24759

* test(honcho): update reset test for SingletonSlot internals

test_reset_clears_singleton poked the removed _honcho_client module
global directly. Assert through the slot's public peek() surface
instead, matching the #24759 refactor.
2026-06-08 09:35:22 -07:00
..
__init__.py feat(memory): pluggable memory provider interface with profile isolation, review fixes, and honcho CLI restoration (#4623) 2026-04-02 15:33:51 -07:00
test_async_memory.py fix(setup): write config for image_gen and video_gen in apply_nous_managed_defaults (#35109) 2026-05-30 03:45:12 +00:00
test_cli.py fix(honcho): harden self-hosted setup paths 2026-05-29 22:29:48 -07:00
test_client.py fix(plugins): thread-safe lazy-singleton helpers; fix honcho TOCTOU (#24759) (#42150) 2026-06-08 09:35:22 -07:00
test_empty_profile_hint.py feat(honcho): explain why when honcho_profile returns an empty card 2026-04-27 12:37:33 -07:00
test_pin_peer_name.py fix(honcho): harden self-hosted setup paths 2026-05-29 22:29:48 -07:00
test_session.py test(honcho): de-flake prewarm smoke test's thread wait (#37614) 2026-06-02 17:00:04 -07:00