mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-29 18:46:59 +00:00
The Photon iMessage sidecar needs node_modules under plugins/platforms/photon/sidecar/, but hosted/managed images keep the whole install tree under an immutable /opt/hermes — every install and self-heal path (setup CLI, stale-deps reinstall, cold install) died on EROFS, and hosted users have no shell to work around it. Three-layer fix, mirroring the WhatsApp bridge resolver pattern: 1. Bake the deps into the image. The Dockerfile now runs npm ci for the sidecar in the layer-cached dependency stage (deterministic installs from the committed lockfile; the postinstall spectrum-ts patch runs at build time). Hosted happy path needs no runtime install at all. 2. New sidecar_paths.resolve_sidecar_dir() decides where the sidecar runs from: PHOTON_SIDECAR_DIR override > writable source dir (dev installs, unchanged) > read-only dir with baked fresh deps (managed image) > mirror to $HERMES_HOME/photon/sidecar (writable data volume) when deps are missing or stale in a read-only tree. The mirror refreshes changed source files on image updates while keeping node_modules, so the existing lockfile-staleness self-heal works there. 3. connect() can now cold-install: _start_sidecar() runs the bounded npm ci bootstrap when node_modules is missing instead of raising immediately, and check_requirements() reports available when a self-install is possible (npm present + writable resolved dir) so the gateway actually creates the adapter on hosted instances. A failed bootstrap still raises the actionable error, which connect() surfaces as the retryable SIDECAR_FAILED fatal state on the dashboard. Tests: resolver decision table (env override, in-place, mirror, refresh, fail-open), cold-install lifecycle paths, and a Dockerfile contract test guarding the baked-deps + no-chown invariants. Fixes NS-606. |
||
|---|---|---|
| .. | ||
| test_auth.py | ||
| test_check_requirements_risks.py | ||
| test_fatal_notify_self_cancel.py | ||
| test_inbound.py | ||
| test_markdown.py | ||
| test_mention_gating.py | ||
| test_npm_error_log_regression.py | ||
| test_outbound_media.py | ||
| test_overflow_recovery.py | ||
| test_poll_clarify.py | ||
| test_presence_watchdog.py | ||
| test_reactions.py | ||
| test_rich_links.py | ||
| test_runtime_record.py | ||
| test_setup_access.py | ||
| test_sidecar_deps_stale.py | ||
| test_sidecar_lifecycle.py | ||
| test_sidecar_paths.py | ||
| test_spectrum_patch.py | ||
| test_streaming.py | ||
| test_url_send_path.py | ||
| test_zombie_stream_watchdog.py | ||