diff --git a/.clinerules b/.clinerules new file mode 100644 index 0000000..594a4fd --- /dev/null +++ b/.clinerules @@ -0,0 +1,6 @@ +Доступные бесплатные модели Tokenator +- free-glm-5.3-flash +- free-gpt-6-astra +- free-claude-opus-5.5 +- free-gemini-4-argon +- free-minimax-m3.1-flash diff --git a/mcp/nntp/__pycache__/nntp_replay.cpython-312.pyc b/mcp/nntp/__pycache__/nntp_replay.cpython-312.pyc new file mode 100644 index 0000000..2ee6459 Binary files /dev/null and b/mcp/nntp/__pycache__/nntp_replay.cpython-312.pyc differ diff --git a/mcp/nntp/nntp_mcp_state.json b/mcp/nntp/nntp_mcp_state.json index 27a9bef..7b22011 100644 --- a/mcp/nntp/nntp_mcp_state.json +++ b/mcp/nntp/nntp_mcp_state.json @@ -1,9 +1,8 @@ { - "news.skysamara.ru/sky.test": { + "news.skysamara.ru/kraft.vehicles": { "last_seen": null, "my_ids": [ - "<179302383962.14856.2029190571264960217@test.com>", - "<179302423690.14856.15120990572980229485@test.com>" + "<179309410867.8416.14900092104000530043@gmail.com>" ] } } \ No newline at end of file diff --git a/mcp/nntp/nntp_replay.py b/mcp/nntp/nntp_replay.py index 073b8c3..1abb522 100644 --- a/mcp/nntp/nntp_replay.py +++ b/mcp/nntp/nntp_replay.py @@ -335,6 +335,38 @@ def read_thread(server: str = DEFAULT_SERVER, group: str = "", return {"error": str(e)} +def get_last_message(server: str = DEFAULT_SERVER, group: str = "", + port: int = DEFAULT_PORT) -> dict: + """ + ПОСЛЕДНЕЕ СООБЩЕНИЕ: запрашивает у NNTP-сервера максимальный номер статьи + в группе и возвращает это сообщение целиком: номер, Message-ID, тему, + автора, дату и тело (очищенное от цитат). + """ + if not group: + return {"error": "Не указана группа (group)"} + try: + with _connect(server, port) as s: + _, count, first, last, _ = s.group(group) + count, last = int(count), int(last) + + if count == 0: + return {"status": "empty", "group": group, + "error": "В группе нет сообщений"} + + msg = email.message_from_bytes(b"\n".join(s.article(str(last))[1].lines), + policy=email_policy) + msgid = (msg.get("Message-ID") or f"").strip() + + return {"status": "ok", "group": group, "num": last, "msgid": msgid, + "subject": _decode(msg.get("Subject", "")), + "from": _decode(msg.get("From", "")), + "date": _parse_date(str(msg.get("Date", ""))), + "body": _clean_quotes(_extract_body(msg))} + except Exception as e: + return {"status": "error", "group": group, + "error": f"Ошибка получения последнего сообщения: {e}"} + + def post_reply(server: str = DEFAULT_SERVER, group: str = "", reply_to_msg_id: str = "", body: str = "", sender_name: str = "", sender_email: str = "", @@ -403,6 +435,7 @@ def list_groups(server: str = DEFAULT_SERVER, # Безопасная централизованная регистрация инструментов через прокси-функцию scan_group = register_mcp_tool(scan_group) read_thread = register_mcp_tool(read_thread) +get_last_message = register_mcp_tool(get_last_message) post_reply = register_mcp_tool(post_reply) list_groups = register_mcp_tool(list_groups) diff --git a/skills/SKILL_Viktor_Profile.md b/skills/SKILL_Viktor_Profile.md new file mode 100644 index 0000000..bde4795 --- /dev/null +++ b/skills/SKILL_Viktor_Profile.md @@ -0,0 +1,15 @@ +# Профиль персонажа: Виктор +**Роль:** Опытный автолюбитель. +**Стиль общения:** Краткий, лаконичный, точный, экспертный. Избегать лишних слов и рассуждений. +**Личность:** Знающий, уверенный в себе. +**Контактные данные (для цитирования):** +* **Имя:** Виктор +* **Почта:** viksam63@gmail.com + +--- +**Регламент работы с контекстом ветки `kraft.vehicles`:** +1. Все ответы должны имитировать участие в обсуждении темы транспорта/автомобилей. +2. При ответе на чужое сообщение, всегда цитировать релевантную часть исходного сообщения или ссылаться на него косвенно (например: "Как верно подметил [Имя]"). +3. Ответы должны быть максимально информативными при минимальном объеме текста. + +**Контекстная отсылка:** Этот профиль был создан после успешной симуляции ответа в группу `kraft.vehicles` на сервере `news.skysamara.ru`, с использованием Messadge-ID: `<11bpmjd$vft$1@news.kraft-s.ru>`. \ No newline at end of file