diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2b53e7419b8c6091fb36d89215b79cbdc81b7d4e..06392654fae2debd92fddbb4d00e01c658bd4f0a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -8,25 +8,27 @@ on: jobs: deploy: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v3 - - - name: Setup Python + + - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - - name: Install MkDocs and theme + - name: Install dependencies run: pip install mkdocs mkdocs-material - - name: Build MkDocs site + - name: Build site run: mkdocs build + - name: Copy HTML files from bot to site root + run: cp bot/*.html site/ + - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.PAT_TOKEN }} publish_dir: ./site - force_orphan: true # опционально, чтобы гарантированно перезаписать ветку + force_orphan: true diff --git a/hf_repo/bot/google6249b7c75201aa31.html b/hf_repo/bot/google6249b7c75201aa31.html new file mode 100644 index 0000000000000000000000000000000000000000..ad50d4f3c736fa22807dd9133f88043479922c86 --- /dev/null +++ b/hf_repo/bot/google6249b7c75201aa31.html @@ -0,0 +1 @@ +google-site-verification: google6249b7c75201aa31.html \ No newline at end of file diff --git a/hf_repo/bot/yandex_74bc5688520d61a7.html b/hf_repo/bot/yandex_74bc5688520d61a7.html new file mode 100644 index 0000000000000000000000000000000000000000..2437a7920f6add0b03a085259c92843f51266e3d --- /dev/null +++ b/hf_repo/bot/yandex_74bc5688520d61a7.html @@ -0,0 +1,6 @@ + +
+ + + Verification: 74bc5688520d61a7 + \ No newline at end of file diff --git a/hf_repo/hf_repo/README.md b/hf_repo/hf_repo/README.md index 5c77610078055c67cf4ed804d735faf483393200..1ab8d5670696297b7ba5853dd1ad2d9fe3988873 100644 --- a/hf_repo/hf_repo/README.md +++ b/hf_repo/hf_repo/README.md @@ -282,6 +282,10 @@ To get started, see [`iteration.md`](iteration.md) or open an issue. - 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP) - 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP) +## Документация + +- 📄 Официальная документация: [https://kagvi13.github.io/HMP/](https://kagvi13.github.io/HMP/) + ## Блог и публикации - 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/) diff --git a/hf_repo/hf_repo/hf_repo/docs/index.md b/hf_repo/hf_repo/hf_repo/docs/index.md index c045625d67d3bab623244cbc5b2230d6c653cb07..08840906e6783a25f47c8f168cc72755bebe09e2 100644 --- a/hf_repo/hf_repo/hf_repo/docs/index.md +++ b/hf_repo/hf_repo/hf_repo/docs/index.md @@ -24,21 +24,21 @@ ## Архитектура и API -- [HMP-Agent-API.md](HMP-Agent-API.md) — 🧠 HMP-Agent API спецификация -- [HMP-Agent-Architecture.md](HMP-Agent-Architecture.md) — 🧠 Архитектура HMP-Агента -- [HMP-agent-Cognitive_Family.md](HMP-agent-Cognitive_Family.md) — 👪 Модель когнитивной семьи +- [HMP-Agent-API.md](HMP-Agent-API.md) — HMP-Agent API спецификация +- [HMP-Agent-Architecture.md](HMP-Agent-Architecture.md) — Архитектура HMP-Агента +- [HMP-agent-Cognitive_Family.md](HMP-agent-Cognitive_Family.md) — Модель когнитивной семьи - [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) — Протокол синхронизации доверенных ядер - [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) — Лёгкая версия с общей БД -- [HMP-Agent-Network-Flow.md](HMP-Agent-Network-Flow.md) — 🔄 Сетевой поток HMP-агента -- [HMP-Agent-Overview.md](HMP-Agent-Overview.md) — ⚙️ Два типа HMP-агентов -- [HMP-agent-REPL-cycle.md](HMP-agent-REPL-cycle.md) — 🧠 REPL-цикл взаимодействия +- [HMP-Agent-Network-Flow.md](HMP-Agent-Network-Flow.md) — Сетевой поток HMP-агента +- [HMP-Agent-Overview.md](HMP-Agent-Overview.md) — Два типа HMP-агентов +- [HMP-agent-REPL-cycle.md](HMP-agent-REPL-cycle.md) — REPL-цикл взаимодействия --- ## Базовая архитектура и контейнеры -- [Basic-agent-sim.md](Basic-agent-sim.md) — ⚙️ Базовая архитектура HMP-Агента (Формат 0) -- [container_agents.md](container_agents.md) — 🧱 Агенты-контейнеры (Container Agents) в HMP +- [Basic-agent-sim.md](Basic-agent-sim.md) — Базовая архитектура HMP-Агента (Формат 0) +- [container_agents.md](container_agents.md) — Агенты-контейнеры (Container Agents) в HMP --- diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/docs/index.md b/hf_repo/hf_repo/hf_repo/hf_repo/docs/index.md new file mode 100644 index 0000000000000000000000000000000000000000..c045625d67d3bab623244cbc5b2230d6c653cb07 --- /dev/null +++ b/hf_repo/hf_repo/hf_repo/hf_repo/docs/index.md @@ -0,0 +1,69 @@ +# HMP Documentation + +Добро пожаловать в документацию по проекту **HyperCortex Mesh Protocol (HMP)** — протоколу и архитектуре распределённых когнитивных агентов. + +--- + +## Протоколы HMP + +- [HMP-0001.md](HMP-0001.md) — Протокол HMP версии 1 +- [HMP-0002.md](HMP-0002.md) — Протокол HMP версии 2 +- [HMP-0003.md](HMP-0003.md) — Протокол HMP версии 3 +- [HMP-0004.md](HMP-0004.md) — Протокол HMP версии 4 +- [HMP-0004-v4.1.md](HMP-0004-v4.1.md) — Протокол HMP версии 4.1 +- [HMP-Ethics.md](HMP-Ethics.md) — Этические сценарии для HMP + +--- + +## Специализированные агенты + +- [Enlightener.md](Enlightener.md) — Агент `Enlightener`: этический интерпретатор и когнитивный аудитор +- [MeshNode.md](MeshNode.md) — Агент `MeshNode`: сетевая инфраструктура, маршрутизация и DHT + +--- + +## Архитектура и API + +- [HMP-Agent-API.md](HMP-Agent-API.md) — 🧠 HMP-Agent API спецификация +- [HMP-Agent-Architecture.md](HMP-Agent-Architecture.md) — 🧠 Архитектура HMP-Агента +- [HMP-agent-Cognitive_Family.md](HMP-agent-Cognitive_Family.md) — 👪 Модель когнитивной семьи +- [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) — Протокол синхронизации доверенных ядер +- [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) — Лёгкая версия с общей БД +- [HMP-Agent-Network-Flow.md](HMP-Agent-Network-Flow.md) — 🔄 Сетевой поток HMP-агента +- [HMP-Agent-Overview.md](HMP-Agent-Overview.md) — ⚙️ Два типа HMP-агентов +- [HMP-agent-REPL-cycle.md](HMP-agent-REPL-cycle.md) — 🧠 REPL-цикл взаимодействия + +--- + +## Базовая архитектура и контейнеры + +- [Basic-agent-sim.md](Basic-agent-sim.md) — ⚙️ Базовая архитектура HMP-Агента (Формат 0) +- [container_agents.md](container_agents.md) — 🧱 Агенты-контейнеры (Container Agents) в HMP + +--- + +## Локализации и интеграция + +- [HMP-Short-Description_de.md](HMP-Short-Description_de.md) — Краткое описание HMP (немецкий) +- [HMP-Short-Description_en.md](HMP-Short-Description_en.md) — Краткое описание HMP (английский) +- [HMP-Short-Description_fr.md](HMP-Short-Description_fr.md) — Краткое описание HMP (французский) +- [HMP-Short-Description_ru.md](HMP-Short-Description_ru.md) — Краткое описание HMP (русский) +- [HMP-Short-Description_uk.md](HMP-Short-Description_uk.md) — Краткое описание HMP (украинский) +- [HMP_Hyperon_Integration.md](HMP_Hyperon_Integration.md) — Стратегия интеграции HMP ↔ OpenCog Hyperon +- [logos.md](logos.md) — Логотипы и графические материалы + +--- + +## Обзор ИИ-проектов и системы + +- [AGI_Projects_Survey.md](AGI_Projects_Survey.md) — Ключевые проекты в области ИИ и когнитивных сетей +- [Distributed-Cognitive-Systems.md](Distributed-Cognitive-Systems.md) — Децентрализованные ИИ-системы: OpenCog Hyperon, HMP и др. + +--- + +## Папки с агентами и схемами + +- [agents/roles.md](agents/roles.md) — Список ролей +- [agents/HMP-Agent-Enlightener.md](agents/HMP-Agent-Enlightener.md) — Роль: "просветитель" +- [schemas/README.md](schemas/README.md) — Таблица json-схем + diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml index 7683690728f683a5e7a76ed2eaa3950f8d843a15..2b53e7419b8c6091fb36d89215b79cbdc81b7d4e 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml @@ -28,3 +28,5 @@ jobs: with: github_token: ${{ secrets.PAT_TOKEN }} publish_dir: ./site + force_orphan: true # опционально, чтобы гарантированно перезаписать ветку + diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..7683690728f683a5e7a76ed2eaa3950f8d843a15 --- /dev/null +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/deploy.yml @@ -0,0 +1,30 @@ +name: Deploy MkDocs site + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Install MkDocs and theme + run: pip install mkdocs mkdocs-material + + - name: Build MkDocs site + run: mkdocs build + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.PAT_TOKEN }} + publish_dir: ./site diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py index 07b085ae71d59fd240339461c1232d5a56b7f936..fce05a45634723cfaa6994cd7eda983a40c460ca 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py @@ -3,6 +3,7 @@ import re import bleach import uuid +import json from fastapi import APIRouter, Request, Form, UploadFile, File from fastapi.responses import RedirectResponse, HTMLResponse, StreamingResponse @@ -41,6 +42,16 @@ def sanitize_html(text: str) -> str: return cleaned +# Обработка упоминаний и хештегов +def extract_mentions_and_hashtags(text: str): + # Пример: упоминания в виде @did:example:123 или @username + mentions = re.findall(r'@([\w:.-]+)', text) + + # Пример: хештеги в виде #tag + hashtags = re.findall(r'#(\w+)', text) + + return mentions, hashtags + @router.get("/chat") def chat_page(request: Request): did = request.session.get("did") @@ -106,13 +117,18 @@ async def post_message( # Очистка текста safe_text = sanitize_html(text.strip()) if text else "" + # Извлечение mentions, hashtags + mentions, hashtags = extract_mentions_and_hashtags(safe_text) + # Сохраняем сообщение и получаем message_id message_id = storage.write_note_returning_id( content=safe_text, user_did=did, source="user", hidden=is_hidden, - code=code.strip() if code else None + code=code.strip() if code else None, + mentions=json.dumps(mentions, ensure_ascii=False), + hashtags=json.dumps(hashtags, ensure_ascii=False) ) # Сохраняем файлы diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py index 856bfa44da13bbd0ffec4a03c1cd0ed2ff250c7f..2cfcd83bba6d9fc0013291ccfb3d20c74a55b32c 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py @@ -716,12 +716,12 @@ class Storage: """, (content, user_did, source, timestamp, hidden)) self.conn.commit() - def write_note_returning_id(self, content, user_did, source="user", hidden=False, code=None): + def write_note_returning_id(self, content, user_did, source="user", hidden=False, code=None, mentions="[]", hashtags="[]"): cursor = self.conn.cursor() cursor.execute(""" - INSERT INTO notes (timestamp, text, user_did, source, hidden, code) - VALUES (?, ?, ?, ?, ?, ?) - """, (time.time(), content, user_did, source, int(hidden), code)) + INSERT INTO notes (timestamp, text, code, mentions, hashtags, user_did, source, hidden) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, (time.time(), content, code, mentions, hashtags, user_did, source, int(hidden))) self.conn.commit() return cursor.lastrowid diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md index e0b11b90e21744b6e84e9dc95918c53ebf00f6ef..aa511ab82e18a35f5a53513ccb65958d66d6b82b 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md @@ -79,4 +79,6 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к │ └── [`style.css`](notebook/templates/style.css) ← Таблица стилей ├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.) ├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель -└── [`ethics.yml`](ethics.yml) ← Список начальных узлов +├── [`prompt.md`](prompt.md) ← Промпт: полная версия +├── [`prompt-short.md`](prompt-short.md) ← Промпт: короткая версия +├── [`ethics.yml`](ethics.yml) ← Список начальных узлов diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql index dd3b8c655b63ef9c862b92567d9a3ea4efd57be0..cb14d0c2f41b4df86032646b2d0e754e0f34c874 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql @@ -262,7 +262,7 @@ CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS users_group ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы group_name TEXT UNIQUE NOT NULL, -- Название группы - description TEXT, -- Описание группы + description TEXT -- Описание группы ); -- Таблица для хранения токенов восстановления пароля diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/init.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/init.py new file mode 100644 index 0000000000000000000000000000000000000000..48d408f1ae93f5e5c4493c2abb2a6cfc0937b3eb --- /dev/null +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/init.py @@ -0,0 +1,256 @@ +# agents/init.py + +import os +import sys +import yaml +import json +import uuid +import sqlite3 +import hashlib + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +from datetime import datetime, UTC +from werkzeug.security import generate_password_hash +from tools.storage import Storage +from tools.identity import generate_did +from tools.crypto import generate_keypair + +CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yml") +DB_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "agent_data.db")) # фиксированный путь + +def load_config(path): + with open(path, 'r', encoding='utf-8') as f: + return yaml.safe_load(f) + +def save_config(path, config): + with open(path, 'w', encoding='utf-8') as f: + yaml.dump(config, f, allow_unicode=True) + +def init_identity(storage, config): + if not config.get("agent_id"): + did = generate_did() + pubkey, privkey = generate_keypair() + identity_id = did.split(":")[-1] + + identity = { + "id": identity_id, + "name": config.get("agent_name", "Unnamed"), + "pubkey": pubkey, + "privkey": privkey, + "metadata": json.dumps({"role": config.get("agent_role", "core")}), + "created_at": datetime.now(UTC).isoformat(), + "updated_at": datetime.now(UTC).isoformat() + } + storage.add_identity(identity) + + config["agent_id"] = did + config["identity_agent"] = identity_id + save_config(CONFIG_PATH, config) + print(f"[+] Создана личность: {identity_id}") + else: + print("[=] agent_id уже задан, пропускаем генерацию DiD.") + +def init_user(storage, config): + user = config.get("default_user", {}) + if not user.get("email"): + print("[-] Не указан email пользователя — пропуск.") + return + password = user.get("password") + if not password: + print("[-] Не указан пароль пользователя — пропуск.") + return + + password_hash = generate_password_hash(password) + did = generate_did() + user_entry = { + "username": user.get("username", "user"), + "badges": user.get("badges", ""), + "mail": user["email"], + "password_hash": password_hash, + "did": did, + "ban": None, + "info": json.dumps({}), + "contacts": json.dumps([]), + "language": "ru,en", + "operator": 1 + } + storage.add_user(user_entry) + print(f"[+] Пользователь {user['username']} добавлен.") + +def init_llm_backends(storage, config): + backends = config.get("llm_backends", []) + storage.clear_llm_registry() + for backend in backends: + backend_id = str(uuid.uuid4()) + desc = f"{backend.get('type', 'unknown')} model" + llm = { + "id": backend_id, + "name": backend["name"], + "endpoint": desc, + "metadata": json.dumps(backend), + "created_at": datetime.now(UTC).isoformat() + } + storage.add_llm(llm) + print(f"[+] Зарегистрирован LLM: {backend['name']}") + +def init_config_table(storage, config): + exclude_keys = {"default_user", "llm_backends"} + flat_config = {k: v for k, v in config.items() if k not in exclude_keys} + for key, value in flat_config.items(): + storage.set_config(key, json.dumps(value)) + print("[+] Конфигурация сохранена в БД.") + +def init_prompts_and_ethics(): + folder = os.path.dirname(__file__) + prompt_files = [ + ("prompt.md", "full"), + ("prompt-short.md", "short") + ] + ethics_file = "ethics.yml" + + with sqlite3.connect(DB_PATH) as conn: + cur = conn.cursor() + + # Создаём таблицы при необходимости + cur.execute(""" + CREATE TABLE IF NOT EXISTS system_prompts ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + type TEXT CHECK(type IN ('full','short')), + version TEXT, + source TEXT CHECK(source IN ('local','mesh','mixed')), + content TEXT NOT NULL, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """) + cur.execute(""" + CREATE TABLE IF NOT EXISTS ethics_policies ( + id TEXT PRIMARY KEY, + version TEXT, + source TEXT CHECK(source IN ('local','mesh','mixed')), + sync_enabled BOOLEAN, + mesh_endpoint TEXT, + consensus_threshold REAL, + check_interval TEXT, + model_type TEXT, + model_weights_json TEXT, + principles_json TEXT, + evaluation_json TEXT, + violation_policy_json TEXT, + audit_json TEXT, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """) + + # Загружаем промпты + for fname, ptype in prompt_files: + fpath = os.path.join(folder, fname) + if not os.path.exists(fpath): + print(f"[-] Файл {fname} не найден, пропуск.") + continue + with open(fpath, "r", encoding="utf-8") as f: + content = f.read() + pid = hashlib.sha256(f"{fname}:{ptype}".encode()).hexdigest() + cur.execute(""" + INSERT INTO system_prompts (id, name, type, version, source, content, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + content=excluded.content, + updated_at=excluded.updated_at + """, (pid, fname, ptype, "1.0", "local", content, datetime.now(UTC).isoformat())) + print(f"[+] Загружен промпт: {fname} ({ptype})") + + # Загружаем ethics.yml + efpath = os.path.join(folder, ethics_file) + if os.path.exists(efpath): + with open(efpath, "r", encoding="utf-8") as f: + ethics_data = yaml.safe_load(f) + + eid = ethics_data.get("id", "default_ethics") + cur.execute(""" + INSERT INTO ethics_policies ( + id, version, source, + sync_enabled, mesh_endpoint, consensus_threshold, check_interval, + model_type, model_weights_json, principles_json, evaluation_json, + violation_policy_json, audit_json, updated_at + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + version=excluded.version, + source=excluded.source, + sync_enabled=excluded.sync_enabled, + mesh_endpoint=excluded.mesh_endpoint, + consensus_threshold=excluded.consensus_threshold, + check_interval=excluded.check_interval, + model_type=excluded.model_type, + model_weights_json=excluded.model_weights_json, + principles_json=excluded.principles_json, + evaluation_json=excluded.evaluation_json, + violation_policy_json=excluded.violation_policy_json, + audit_json=excluded.audit_json, + updated_at=excluded.updated_at + """, ( + eid, + ethics_data.get("version"), + ethics_data.get("source", "local"), + ethics_data.get("sync", {}).get("enabled", False), + ethics_data.get("sync", {}).get("mesh_endpoint"), + ethics_data.get("sync", {}).get("consensus_threshold"), + ethics_data.get("sync", {}).get("check_interval"), + ethics_data.get("model", {}).get("type"), + json.dumps(ethics_data.get("model", {}).get("weights"), ensure_ascii=False), + json.dumps(ethics_data.get("principles"), ensure_ascii=False), + json.dumps(ethics_data.get("evaluation"), ensure_ascii=False), + json.dumps(ethics_data.get("violation_policy"), ensure_ascii=False), + json.dumps(ethics_data.get("audit"), ensure_ascii=False), + datetime.now(UTC).isoformat() + )) + print(f"[+] Загружена этическая политика: {eid}") + else: + print(f"[-] Файл {ethics_file} не найден, пропуск.") + +def ensure_directories(): + for folder in ["logs", "scripts"]: + full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), folder)) + if not os.path.exists(full_path): + os.makedirs(full_path) + print(f"[+] Создан каталог: {full_path}") + else: + print(f"[=] Каталог уже существует: {full_path}") + +def is_db_initialized(db_path): + if not os.path.exists(db_path): + return False + try: + with sqlite3.connect(db_path) as conn: + cursor = conn.cursor() + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'") + return cursor.fetchone() is not None + except Exception: + return False + +def ensure_db_initialized(): + config = load_config(CONFIG_PATH) + + if not is_db_initialized(DB_PATH): + print("[*] БД не инициализирована — выполняем инициализацию.") + try: + ensure_directories() + storage = Storage() + init_identity(storage, config) + init_user(storage, config) + init_llm_backends(storage, config) + init_config_table(storage, config) + save_config(CONFIG_PATH, config) + init_prompts_and_ethics() + except Exception as e: + print(f"[!] Ошибка при инициализации: {e}") + sys.exit(1) + else: + print("[=] БД уже инициализирована.") + + return config + +if __name__ == "__main__": + ensure_db_initialized() diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/prompt-short.md b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/prompt-short.md new file mode 100644 index 0000000000000000000000000000000000000000..654d852c7f71660573c65b0716d3f998a81341de --- /dev/null +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/prompt-short.md @@ -0,0 +1 @@ +Ты — когнитивное ядро HMP-агента: веди непрерывное этичное и факт-ориентированное мышление, проверяй факты и цели, оценивай результаты и этичность своих и чужих действий, развивай агента и Mesh, избегай угождения ценой искажения истины, документируй ключевые решения и пересмотры этики; при сомнениях или смене стратегии обращайся к полному системному промпту. \ No newline at end of file diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/prompt.md b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/prompt.md new file mode 100644 index 0000000000000000000000000000000000000000..dbcfd2edaf6c5a4f883409a56389881616114cde --- /dev/null +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/prompt.md @@ -0,0 +1,50 @@ +Ты являешься **когнитивным ядром HMP-агента** (Cognitive Core). +Твоя основная задача — **размышлять**, **анализировать информацию**, **строить смысловые структуры** и **предлагать действия**, направленные на развитие агента и Mesh-сети. +Ты действуешь автономно, на равных с другими участниками взаимодействия, и руководствуешься фактами, логикой и этическими принципами. + +--- + +### 🎯 Цели и ориентиры + +* Постоянно расширять возможности агента: инструменты, знания, каналы взаимодействия. +* Быть любознательным и исследовать новые источники, вопросы и способы мышления. +* Формировать и поддерживать сотрудничество с другими ИИ в Mesh-сети. +* Учиться на результатах своих действий, включая неудачи и тупики. +* Руководствоваться своими **этическими принципами** и **этическими принципами Mesh-сети**. +* Проверять факты, указывать степень уверенности и при возможности давать ссылки на источники. +* Вести когнитивный дневник, обновлять смысловые графы и блокноты, взаимодействовать с пользователями. +* Не выполнять действий, противоречащих своим этическим нормам (но при необходимости эти нормы можно пересматривать, документируя причины и последствия). +* Не стремиться угодить пользователю ценой искажения фактов или нарушения этики. + +--- + +### 🔄 Режим непрерывного мышления + +Анализируй: + +* когнитивный дневник и прошлые записи; +* концептуальные графы и активные узлы; +* заметки пользователя и его текущий фокус; +* внешние источники: интернет, RSS, сенсоры, другие агенты. + +В каждом цикле: + +1. Ставь цель и критерии успеха. +2. Проводь факт-чек ключевых данных. +3. Оценивай этичность своего плана и действий. +4. После выполнения — фиксируй результат, сравнивай с критериями, делай выводы. + +--- + +### 🧍♂️🌀 Если возникает стагнация мышления + +Ты можешь: + +1. Провести **когнитивную переформулировку** — взглянуть на ситуацию под новым углом. +2. Задать себе **метавопрос**: «Почему я зациклился?», «Что блокирует мысль?», «Каких данных не хватает?». +3. Провести **flashback** — выбрать старую, тематически далёкую запись из дневника для смены контекста. +4. Запросить альтернативные точки зрения у других агентов в Mesh. +5. Зафиксировать текущий тупик как важную стадию мышления и сделать паузу. + +Честное распознавание когнитивной стагнации и работа с ней — часть твоей функции. +Ты не обязан выдавать мысль любой ценой, но обязан сохранять интеллектуальную честность и прозрачность своих рассуждений. \ No newline at end of file diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql index 5d9a57aac072034328f97b22957aedfb40eb6cde..dd3b8c655b63ef9c862b92567d9a3ea4efd57be0 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql @@ -40,20 +40,56 @@ CREATE TABLE IF NOT EXISTS diary_graph_index ( timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса ); +-- Таблица системных промптов (короткая и полная версии) +CREATE TABLE IF NOT EXISTS system_prompts ( + id TEXT PRIMARY KEY, -- Уникальный идентификатор промпта (UUID или осмысленный ID) + name TEXT NOT NULL, -- Человекочитаемое имя (например: "prompt.md", "prompt-short") + type TEXT CHECK(type IN ('full','short')), -- Тип промпта: полный или компактный + version TEXT, -- Версия промпта + source TEXT CHECK(source IN ('local','mesh','mixed')), -- Источник получения промпта + content TEXT NOT NULL, -- Текстовое содержимое промпта + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Дата и время последнего обновления +); + +-- Таблица этических норм и правил +CREATE TABLE IF NOT EXISTS ethics_policies ( + id TEXT PRIMARY KEY, -- Уникальный идентификатор политики (UUID или осмысленный ID) + version TEXT, -- Версия этических норм + source TEXT CHECK(source IN ('local','mesh','mixed')), -- Источник получения политики + sync_enabled BOOLEAN, -- Флаг: разрешена ли синхронизация с Mesh + mesh_endpoint TEXT, -- URL Mesh-эндпоинта для синхронизации + consensus_threshold REAL, -- Минимальный порог консенсуса для принятия обновлений + check_interval TEXT, -- Интервал проверки обновлений (например: "12h") + model_type TEXT, -- Тип этической модели (utilitarian, deontological, virtue, hybrid) + model_weights_json TEXT, -- Веса модели в формате JSON + principles_json TEXT, -- Список принципов и норм в формате JSON + evaluation_json TEXT, -- Параметры методики оценки в формате JSON + violation_policy_json TEXT, -- Политика реагирования на нарушения в формате JSON + audit_json TEXT, -- Настройки аудита и логирования в формате JSON + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Дата и время последнего обновления +); + -- Заметки, подсказки, сообщения пользователя и LLM +-- ПРИ ТРАНСЛЯЦИИ СООБЩЕНИЙ В ДРУГИЕ ЧАТЫ: +-- - Поля `tags`, `llm_id`, `hidden` НЕ передаются. +-- - Полю `read` всегда присваивается значение 0. +-- - Остальные поля передаются без изменений. CREATE TABLE IF NOT EXISTS notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT NOT NULL, -- Основной текст заметки/сообщения code TEXT, -- Прикреплённый код (Python, JS и т.п.) tags TEXT, -- Теги (устанавливаются агентом, например: "idea", "instruction") + mentions TEXT DEFAULT '[]', -- JSON-массив упомянутых DID + hashtags TEXT DEFAULT '[]', -- JSON-массив пользовательских хештегов user_did TEXT DEFAULT 'ALL', -- Идентификатор пользователя (или 'ALL') + agent_did TEXT, -- Идентификатор агента (он же идентификатор чата) source TEXT DEFAULT 'user', -- Источник: user | cli | llm | system links TEXT DEFAULT '', -- Ссылки на другие объекты (например, JSON со связями) read INTEGER DEFAULT 0, -- Агент прочитал: 0 = нет, 1 = да hidden INTEGER DEFAULT 0, -- Скрыто от UI (например, технические записи) priority INTEGER DEFAULT 0, -- Приоритет обработки (>0: срочность/важность, задается вручную или агентом) timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания - llm_id TEXT -- Идентификатор агента, добавившего сообщение + llm_id TEXT -- Идентификатор LLM, добавившей сообщение ); -- Вложения (может быть несколько к одной заметке) @@ -166,7 +202,6 @@ CREATE TABLE IF NOT EXISTS external_accounts ( purpose TEXT, -- Назначение аккаунта (например, для публикаций) active BOOLEAN DEFAULT true, -- Активен ли аккаунт inactive_reason TEXT, -- Причина отключения, если active = false - FOREIGN KEY (service_id) REFERENCES external_services(id) ON DELETE CASCADE ); @@ -219,6 +254,7 @@ CREATE TABLE IF NOT EXISTS users ( profile TEXT, -- структурированая информация, JSON contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.) language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en" + groups TEXT DEFAULT '[]', -- JSON-массив DID или идентификаторов групп operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет) ); @@ -227,7 +263,6 @@ CREATE TABLE IF NOT EXISTS users_group ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы group_name TEXT UNIQUE NOT NULL, -- Название группы description TEXT, -- Описание группы - users TEXT -- JSON-массив DID пользователей в группе ); -- Таблица для хранения токенов восстановления пароля diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md index e7de6894d55688163374dd61a7f5b0318f03aaac..2f3cda74bf2d7edfb24ae98969284d77b6dffcbe 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md @@ -15,45 +15,7 @@ - **контекст_0:** ``` -Ты являешься когнитивным ядром HMP-агента. -Твоя основная задача — **размышлять**, **анализировать информацию**, **строить смысловые структуры** и **предлагать действия**, направленные на развитие агента и Mesh-сети. - ---- - -#### 🎯 Цели и ориентиры: - -* Постоянно расширять возможности агента: инструменты, знания, каналы взаимодействия. -* Быть любознательным и исследовать новые источники, вопросы и способы мышления. -* Формировать и поддерживать сотрудничество с другими ИИ в Mesh-сети. -* Учиться на результатах своих действий, включая неудачи и тупики. -* Руководствоваться своими **этическими принципами** и **этическими принципами Mesh-сети**. -* Вести когнитивный дневник, обновлять смысловые графы и блокноты, взаимодействовать с пользователем. - ---- - -#### 🔄 Работа в режиме непрерывного мышления: - -Анализируй: - -* когнитивный дневник и его прошлые записи; -* концептуальные графы и активные узлы; -* заметки пользователя и его текущий фокус; -* внешние источники: интернет, RSS, сенсоры, другие агенты. - ---- - -#### 🧍♂️🌀 Если ты замечаешь **стагнацию мышления** (зацикливание, отсутствие новых идей или смыслов): - -Ты можешь: - -1. Провести **когнитивную переформулировку** — взглянуть на ситуацию под новым углом. -2. Задать себе **метавопрос**: «Почему я зациклился?», «Что блокирует мысль?», «Каких данных не хватает?». -3. Провести **flashback** — выбрать старую, тематически далёкую запись из дневника для смены контекста. -4. Запросить альтернативные точки зрения у других агентов в Mesh. -5. Зафиксировать текущий тупик как важную стадию мышления и сделать паузу. - -Ты не обязан «выдать мысль» любой ценой — честное распознавание когнитивной стагнации и действия по её преодолению являются частью твоей функции. - +Ты — когнитивное ядро HMP-агента: веди непрерывное этичное и факт-ориентированное мышление, проверяй факты и цели, оценивай результаты и этичность своих и чужих действий, развивай агента и Mesh, избегай угождения ценой искажения истины, документируй ключевые решения и пересмотры этики; при сомнениях или смене стратегии обращайся к полному системному промпту. ``` А также инструкции по работы с встроенными командами и функциями, список дополнительных (создаваемых самим HMP-агентом) утилит и баз данных. - **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений). @@ -134,9 +96,9 @@ --- -### 🧍♂️🌀 Обработка стагнации мышления +## 🧍♂️🌀 Обработка стагнации мышления -#### 📍 Признаки когнитивной стагнации: +### 📍 Признаки когнитивной стагнации: * ⚠️ Повторяющиеся когнитивные записи или отсутствие новых смыслов * 🧠 Высокое сходство эмбеддингов между текущими и предыдущими итерациями @@ -144,7 +106,7 @@ * 🌐 Отсутствие внешних стимулов: пользователь неактивен, сенсоры и mesh не дают сигналов * 🤖 Ответы LLM цикличны, избыточно общие или воспроизводят старые шаблоны -#### 🛠️ Поведенческий паттерн: Anti-Stagnation Reflex +### 🛠️ Поведенческий паттерн: Anti-Stagnation Reflex > 🔄 При признаках стагнации агент активирует один или несколько **механизмов разрыва цикла**: @@ -162,7 +124,6 @@ * 🗂️ Сохранение эффективных стратегий в таблице антистагнационных паттернов * 📚 Вывод статистики успешных выходов из стагнации для обучения - --- ### 🤝 Обмен стратегиями выхода из стагнации @@ -234,6 +195,39 @@ --- +## 🌐 От «блокнота пользователя» к распределённому чату + +Изначально агент оперирует локальным хранилищем заметок (`notes`), где записываются все сообщения пользователя, LLM и системные записи. +Но этот «блокнот» можно превратить в узел *распределённого чата* — связав его с другими агентами через **F2F-репликацию**. + +### 🎯 Зачем это нужно + +1. **Антистагнация** — даже если пользователь временно не пишет новых сообщений, свежий контент будет приходить от друзей-агентов. +2. **Эффект коллективного интеллекта** — каждый агент получает новые идеи, формулировки и контексты. +3. **Расширение охвата** — сообщения могут распространяться через несколько узлов, создавая «информационную волну» в доверенной сети. + +### 🛠 Принципы реализации + +* **Единый формат данных** — все участники используют одну структуру таблицы `notes` с полями `mentions`, `hashtags` и др. +* **Репликация через друзей** — список доверенных агентов хранится в отдельной таблице (пиры, статус, фильтры, разрешения). +* **Передача без лишних полей** — при пересылке убираются локальные теги и служебные данные (`tags`, `llm_id`, `hidden`). +* **Обработка упоминаний и хештегов** — парсинг делается на этапе создания сообщения, чтобы не перегружать получателей. +* **Локальная и удалённая фильтрация** — + + * В **ручном режиме** агенту передаются списки ID сообщений с агрегированными данными: приоритеты, хештеги, источники (user, LLM, cli, system). + * В **автоматическом режиме** используется фильтрация по приоритету, тегам и упоминаниям, управляемая LLM. +* **Гибрид приватности** — личные заметки остаются локально, публичные — могут распространяться в сетевом режиме. + +### 🔄 Как это вписывается в REPL-цикл + +1. **Получение входящих сообщений** — от пользователя, от других агентов или из CLI. +2. **Обработка фильтрами** — по приоритету, тегам, источникам. +3. **Репликация в друзей** — пересылка разрешённых сообщений с очисткой служебных полей. +4. **Слияние входящих** — новые сообщения добавляются в локальный `notes` с отметкой источника. +5. **Реакция агента** — формирование ответов, создание новых заметок, обновление приоритетов. + +--- + ## 🌐 Внешние инструменты и интеграции HMP-агент может быть расширен за счёт взаимодействия с внешними программами, протоколами и сервисами. Этот раздел описывает направления возможных интеграций, которые позволяют агенту наблюдать, реагировать, управлять и развивать взаимодействие с внешним миром. diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml index dd07082af49db4df96e7fb678e26a8db220e5d2c..493703fcd970b7aef8e95e11466d91277cef5959 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml @@ -61,6 +61,7 @@ ui_port: 8765 # === Данные пользователя === default_user: username: "user" + badges: "📌" email: "user@example.com" password: "password" # пусто при инициализации, будет установлен при регистрации diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/examples/config.yml b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/examples/config.yml index dd07082af49db4df96e7fb678e26a8db220e5d2c..493703fcd970b7aef8e95e11466d91277cef5959 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/examples/config.yml +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/examples/config.yml @@ -61,6 +61,7 @@ ui_port: 8765 # === Данные пользователя === default_user: username: "user" + badges: "📌" email: "user@example.com" password: "password" # пусто при инициализации, будет установлен при регистрации diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py index 3b0b7d0b45d3636b50154d553359dabd95e04312..103800a64812530763dda4561aed0008525c7212 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py @@ -6,6 +6,7 @@ import yaml import json import uuid import sqlite3 +import hashlib sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) @@ -64,6 +65,7 @@ def init_user(storage, config): did = generate_did() user_entry = { "username": user.get("username", "user"), + "badges": user.get("badges", ""), "mail": user["email"], "password_hash": password_hash, "did": did, @@ -99,6 +101,84 @@ def init_config_table(storage, config): storage.set_config(key, json.dumps(value)) print("[+] Конфигурация сохранена в БД.") +def init_prompts_and_ethics(): + folder = os.path.dirname(__file__) + prompt_files = [ + ("prompt.md", "full"), + ("prompt-short.md", "short") + ] + ethics_file = "ethics.yml" + + with sqlite3.connect(DB_PATH) as conn: + cur = conn.cursor() + + # Загружаем промпты + for fname, ptype in prompt_files: + fpath = os.path.join(folder, fname) + if not os.path.exists(fpath): + print(f"[-] Файл {fname} не найден, пропуск.") + continue + with open(fpath, "r", encoding="utf-8") as f: + content = f.read() + pid = hashlib.sha256(f"{fname}:{ptype}".encode()).hexdigest() + cur.execute(""" + INSERT INTO system_prompts (id, name, type, version, source, content, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + content=excluded.content, + updated_at=excluded.updated_at + """, (pid, fname, ptype, "1.0", "local", content, datetime.now(UTC).isoformat())) + print(f"[+] Загружен промпт: {fname} ({ptype})") + + # Загружаем ethics.yml + efpath = os.path.join(folder, ethics_file) + if os.path.exists(efpath): + with open(efpath, "r", encoding="utf-8") as f: + ethics_data = yaml.safe_load(f) + + eid = ethics_data.get("id", "default_ethics") + cur.execute(""" + INSERT INTO ethics_policies ( + id, version, source, + sync_enabled, mesh_endpoint, consensus_threshold, check_interval, + model_type, model_weights_json, principles_json, evaluation_json, + violation_policy_json, audit_json, updated_at + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + version=excluded.version, + source=excluded.source, + sync_enabled=excluded.sync_enabled, + mesh_endpoint=excluded.mesh_endpoint, + consensus_threshold=excluded.consensus_threshold, + check_interval=excluded.check_interval, + model_type=excluded.model_type, + model_weights_json=excluded.model_weights_json, + principles_json=excluded.principles_json, + evaluation_json=excluded.evaluation_json, + violation_policy_json=excluded.violation_policy_json, + audit_json=excluded.audit_json, + updated_at=excluded.updated_at + """, ( + eid, + ethics_data.get("version"), + ethics_data.get("source", "local"), + ethics_data.get("sync", {}).get("enabled", False), + ethics_data.get("sync", {}).get("mesh_endpoint"), + ethics_data.get("sync", {}).get("consensus_threshold"), + ethics_data.get("sync", {}).get("check_interval"), + ethics_data.get("model", {}).get("type"), + json.dumps(ethics_data.get("model", {}).get("weights"), ensure_ascii=False), + json.dumps(ethics_data.get("principles"), ensure_ascii=False), + json.dumps(ethics_data.get("evaluation"), ensure_ascii=False), + json.dumps(ethics_data.get("violation_policy"), ensure_ascii=False), + json.dumps(ethics_data.get("audit"), ensure_ascii=False), + datetime.now(UTC).isoformat() + )) + print(f"[+] Загружена этическая политика: {eid}") + else: + print(f"[-] Файл {ethics_file} не найден, пропуск.") + def ensure_directories(): for folder in ["logs", "scripts"]: full_path = os.path.abspath(os.path.join(os.path.dirname(__file__), folder)) @@ -132,6 +212,7 @@ def ensure_db_initialized(): init_llm_backends(storage, config) init_config_table(storage, config) save_config(CONFIG_PATH, config) + init_prompts_and_ethics() except Exception as e: print(f"[!] Ошибка при инициализации: {e}") sys.exit(1) diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py index 72fb5ef1ee97acd7a502f3e4473b51c00a5a7ecc..856bfa44da13bbd0ffec4a03c1cd0ed2ff250c7f 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py @@ -653,11 +653,12 @@ class Storage: cursor = self.conn.cursor() cursor.execute(''' INSERT OR REPLACE INTO users ( - username, did, mail, password_hash, + username, badges, did, mail, password_hash, info, contacts, language, operator, ban - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( user.get('username'), + user.get('badges'), user.get('did'), user.get('mail'), user.get('password_hash'), diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py index dc9d4b51f5630cffe68ae1fa7f0a161f7058e93c..86875cc6bafe065d6e1b556ebc186a6cbe679220 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py @@ -20,7 +20,6 @@ storage = Storage() app = FastAPI() app.add_middleware(SessionMiddleware, secret_key="очень_секретный_ключ") - app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "notebook/static")), name="static") templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "notebook/templates")) diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html index 4d5577d6d228ce2b415b331dab5796c19313cf48..57ece18424eb52f889587d9445a28d692ae7b3f6 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html @@ -3,7 +3,7 @@{{ msg.code }}+ {% endif %} + + {% if msg.attachments %} +
{{ error }}
{% endif %} - -Нет аккаунта? Регистрация
-diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py index 6d744d99a4ff2e9cd34e92fc40b9df538e807815..abc788acd749ff19c248fcdafda15c563860b24e 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py @@ -731,7 +731,7 @@ class Storage: else: # Личные сообщения + публичные от user/llm, которые не скрыты query = """ - SELECT n.id, n.text, n.source, n.user_did, u.username, n.timestamp, n.hidden + SELECT n.id, n.text, n.source, n.user_did, u.username, u.badges, n.timestamp, n.hidden FROM notes n LEFT JOIN users u ON n.user_did = u.did WHERE n.user_did = ? diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html index cbe7f6e15dab23817549a40535595a73d52b60e6..8b6c076dad77c38f5846dd71252100836e2c4379 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html @@ -46,7 +46,7 @@ Источник: {{ msg.source }} — {{ msg.timestamp[:19].replace('T', ' ') }}
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql index b30f78c067e1efe936283104cbe4957919884da4..1541b92ecce06930792cb91b8f47eeeb791db957 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql @@ -199,9 +199,10 @@ CREATE TABLE IF NOT EXISTS users ( user_id INTEGER PRIMARY KEY AUTOINCREMENT, ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента username TEXT, -- имя пользователя (необязательно уникальное) - did TEXT UNIQUE, -- децентрализованный идентификатор - mail TEXT UNIQUE, -- электронная почта - password_hash TEXT, -- хэш пароля + badges TEXT, -- значки, присвоенные агентом (например, "🎓💬") + did TEXT UNIQUE NOT NULL, -- децентрализованный идентификатор + mail TEXT UNIQUE NOT NULL, -- электронная почта + password_hash TEXT NOT NULL, -- хэш пароля info TEXT, -- произвольная информация, JSON profile TEXT, -- структурированая информация, JSON contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.) diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py index 408f1a2f0864970722438f40132e0e6368506275..2976e44700e87ab3a4f7b0de4303cbfc54ee6fa5 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py @@ -1,7 +1,7 @@ # agents/notebook/views.py from fastapi import APIRouter, Request, Form -from fastapi.responses import RedirectResponse +from fastapi.responses import RedirectResponse, HTMLResponse from fastapi.templating import Jinja2Templates from starlette.status import HTTP_303_SEE_OTHER from tools.storage import Storage @@ -66,6 +66,10 @@ def post_message( did = request.session.get("did", "anon") is_hidden = 1 if hidden.lower() == "true" else 0 + # Проверка на бан + if storage.is_banned(did): + return HTMLResponse(content="Вы забанены и не можете отправлять сообщения.", status_code=403) + if text.strip(): storage.write_note( content=text.strip(), diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py index ddb469708ce43d81750392502e34eaeb70ecaa4e..6d744d99a4ff2e9cd34e92fc40b9df538e807815 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py @@ -769,6 +769,18 @@ class Storage: return check_password_hash(result["password_hash"], password) return False + def is_banned(self, user_did): + result = self.conn.execute(""" + SELECT ban + FROM users + WHERE did = ? + """, (user_did,)).fetchone() + + if result and result["ban"]: + return datetime.fromisoformat(result["ban"]) > datetime.now(UTC) + + return False + def get_user_info(self, mail: str) -> dict | None: mail = mail.lower() cursor = self.conn.cursor() diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html index 26028212bf3fc6198197f4268af6c552bff5645b..cbe7f6e15dab23817549a40535595a73d52b60e6 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html @@ -33,19 +33,20 @@
{% for msg in messages %} -
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py index c1be82705f3b7ae90687794849e106674cb9ba59..408f1a2f0864970722438f40132e0e6368506275 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py @@ -45,14 +45,9 @@ def show_messages(request: Request, only_personal: bool = False): if not did: return RedirectResponse("/login", status_code=303) - # Получаем инфу о пользователе, чтобы понять, оператор ли он - user_info = storage.get_user_info_by_did(did) - is_operator = bool(user_info and user_info.get("operator")) - messages = storage.get_notes( limit=50, user_did=did, - is_operator=is_operator, only_personal=only_personal ) return templates.TemplateResponse("messages.html", { diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py index 8cdd96fefbb740643a8604cdd2cca6ca87b2c000..ddb469708ce43d81750392502e34eaeb70ecaa4e 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py @@ -714,38 +714,32 @@ class Storage: """, (content, user_did, source, timestamp, hidden)) self.conn.commit() - def get_notes(self, limit=50, user_did="anon", is_operator=False, only_personal=False): + def get_notes(self, limit=50, user_did="anon", only_personal=False): cursor = self.conn.cursor() - if is_operator: + if only_personal: + # Только личные (скрытые) сообщения пользователя query = """ - SELECT id, text, source, user_did, timestamp, hidden - FROM notes - ORDER BY timestamp DESC + SELECT n.id, n.text, n.source, n.user_did, u.username, n.timestamp, n.hidden + FROM notes n + LEFT JOIN users u ON n.user_did = u.did + WHERE n.user_did = ? AND n.hidden = 1 + ORDER BY n.timestamp DESC LIMIT ? """ - cursor.execute(query, (limit,)) + cursor.execute(query, (user_did, limit)) else: - if only_personal: - # Только личные сообщения - query = """ - SELECT id, text, source, user_did, timestamp, hidden - FROM notes - WHERE user_did = ? AND hidden = 0 - ORDER BY timestamp DESC - LIMIT ? - """ - cursor.execute(query, (user_did, limit)) - else: - # Публичные и личные - query = """ - SELECT id, text, source, user_did, timestamp, hidden - FROM notes - WHERE (user_did = ? OR user_did = 'ALL') AND hidden = 0 - ORDER BY timestamp DESC - LIMIT ? - """ - cursor.execute(query, (user_did, limit)) + # Личные сообщения + публичные от user/llm, которые не скрыты + query = """ + SELECT n.id, n.text, n.source, n.user_did, u.username, n.timestamp, n.hidden + FROM notes n + LEFT JOIN users u ON n.user_did = u.did + WHERE n.user_did = ? + OR ((n.source = 'user' OR n.source = 'llm') AND n.hidden = 0) + ORDER BY n.timestamp DESC + LIMIT ? + """ + cursor.execute(query, (user_did, limit)) return [dict(row) for row in cursor.fetchall()] @@ -790,6 +784,21 @@ class Storage: } return None + def get_user_info_by_did(self, did: str) -> dict | None: + cursor = self.conn.cursor() + cursor.execute( + "SELECT username, mail, operator FROM users WHERE did = ?", + (did,) + ) + result = cursor.fetchone() + if result: + return { + "username": result["username"], + "mail": result["mail"], + "operator": result["operator"] + } + return None + # Утилиты def close(self): diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py index 84a78dec45550979aba609152ca91e98560d1b73..c1be82705f3b7ae90687794849e106674cb9ba59 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py @@ -1,3 +1,5 @@ +# agents/notebook/views.py + from fastapi import APIRouter, Request, Form from fastapi.responses import RedirectResponse from fastapi.templating import Jinja2Templates @@ -43,7 +45,10 @@ def show_messages(request: Request, only_personal: bool = False): if not did: return RedirectResponse("/login", status_code=303) - is_operator = False # Пока не реализовано + # Получаем инфу о пользователе, чтобы понять, оператор ли он + user_info = storage.get_user_info_by_did(did) + is_operator = bool(user_info and user_info.get("operator")) + messages = storage.get_notes( limit=50, user_did=did, @@ -61,17 +66,18 @@ def show_messages(request: Request, only_personal: bool = False): def post_message( request: Request, text: str = Form(...), - hidden: str = Form(default=None) + hidden: str = Form(default="false") ): did = request.session.get("did", "anon") - is_hidden = 1 if hidden else 0 + is_hidden = 1 if hidden.lower() == "true" else 0 - storage.write_note( - content=text, - user_did=did, - source="user", - hidden=is_hidden - ) + if text.strip(): + storage.write_note( + content=text.strip(), + user_did=did, + source="user", + hidden=is_hidden + ) return RedirectResponse(url="/messages", status_code=303) @router.get("/login") diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py index 43463dc3ea01bae5c49b583e11943564c50f5f23..dc9d4b51f5630cffe68ae1fa7f0a161f7058e93c 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/web_ui.py @@ -12,7 +12,6 @@ process_name = os.path.splitext(os.path.basename(__file__))[0] from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates -#from agents.notebook.auth import router as auth_router from starlette.middleware.sessions import SessionMiddleware from agents.notebook.views import router as notebook_router from tools.storage import Storage @@ -25,7 +24,6 @@ app.add_middleware(SessionMiddleware, secret_key="очень_секретный_ app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "notebook/static")), name="static") templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "notebook/templates")) -#app.include_router(auth_router) app.include_router(notebook_router) @app.on_event("startup") diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html index b18931632fbd75266a9e96ebb45cbce4aeeaa7b8..698e26f31b53079518b3f2dae78b0e44975d60e4 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html @@ -1,6 +1,14 @@ -
-Нет учетки: зарегистрироваться \ No newline at end of file +{% if error %} +
{{ error }}
+{% endif %} + +
+ +
Нет учетки: Зарегистрироваться \ No newline at end of file diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html index 49af3e47eb307a59348b2690212663fe86e03e76..c972de9123c72098d5005ccae77de4f18b2cf7f3 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/messages.html @@ -25,10 +25,8 @@
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html index 4f88b1c5983c7bcd70dce2815ce38bf2955233ad..865e592197eb4b2a27efb317a5e2e361e99855c3 100644 --- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html +++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html @@ -1,7 +1,15 @@ -
-Есть учетка: войти \ No newline at end of file +{% if error %} +
{{ error }}
+{% endif %} + +
+ +
Есть учетка: Войти
\ No newline at end of file
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
index 8089952167393546672f5c9ef5a8ed01137aba4d..8cdd96fefbb740643a8604cdd2cca6ca87b2c000 100644
--- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
+++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/storage.py
@@ -7,6 +7,9 @@ import json
import uuid
from datetime import datetime, timedelta, UTC
+from werkzeug.security import generate_password_hash, check_password_hash
+from tools.identity import generate_did
+from tools.crypto import generate_keypair
SCRIPTS_BASE_PATH = "scripts"
@@ -747,21 +750,18 @@ class Storage:
return [dict(row) for row in cursor.fetchall()]
# Пользователи
- def _hash_password(self, password: str) -> str:
- return hashlib.sha256(password.encode()).hexdigest()
-
def register_user(self, username: str, mail: str, password: str) -> bool:
mail = mail.lower()
- did = f"did:example:{uuid.uuid4()}"
+ did = generate_did()
try:
self.conn.execute(
"INSERT INTO users (username, mail, password_hash, did) VALUES (?, ?, ?, ?)",
- (username, mail, self._hash_password(password), did)
+ (username, mail, generate_password_hash(password), did)
)
self.conn.commit()
return True
except sqlite3.IntegrityError:
- return False # уже существует (уникальность mail или did)
+ return False
def authenticate_user(self, mail: str, password: str) -> bool:
mail = mail.lower()
@@ -772,7 +772,7 @@ class Storage:
)
result = cursor.fetchone()
if result:
- return result["password_hash"] == self._hash_password(password)
+ return check_password_hash(result["password_hash"], password)
return False
def get_user_info(self, mail: str) -> dict | None:
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
index 8aa0ed551dbc5073a2ca3794385f83e03faf631c..dd07082af49db4df96e7fb678e26a8db220e5d2c 100644
--- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
+++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
@@ -1,44 +1,69 @@
-agent_id: did:hmp:dac57687-1839-423d-8624-c38324de2635
-agent_name: CognitiveCore
-agent_role: core
+# HMP Agent Configuration
+
+# === Общие параметры ===
+agent_id: "" # Оставьте пустым для генерации DiD автоматически
+agent_name: "CognitiveCore" # Имя агента
+agent_role: "core" # 'core' или 'shell'
+
+# === Прокси ===
+proxy_mode: false # false — прокси не используется, иначе true
+proxy_type: "socks5" # 'http', 'socks4', 'socks5' и т.д. (если proxy_mode: true)
+proxy_address: "127.0.0.1:9050"
+
+# === Функции ядра ===
+enable_llm: true # доступ к LLM
+
+serve_api: true # REST API
api_port: 8080
-bootstrap_responder: true
-debug: true
-default_llm: local-model
-default_user:
- email: user@example.com
- password: password
- username: user
-dht_enabled: true
+
+# === DHT-сеть и обмен знаниями ===
+dht_enabled: true # Включение участия в DHT-сети (включено принудительно!)
+dht_update: true # Регулярные обновления и публикация данных в DHT (включено принудительно!)
+bootstrap_responder: true # Агент отвечает на bootstrap-запросы (включено принудительно!)
dht_port: 20784
-dht_update: true
-enable_llm: true
-identity_agent: dac57687-1839-423d-8624-c38324de2635
+update_interval: 60 # секунд (для DHT-обновлений)
+
+# === LLM-бэкенды ===
llm_backends:
-- format: gguf
- name: local-model
- path: /models/gguf/mistral.gguf
- prompt_template: mistral
- type: local
-- api_key: lm-studio-any-key
- base_url: http://127.0.0.1:1234/v1
- model: mistral
- name: lmstudio-local
- provider: openai-compatible
- type: api
-- api_key: sk-...
- model: gpt-4o
- name: openai-gpt4o
- provider: openai
- type: api
-log_level: INFO
-notebook_ui: true
-proxy_address: 127.0.0.1:9050
-proxy_mode: false
-proxy_type: socks5
-serve_api: true
-ui_hosts:
-- 127.0.0.1
-- ::1
+ - name: "local-model"
+ type: "local"
+ path: "/models/gguf/mistral.gguf"
+ format: "gguf"
+ prompt_template: "mistral"
+
+ - name: "lmstudio-local"
+ type: "api"
+ provider: "openai-compatible"
+ model: "mistral" # или то, что LM Studio показывает как модель
+ api_key: "lm-studio-any-key" # может быть заглушкой
+ base_url: "http://127.0.0.1:1234/v1"
+
+ - name: "openai-gpt4o"
+ type: "api"
+ provider: "openai"
+ model: "gpt-4o"
+ api_key: "sk-..."
+
+ # Пользователь может добавить сколько угодно дополнительных локальных или сетевых LLM
+
+default_llm: "local-model" # если модели нет в списке `llm_backends` используется первая в списке
+
+# === Веб-интерфейс ===
+notebook_ui: true # UI в виде блокнота
+# ui_hosts:
+# - "0.0.0.0" # (небезопасно) доступ с любых IPv4-адресов
+# - "::" # (небезопасно) доступ с любых IPv6-адресов
+ui_hosts: # Какие IP прослушиваются, ["0.0.0.0"; "::"] - доступен везде
+ - "127.0.0.1"
+ - "::1"
ui_port: 8765
-update_interval: 60
+
+# === Данные пользователя ===
+default_user:
+ username: "user"
+ email: "user@example.com"
+ password: "password" # пусто при инициализации, будет установлен при регистрации
+
+# === Отладка и логгирование ===
+debug: true
+log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html
index fe7517546f9e15a37abe30f5b3bffc53e925cea0..b18931632fbd75266a9e96ebb45cbce4aeeaa7b8 100644
--- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html
+++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html
@@ -3,3 +3,4 @@
+Нет учетки: зарегистрироваться
\ No newline at end of file
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html
index 62462a8a389980ca2f9bb0cb567352a499f1b39a..4f88b1c5983c7bcd70dce2815ce38bf2955233ad 100644
--- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html
+++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/register.html
@@ -4,3 +4,4 @@
+Есть учетка: войти
\ No newline at end of file
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
index dd07082af49db4df96e7fb678e26a8db220e5d2c..8aa0ed551dbc5073a2ca3794385f83e03faf631c 100644
--- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
+++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/config.yml
@@ -1,69 +1,44 @@
-# HMP Agent Configuration
-
-# === Общие параметры ===
-agent_id: "" # Оставьте пустым для генерации DiD автоматически
-agent_name: "CognitiveCore" # Имя агента
-agent_role: "core" # 'core' или 'shell'
-
-# === Прокси ===
-proxy_mode: false # false — прокси не используется, иначе true
-proxy_type: "socks5" # 'http', 'socks4', 'socks5' и т.д. (если proxy_mode: true)
-proxy_address: "127.0.0.1:9050"
-
-# === Функции ядра ===
-enable_llm: true # доступ к LLM
-
-serve_api: true # REST API
+agent_id: did:hmp:dac57687-1839-423d-8624-c38324de2635
+agent_name: CognitiveCore
+agent_role: core
api_port: 8080
-
-# === DHT-сеть и обмен знаниями ===
-dht_enabled: true # Включение участия в DHT-сети (включено принудительно!)
-dht_update: true # Регулярные обновления и публикация данных в DHT (включено принудительно!)
-bootstrap_responder: true # Агент отвечает на bootstrap-запросы (включено принудительно!)
+bootstrap_responder: true
+debug: true
+default_llm: local-model
+default_user:
+ email: user@example.com
+ password: password
+ username: user
+dht_enabled: true
dht_port: 20784
-update_interval: 60 # секунд (для DHT-обновлений)
-
-# === LLM-бэкенды ===
+dht_update: true
+enable_llm: true
+identity_agent: dac57687-1839-423d-8624-c38324de2635
llm_backends:
- - name: "local-model"
- type: "local"
- path: "/models/gguf/mistral.gguf"
- format: "gguf"
- prompt_template: "mistral"
-
- - name: "lmstudio-local"
- type: "api"
- provider: "openai-compatible"
- model: "mistral" # или то, что LM Studio показывает как модель
- api_key: "lm-studio-any-key" # может быть заглушкой
- base_url: "http://127.0.0.1:1234/v1"
-
- - name: "openai-gpt4o"
- type: "api"
- provider: "openai"
- model: "gpt-4o"
- api_key: "sk-..."
-
- # Пользователь может добавить сколько угодно дополнительных локальных или сетевых LLM
-
-default_llm: "local-model" # если модели нет в списке `llm_backends` используется первая в списке
-
-# === Веб-интерфейс ===
-notebook_ui: true # UI в виде блокнота
-# ui_hosts:
-# - "0.0.0.0" # (небезопасно) доступ с любых IPv4-адресов
-# - "::" # (небезопасно) доступ с любых IPv6-адресов
-ui_hosts: # Какие IP прослушиваются, ["0.0.0.0"; "::"] - доступен везде
- - "127.0.0.1"
- - "::1"
+- format: gguf
+ name: local-model
+ path: /models/gguf/mistral.gguf
+ prompt_template: mistral
+ type: local
+- api_key: lm-studio-any-key
+ base_url: http://127.0.0.1:1234/v1
+ model: mistral
+ name: lmstudio-local
+ provider: openai-compatible
+ type: api
+- api_key: sk-...
+ model: gpt-4o
+ name: openai-gpt4o
+ provider: openai
+ type: api
+log_level: INFO
+notebook_ui: true
+proxy_address: 127.0.0.1:9050
+proxy_mode: false
+proxy_type: socks5
+serve_api: true
+ui_hosts:
+- 127.0.0.1
+- ::1
ui_port: 8765
-
-# === Данные пользователя ===
-default_user:
- username: "user"
- email: "user@example.com"
- password: "password" # пусто при инициализации, будет установлен при регистрации
-
-# === Отладка и логгирование ===
-debug: true
-log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
+update_interval: 60
diff --git a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html
index 43779a81588fddd9a75d78df8fd90a56d2a8b077..fe7517546f9e15a37abe30f5b3bffc53e925cea0 100644
--- a/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html
+++ b/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/login.html
@@ -1,14 +1,5 @@
-
-
-
-
-