From 25065283b3444d729df3d1ed13e0f811de2f1cb8 Mon Sep 17 00:00:00 2001 From: EmelyanenkoK Date: Sat, 2 May 2026 19:28:49 +0300 Subject: [PATCH] fix: improve telegram topic mode setup --- agent/title_generator.py | 14 +- .../telegram-botfather-threads-settings.jpg | Bin 0 -> 118213 bytes gateway/platforms/telegram.py | 23 ++ gateway/run.py | 288 ++++++++++++++++-- pyproject.toml | 1 + tests/agent/test_title_generator.py | 31 +- tests/gateway/test_telegram_topic_mode.py | 139 ++++++++- 7 files changed, 458 insertions(+), 38 deletions(-) create mode 100644 gateway/assets/telegram-botfather-threads-settings.jpg diff --git a/agent/title_generator.py b/agent/title_generator.py index 3f617093c0..a7f1e158e1 100644 --- a/agent/title_generator.py +++ b/agent/title_generator.py @@ -17,6 +17,7 @@ logger = logging.getLogger(__name__) # so silent-drops (e.g. OpenRouter 402 exhausting the fallback chain) # become visible instead of piling up as NULL session titles. FailureCallback = Callable[[str, BaseException], None] +TitleCallback = Callable[[str], None] _TITLE_PROMPT = ( "Generate a short, descriptive title (3-7 words) for a conversation that starts with the " @@ -90,6 +91,7 @@ def auto_title_session( assistant_response: str, failure_callback: Optional[FailureCallback] = None, main_runtime: dict = None, + title_callback: Optional[TitleCallback] = None, ) -> None: """Generate and set a session title if one doesn't already exist. @@ -119,6 +121,11 @@ def auto_title_session( try: session_db.set_session_title(session_id, title) logger.debug("Auto-generated session title: %s", title) + if title_callback is not None: + try: + title_callback(title) + except Exception: + logger.debug("Auto-title callback failed", exc_info=True) except Exception as e: logger.debug("Failed to set auto-generated title: %s", e) @@ -131,6 +138,7 @@ def maybe_auto_title( conversation_history: list, failure_callback: Optional[FailureCallback] = None, main_runtime: dict = None, + title_callback: Optional[TitleCallback] = None, ) -> None: """Fire-and-forget title generation after the first exchange. @@ -152,7 +160,11 @@ def maybe_auto_title( thread = threading.Thread( target=auto_title_session, args=(session_db, session_id, user_message, assistant_response), - kwargs={"failure_callback": failure_callback, "main_runtime": main_runtime}, + kwargs={ + "failure_callback": failure_callback, + "main_runtime": main_runtime, + "title_callback": title_callback, + }, daemon=True, name="auto-title", ) diff --git a/gateway/assets/telegram-botfather-threads-settings.jpg b/gateway/assets/telegram-botfather-threads-settings.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1de115acd45e3002e24da4d2c97ccb990472bec GIT binary patch literal 118213 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 None: + """Rename a forum topic in a private (DM) chat.""" + if not self._bot: + return + try: + chat_id_arg = int(chat_id) + except (TypeError, ValueError): + chat_id_arg = chat_id + await self._bot.edit_forum_topic( + chat_id=chat_id_arg, + message_thread_id=int(thread_id), + name=name, + ) + logger.info( + "[%s] Renamed DM topic in chat %s thread_id=%s -> '%s'", + self.name, chat_id, thread_id, name, + ) + def _persist_dm_topic_thread_id(self, chat_id: int, topic_name: str, thread_id: int) -> None: """Save a newly created thread_id back into config.yaml so it persists across restarts.""" try: diff --git a/gateway/run.py b/gateway/run.py index 40c4bdb453..6fd19472c2 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -1050,6 +1050,7 @@ class GatewayRunner: ) self.delivery_router = DeliveryRouter(self.config) self._running = False + self._gateway_loop: Optional[asyncio.AbstractEventLoop] = None self._shutdown_event = asyncio.Event() self._exit_cleanly = False self._exit_with_failure = False @@ -1493,17 +1494,19 @@ class GatewayRunner: def _telegram_topic_root_lobby_message(self) -> str: return ( "This main chat is reserved for system commands.\n\n" - "To chat with Hermes, create a new topic using the + button in " - "this bot interface. Each topic works as an independent Hermes " - "session." + "To start a new Hermes chat, open the All Messages topic at the top " + "of this bot interface and send any message there. Telegram will " + "create a new topic for that message; each topic works as an " + "independent Hermes session." ) def _telegram_topic_root_new_message(self) -> str: return ( - "To start a new parallel Hermes chat, create a new topic with the " - "+ button in this bot interface.\n\n" - "Each topic is an independent Hermes session. Use /new inside a " - "topic only if you want to replace that topic's current session." + "To start a new parallel Hermes chat, open the All Messages topic " + "at the top of this bot interface and send any message there. " + "Telegram will create a new topic for it.\n\n" + "Each topic is an independent Hermes session. Use /new inside an " + "existing topic only if you want to replace that topic's current session." ) def _telegram_topic_new_header(self, source: SessionSource) -> Optional[str]: @@ -1511,9 +1514,9 @@ class GatewayRunner: return None return ( "Started a new Hermes session in this topic.\n\n" - "Tip: for parallel work, create a new topic with the + button " - "instead of using /new here. /new replaces the session attached " - "to the current topic." + "Tip: for parallel work, open All Messages and send a message there " + "to create a separate topic instead of using /new here. /new replaces " + "the session attached to the current topic." ) def _record_telegram_topic_binding( @@ -2767,6 +2770,10 @@ class GatewayRunner: Returns True if at least one adapter connected successfully. """ logger.info("Starting Hermes Gateway...") + try: + self._gateway_loop = asyncio.get_running_loop() + except RuntimeError: + self._gateway_loop = None logger.info("Session storage: %s", self.config.sessions_dir) # Log the resolved max_iterations budget so operators can verify the # config.yaml → env bridge did the right thing at a glance (instead @@ -9569,7 +9576,193 @@ class GatewayRunner: logger.warning("Manual compress failed: %s", e) return f"Compression failed: {e}" - async def _handle_topic_command(self, event: MessageEvent) -> str: + async def _get_telegram_topic_capabilities(self, source: SessionSource) -> dict: + """Read Telegram private-topic capability flags via Bot API getMe.""" + adapter = self.adapters.get(source.platform) if getattr(self, "adapters", None) else None + bot = getattr(adapter, "_bot", None) + if bot is None or not hasattr(bot, "get_me"): + return {"checked": False} + try: + me = await bot.get_me() + except Exception: + logger.debug("Failed to fetch Telegram getMe topic capabilities", exc_info=True) + return {"checked": False} + + def _field(name: str): + if hasattr(me, name): + return getattr(me, name) + api_kwargs = getattr(me, "api_kwargs", None) + if isinstance(api_kwargs, dict) and name in api_kwargs: + return api_kwargs.get(name) + if isinstance(me, dict): + return me.get(name) + return None + + return { + "checked": True, + "has_topics_enabled": _field("has_topics_enabled"), + "allows_users_to_create_topics": _field("allows_users_to_create_topics"), + } + + async def _ensure_telegram_system_topic(self, source: SessionSource) -> None: + """Create/pin the managed System topic after /topic activation when possible.""" + adapter = self.adapters.get(source.platform) if getattr(self, "adapters", None) else None + if adapter is None or not source.chat_id: + return + + thread_id = None + create_topic = getattr(adapter, "_create_dm_topic", None) + if callable(create_topic): + try: + thread_id = await create_topic(int(source.chat_id), "System") + except Exception: + logger.debug("Failed to create Telegram System topic", exc_info=True) + if not thread_id: + return + + message_id = None + try: + send_result = await adapter.send( + source.chat_id, + "System topic for Hermes commands and status.", + metadata={"thread_id": str(thread_id)}, + ) + message_id = getattr(send_result, "message_id", None) + except Exception: + logger.debug("Failed to send Telegram System topic intro", exc_info=True) + if not message_id: + return + + bot = getattr(adapter, "_bot", None) + if bot is None or not hasattr(bot, "pin_chat_message"): + return + try: + await bot.pin_chat_message( + chat_id=int(source.chat_id), + message_id=int(message_id), + disable_notification=True, + ) + except Exception: + logger.debug("Failed to pin Telegram System topic intro", exc_info=True) + + async def _send_telegram_topic_setup_image(self, source: SessionSource) -> None: + """Send the bundled BotFather Threads Settings screenshot when available.""" + adapter = self.adapters.get(source.platform) if getattr(self, "adapters", None) else None + if adapter is None or not source.chat_id or not hasattr(adapter, "send_image_file"): + return + image_path = Path(__file__).resolve().parent / "assets" / "telegram-botfather-threads-settings.jpg" + if not image_path.exists(): + return + try: + await adapter.send_image_file( + chat_id=source.chat_id, + image_path=str(image_path), + caption="BotFather → Bot Settings → Threads Settings", + metadata={"thread_id": str(source.thread_id)} if source.thread_id else None, + ) + except Exception: + logger.debug("Failed to send Telegram topic setup image", exc_info=True) + + def _sanitize_telegram_topic_title(self, title: str) -> str: + """Return a Bot API-safe forum topic name from a generated session title.""" + cleaned = re.sub(r"\s+", " ", str(title or "")).strip() + if not cleaned: + return "Hermes Chat" + # Telegram forum topic names are short (currently 1-128 chars). Keep + # extra room for multi-byte titles and avoid trailing ellipsis churn. + if len(cleaned) > 120: + cleaned = cleaned[:117].rstrip() + "..." + return cleaned + + async def _rename_telegram_topic_for_session_title( + self, + source: SessionSource, + session_id: str, + title: str, + ) -> None: + """Best-effort rename of a Telegram DM topic when Hermes auto-titles a session.""" + if not self._is_telegram_topic_lane(source) or not source.chat_id or not source.thread_id: + return + session_db = getattr(self, "_session_db", None) + if session_db is not None: + try: + binding = session_db.get_telegram_topic_binding( + chat_id=str(source.chat_id), + thread_id=str(source.thread_id), + ) + if binding and str(binding.get("session_id") or "") != str(session_id): + return + except Exception: + logger.debug("Failed to verify Telegram topic binding before rename", exc_info=True) + return + + adapter = self.adapters.get(source.platform) if getattr(self, "adapters", None) else None + if adapter is None: + return + topic_name = self._sanitize_telegram_topic_title(title) + try: + rename_topic = getattr(adapter, "rename_dm_topic", None) + if rename_topic is not None: + await rename_topic( + chat_id=str(source.chat_id), + thread_id=str(source.thread_id), + name=topic_name, + ) + return + + bot = getattr(adapter, "_bot", None) + edit_forum_topic = getattr(bot, "edit_forum_topic", None) if bot is not None else None + if edit_forum_topic is None: + edit_forum_topic = getattr(bot, "editForumTopic", None) if bot is not None else None + if edit_forum_topic is None: + return + try: + await edit_forum_topic( + chat_id=int(source.chat_id), + message_thread_id=int(source.thread_id), + name=topic_name, + ) + except (TypeError, ValueError): + await edit_forum_topic( + chat_id=source.chat_id, + message_thread_id=source.thread_id, + name=topic_name, + ) + except Exception: + logger.debug("Failed to rename Telegram topic for auto-generated title", exc_info=True) + + def _schedule_telegram_topic_title_rename( + self, + source: SessionSource, + session_id: str, + title: str, + ) -> None: + """Schedule a topic rename from the auto-title background thread.""" + if not title or not self._is_telegram_topic_lane(source): + return + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = getattr(self, "_gateway_loop", None) + if loop is None or loop.is_closed(): + return + try: + copied_source = dataclasses.replace(source) + except Exception: + copied_source = source + future = asyncio.run_coroutine_threadsafe( + self._rename_telegram_topic_for_session_title(copied_source, session_id, title), + loop, + ) + def _log_rename_failure(fut) -> None: + try: + fut.result() + except Exception: + logger.debug("Telegram topic title rename failed", exc_info=True) + + future.add_done_callback(_log_rename_failure) + + async def _handle_topic_command(self, event: MessageEvent, args: str = "") -> str: """Handle /topic for Telegram DM user-managed topic sessions.""" source = event.source if source.platform != Platform.TELEGRAM or source.chat_type != "dm": @@ -9581,20 +9774,48 @@ class GatewayRunner: if args: if not source.thread_id: return ( - "To restore a session, first create or open a Telegram topic " - "with the + button, then send /topic inside that topic." + "To restore a session, first create or open a Telegram topic, " + "then send /topic inside that topic. To create a " + "new topic, open All Messages and send any message there." ) return await self._restore_telegram_topic_session(event, args) + capabilities = await self._get_telegram_topic_capabilities(source) + if capabilities.get("checked"): + if capabilities.get("has_topics_enabled") is False: + await self._send_telegram_topic_setup_image(source) + return ( + "Telegram topics are not enabled for this bot yet.\n\n" + "How to enable them:\n" + "1. Open @BotFather.\n" + "2. Choose your bot.\n" + "3. Open Bot Settings → Threads Settings.\n" + "4. Turn on Threaded Mode and make sure users are allowed to create new threads.\n\n" + "Then send /topic again." + ) + if capabilities.get("allows_users_to_create_topics") is False: + await self._send_telegram_topic_setup_image(source) + return ( + "Telegram topics are enabled, but users are not allowed to create topics.\n\n" + "Open @BotFather → choose your bot → Bot Settings → Threads Settings, " + "then turn off 'Disallow users to create new threads'.\n\n" + "Then send /topic again." + ) + try: self._session_db.enable_telegram_topic_mode( chat_id=str(source.chat_id), user_id=str(source.user_id), + has_topics_enabled=capabilities.get("has_topics_enabled"), + allows_users_to_create_topics=capabilities.get("allows_users_to_create_topics"), ) except Exception as exc: logger.exception("Failed to enable Telegram topic mode") return f"Failed to enable Telegram topic mode: {exc}" + if not source.thread_id: + await self._ensure_telegram_system_topic(source) + if source.thread_id: try: binding = self._session_db.get_telegram_topic_binding( @@ -9617,13 +9838,14 @@ class GatewayRunner: f"Session: {session_label}\n" f"ID: {session_id}\n\n" "Use /new to replace this topic with a fresh session.\n" - "For parallel work, create another topic with the + button." + "For parallel work, open All Messages and send a message there " + "to create another topic." ) return ( "Telegram multi-session topics are enabled.\n\n" "This topic will be used as an independent Hermes session. " "Use /new to replace this topic's current session. For parallel " - "work, create another topic with the + button." + "work, open All Messages and send a message there to create another topic." ) return self._telegram_topic_root_status_message(source) @@ -9632,7 +9854,9 @@ class GatewayRunner: lines = [ "Telegram multi-session topics are enabled.", "", - "Create new Hermes chats with the + button in this bot interface.", + "To create a new Hermes chat, open All Messages at the top of this " + "bot interface and send any message there. Telegram will create a " + "new topic for it.", "", ] try: @@ -9658,7 +9882,7 @@ class GatewayRunner: lines.extend([ "", "To restore one:", - "1. Create or open a topic with the + button.", + "1. Create or open a topic. To create a new one, open All Messages and send any message there.", "2. Send /topic inside that topic.", f"Example: Send /topic {sessions[0].get('id')} inside a topic.", ]) @@ -9667,9 +9891,8 @@ class GatewayRunner: "No previous unlinked Telegram sessions found.", "", "To restore a previous session later:", - "1. Create a new topic with the + button.", - "2. Open that topic.", - "3. Send /topic .", + "1. Create or open a topic. To create a new one, open All Messages and send any message there.", + "2. Send /topic inside that topic.", ]) return "\n".join(lines) @@ -13549,20 +13772,29 @@ class GatewayRunner: _title_failure_cb = getattr( agent, "_emit_auxiliary_failure", None ) - maybe_auto_title( - self._session_db, - effective_session_id, - message, - final_response, - all_msgs, - failure_callback=_title_failure_cb, - main_runtime={ + maybe_auto_title_kwargs = { + "failure_callback": _title_failure_cb, + "main_runtime": { "model": getattr(agent, "model", None), "provider": getattr(agent, "provider", None), "base_url": getattr(agent, "base_url", None), "api_key": getattr(agent, "api_key", None), "api_mode": getattr(agent, "api_mode", None), } if agent else None, + } + if self._is_telegram_topic_lane(source): + maybe_auto_title_kwargs["title_callback"] = lambda title: self._schedule_telegram_topic_title_rename( + source, + effective_session_id, + title, + ) + maybe_auto_title( + self._session_db, + effective_session_id, + message, + final_response, + all_msgs, + **maybe_auto_title_kwargs, ) except Exception: pass diff --git a/pyproject.toml b/pyproject.toml index a58e172795..b5de3d69f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -139,6 +139,7 @@ py-modules = ["run_agent", "model_tools", "toolsets", "batch_runner", "trajector [tool.setuptools.package-data] hermes_cli = ["web_dist/**/*"] +gateway = ["assets/**/*"] [tool.setuptools.packages.find] include = ["agent", "agent.*", "tools", "tools.*", "hermes_cli", "gateway", "gateway.*", "tui_gateway", "tui_gateway.*", "cron", "acp_adapter", "plugins", "plugins.*"] diff --git a/tests/agent/test_title_generator.py b/tests/agent/test_title_generator.py index e10cba76a8..c498a71ab5 100644 --- a/tests/agent/test_title_generator.py +++ b/tests/agent/test_title_generator.py @@ -136,6 +136,21 @@ class TestAutoTitleSession: auto_title_session(db, "sess-1", "hi", "hello") db.set_session_title.assert_called_once_with("sess-1", "New Title") + def test_invokes_title_callback_after_setting_title(self): + db = MagicMock() + db.get_session_title.return_value = None + seen = [] + with patch("agent.title_generator.generate_title", return_value="Readable Session"): + auto_title_session( + db, + "sess-1", + "hello", + "hi there", + title_callback=seen.append, + ) + db.set_session_title.assert_called_once_with("sess-1", "Readable Session") + assert seen == ["Readable Session"] + def test_skips_if_generation_fails(self): db = MagicMock() db.get_session_title.return_value = None @@ -182,7 +197,13 @@ class TestMaybeAutoTitle: import time time.sleep(0.3) mock_auto.assert_called_once_with( - db, "sess-1", "hello", "hi there", failure_callback=None, main_runtime=None + db, + "sess-1", + "hello", + "hi there", + failure_callback=None, + main_runtime=None, + title_callback=None, ) def test_forwards_failure_callback_to_worker(self): @@ -202,7 +223,13 @@ class TestMaybeAutoTitle: import time time.sleep(0.3) mock_auto.assert_called_once_with( - db, "sess-1", "hello", "hi there", failure_callback=_cb, main_runtime=None + db, + "sess-1", + "hello", + "hi there", + failure_callback=_cb, + main_runtime=None, + title_callback=None, ) def test_skips_if_no_response(self): diff --git a/tests/gateway/test_telegram_topic_mode.py b/tests/gateway/test_telegram_topic_mode.py index ad72514ed5..a797b52352 100644 --- a/tests/gateway/test_telegram_topic_mode.py +++ b/tests/gateway/test_telegram_topic_mode.py @@ -63,6 +63,10 @@ def _make_runner(session_db=None): ) adapter = MagicMock() adapter.send = AsyncMock() + adapter.send_image_file = AsyncMock() + adapter._bot = None + adapter._create_dm_topic = AsyncMock(return_value=None) + adapter.rename_dm_topic = AsyncMock() runner.adapters = {Platform.TELEGRAM: adapter} runner._voice_mode = {} runner.hooks = SimpleNamespace( @@ -150,7 +154,7 @@ async def test_root_telegram_dm_prompt_is_system_lobby_when_topic_mode_enabled(m result = await runner._handle_message(_make_event("hello from root")) assert "main chat is reserved for system commands" in result - assert "+ button" in result + assert "All Messages" in result runner._run_agent.assert_not_called() runner.session_store.get_or_create_session.assert_not_called() @@ -172,8 +176,8 @@ async def test_root_telegram_dm_new_shows_create_topic_instruction(monkeypatch): result = await runner._handle_message(_make_event("/new")) assert "create a new topic" in result - assert "+ button" in result - assert "Use /new inside a topic" in result + assert "All Messages" in result + assert "Use /new inside" in result runner._run_agent.assert_not_called() runner.session_store.reset_session.assert_not_called() runner.session_store.get_or_create_session.assert_not_called() @@ -357,8 +361,8 @@ async def test_new_inside_telegram_topic_resets_current_topic_with_parallel_tip( result = await runner._handle_message(_make_event("/new", thread_id="17585")) assert "Started a new Hermes session in this topic" in result - assert "for parallel work" in result - assert "+ button" in result + assert "parallel work" in result + assert "All Messages" in result runner.session_store.reset_session.assert_called_once_with(topic_key) @@ -379,7 +383,7 @@ async def test_topic_root_command_explicitly_migrates_and_enables_topic_mode(tmp result = await runner._handle_message(_make_event("/topic")) assert "Telegram multi-session topics are enabled" in result - assert "+ button" in result + assert "All Messages" in result assert session_db.get_meta("telegram_dm_topic_schema_version") == "1" assert session_db.is_telegram_topic_mode_enabled(chat_id="208214988", user_id="208214988") assert runner._telegram_topic_mode_enabled(_make_source()) is True @@ -462,7 +466,7 @@ async def test_topic_root_command_handles_no_unlinked_sessions(tmp_path, monkeyp assert "Telegram multi-session topics are enabled" in result assert "No previous unlinked Telegram sessions found" in result - assert "+ button" in result + assert "All Messages" in result runner._run_agent.assert_not_called() @@ -623,3 +627,124 @@ async def test_first_message_inside_topic_records_topic_binding(tmp_path, monkey assert binding["user_id"] == "208214988" assert binding["session_id"] == "sess-topic" assert binding["session_key"] == build_session_key(_make_source(thread_id="17585")) + + +@pytest.mark.asyncio +async def test_topic_root_command_checks_getme_capabilities_before_enabling(tmp_path, monkeypatch): + import gateway.run as gateway_run + + session_db = SessionDB(db_path=tmp_path / "state.db") + runner = _make_runner(session_db=session_db) + bot = AsyncMock() + bot.get_me.return_value = SimpleNamespace( + has_topics_enabled=False, + allows_users_to_create_topics=True, + ) + runner.adapters[Platform.TELEGRAM]._bot = bot + runner._run_agent = AsyncMock( + side_effect=AssertionError("/topic capability failure must not enter the agent loop") + ) + + monkeypatch.setattr( + gateway_run, "_resolve_runtime_agent_kwargs", lambda: {"api_key": "***"} + ) + + result = await runner._handle_message(_make_event("/topic")) + + assert "topics are not enabled" in result + assert "Open @BotFather" in result + assert session_db.is_telegram_topic_mode_enabled(chat_id="208214988", user_id="208214988") is False + bot.get_me.assert_awaited_once() + runner.adapters[Platform.TELEGRAM].send_image_file.assert_awaited_once() + image_kwargs = runner.adapters[Platform.TELEGRAM].send_image_file.await_args.kwargs + assert image_kwargs["chat_id"] == "208214988" + assert image_kwargs["image_path"].endswith("telegram-botfather-threads-settings.jpg") + runner._run_agent.assert_not_called() + + +@pytest.mark.asyncio +async def test_topic_root_command_creates_and_pins_system_topic(tmp_path, monkeypatch): + import gateway.run as gateway_run + + session_db = SessionDB(db_path=tmp_path / "state.db") + runner = _make_runner(session_db=session_db) + adapter = runner.adapters[Platform.TELEGRAM] + adapter._create_dm_topic.return_value = 4242 + adapter.send.return_value = SimpleNamespace(success=True, message_id="777") + bot = AsyncMock() + bot.get_me.return_value = { + "has_topics_enabled": True, + "allows_users_to_create_topics": True, + } + adapter._bot = bot + + monkeypatch.setattr( + gateway_run, "_resolve_runtime_agent_kwargs", lambda: {"api_key": "***"} + ) + + result = await runner._handle_message(_make_event("/topic")) + + assert "Telegram multi-session topics are enabled" in result + adapter._create_dm_topic.assert_awaited_once_with(208214988, "System") + adapter.send.assert_awaited_once_with( + "208214988", + "System topic for Hermes commands and status.", + metadata={"thread_id": "4242"}, + ) + bot.pin_chat_message.assert_awaited_once_with( + chat_id=208214988, + message_id=777, + disable_notification=True, + ) + + +@pytest.mark.asyncio +async def test_auto_generated_title_renames_bound_telegram_topic(tmp_path): + db = SessionDB(db_path=tmp_path / "state.db") + db.apply_telegram_topic_migration() + db.create_session("sess-topic", source="telegram", user_id="208214988") + db.bind_telegram_topic( + chat_id="208214988", + thread_id="42", + user_id="208214988", + session_key="agent:main:telegram:dm:208214988:42", + session_id="sess-topic", + ) + runner = _make_runner(session_db=db) + runner._telegram_topic_mode_enabled = lambda source: True + + await runner._rename_telegram_topic_for_session_title( + _make_source(thread_id="42"), + "sess-topic", + " Build Telegram Topic UX ", + ) + + runner.adapters[Platform.TELEGRAM].rename_dm_topic.assert_awaited_once_with( + chat_id="208214988", + thread_id="42", + name="Build Telegram Topic UX", + ) + + +@pytest.mark.asyncio +async def test_auto_generated_title_does_not_rename_topic_bound_to_other_session(tmp_path): + db = SessionDB(db_path=tmp_path / "state.db") + db.apply_telegram_topic_migration() + db.create_session("sess-other", source="telegram", user_id="208214988") + db.bind_telegram_topic( + chat_id="208214988", + thread_id="42", + user_id="208214988", + session_key="agent:main:telegram:dm:208214988:42", + session_id="sess-other", + ) + runner = _make_runner(session_db=db) + runner._telegram_topic_mode_enabled = lambda source: True + + await runner._rename_telegram_topic_for_session_title( + _make_source(thread_id="42"), + "sess-topic", + "Wrong Session Title", + ) + + runner.adapters[Platform.TELEGRAM].rename_dm_topic.assert_not_called()