Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions plugins/memory/honcho/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import json
import os
import logging
import hashlib
import re
from dataclasses import dataclass, field
from pathlib import Path

Expand All @@ -29,6 +31,7 @@

GLOBAL_CONFIG_PATH = Path.home() / ".honcho" / "config.json"
HOST = "hermes"
HONCHO_SESSION_ID_MAX_LENGTH = 100


def resolve_active_host() -> str:
Expand Down Expand Up @@ -75,6 +78,23 @@ def resolve_config_path() -> Path:
return GLOBAL_CONFIG_PATH


def _sanitize_honcho_session_id(value: str, *, max_length: int = HONCHO_SESSION_ID_MAX_LENGTH) -> str:
"""Return a Honcho-safe session id, truncating long values deterministically."""
sanitized = re.sub(r'[^a-zA-Z0-9_-]+', '-', value).strip('-')
if len(sanitized) <= max_length:
return sanitized

digest = hashlib.sha256(sanitized.encode("utf-8")).hexdigest()[:12]
prefix_len = max_length - len(digest) - 1
if prefix_len <= 0:
return digest[:max_length]

prefix = sanitized[:prefix_len].rstrip("-")
if not prefix:
return digest[:max_length]
return f"{prefix}-{digest}"


_RECALL_MODE_ALIASES = {"auto": "hybrid"}
_VALID_RECALL_MODES = {"hybrid", "context", "tools"}

Expand Down Expand Up @@ -540,8 +560,6 @@ def resolve_session_name(
6. per-directory strategy — directory basename
7. global strategy — workspace name
"""
import re

if not cwd:
cwd = os.getcwd()

Expand All @@ -564,7 +582,7 @@ def resolve_session_name(
# based resolution because gateway platforms need per-chat isolation that
# cwd-based strategies cannot provide.
if gateway_session_key:
sanitized = re.sub(r'[^a-zA-Z0-9_-]+', '-', gateway_session_key).strip('-')
sanitized = _sanitize_honcho_session_id(gateway_session_key)
if sanitized:
return sanitized

Expand Down
18 changes: 18 additions & 0 deletions tests/honcho_plugin/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import pytest

from plugins.memory.honcho.client import (
HONCHO_SESSION_ID_MAX_LENGTH,
HonchoClientConfig,
get_honcho_client,
reset_honcho_client,
Expand Down Expand Up @@ -655,6 +656,23 @@ def test_gateway_key_sanitizes_special_chars(self):
assert result == "agent-main-telegram-dm-8439114563"
assert ":" not in result

def test_gateway_key_truncates_to_honcho_limit_deterministically(self):
"""Long gateway keys should stay stable while respecting Honcho's 100-char cap."""
config = HonchoClientConfig()
gateway_key = (
"agent:main:matrix:group:!"
+ ("r" * 18)
+ ":very-long-homeserver-name.example.ts.net:"
+ ("e" * 43)
)

first = config.resolve_session_name(gateway_session_key=gateway_key)
second = config.resolve_session_name(gateway_session_key=gateway_key)

assert first == second
assert len(first) <= HONCHO_SESSION_ID_MAX_LENGTH
assert first.startswith("agent-main-matrix-group")


class TestResetHonchoClient:
def test_reset_clears_singleton(self):
Expand Down
Loading