GitHub Action commited on
Commit
2f9ca82
·
1 Parent(s): 0118811

Sync from GitHub with Git LFS

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. agents/notebook.py +20 -30
  2. agents/notebook/static/style.css +0 -0
  3. agents/notebook/templates/messages.html +18 -0
  4. agents/notebook/views.py +24 -1
  5. agents/readme.md +8 -6
  6. agents/tools/db_structure.sql +7 -0
  7. agents/tools/storage.py +41 -9
  8. hf_repo/hf_repo/agents/init.py +7 -1
  9. hf_repo/hf_repo/agents/requirements.txt +1 -0
  10. hf_repo/hf_repo/hf_repo/agents/readme.md +1 -1
  11. hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +2 -2
  12. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +1 -1
  13. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +1 -1
  14. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py +34 -11
  15. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py +24 -7
  16. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/chat.html +30 -0
  17. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py +29 -0
  18. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +0 -1
  19. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +1 -0
  20. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.py +9 -4
  21. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +7 -5
  22. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/add_message.py +2 -0
  23. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py +2 -0
  24. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py +2 -0
  25. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py +2 -0
  26. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py +2 -0
  27. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +2 -0
  28. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/check_init.py +1 -1
  29. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/command_executor.py +1 -1
  30. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/command_parser.py +1 -1
  31. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/context_builder.py +1 -1
  32. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/crypto.py +1 -1
  33. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/identity.py +1 -1
  34. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/llm.py +1 -1
  35. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/memory_utils.py +1 -1
  36. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/peer_comm.py +2 -0
  37. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/similarity.py +1 -1
  38. hf_repo/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/readme.md +54 -43
  39. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +9 -0
  40. hf_repo/hf_repo/hf_repo/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/readme.md +1 -1
  41. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +1 -1
  42. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/readme.md +4 -1
  43. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +2 -1
  44. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/mcp_server.py +325 -0
  45. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/qa.py +19 -0
  46. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/add_message.py +26 -0
  47. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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.py +19 -39
  48. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/mailer.py +14 -0
  49. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/requirements.txt +6 -1
  50. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/start_repl.bat +2 -4
agents/notebook.py CHANGED
@@ -1,45 +1,35 @@
1
- # agents/notebook.py
2
-
3
- import os
4
- import sys
5
- import threading
6
- import sqlite3
7
- import uvicorn
8
-
9
- sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
10
-
11
- # Добавляем корень проекта в sys.path для корректного импорта
12
- sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
13
-
14
  from fastapi import FastAPI
15
  from fastapi.staticfiles import StaticFiles
16
  from fastapi.templating import Jinja2Templates
17
-
18
- # Импорт маршрутов
19
  from agents.notebook.auth import router as auth_router
20
- from agents.notebook.views import router as views_router
 
 
 
21
 
22
- # Создание FastAPI-приложения
23
  app = FastAPI()
24
 
25
- # Настройка статических файлов и шаблонов
26
- static_dir = os.path.join(os.path.dirname(__file__), "static")
27
- templates_dir = os.path.join(os.path.dirname(__file__), "templates")
28
- app.mount("/static", StaticFiles(directory=static_dir), name="static")
29
- templates = Jinja2Templates(directory=templates_dir)
30
 
31
- # Подключение роутеров
32
  app.include_router(auth_router)
33
- app.include_router(views_router)
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
  def run_notebook(host: str = "127.0.0.1", port: int = 8000):
36
- """
37
- Запуск FastAPI-сервера в отдельном потоке.
38
- """
39
  uvicorn.run(app, host=host, port=port)
40
 
41
  if __name__ == "__main__":
42
  print("[*] Запуск пользовательского интерфейса...")
43
- thread = threading.Thread(target=run_notebook, daemon=True)
44
- thread.start()
45
- thread.join()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  from fastapi import FastAPI
2
  from fastapi.staticfiles import StaticFiles
3
  from fastapi.templating import Jinja2Templates
 
 
4
  from agents.notebook.auth import router as auth_router
5
+ from agents.notebook.views import router as notebook_router
6
+ from agents.storage import storage # если используется
7
+
8
+ process_name = os.path.splitext(os.path.basename(__file__))[0]
9
 
 
10
  app = FastAPI()
11
 
12
+ app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "notebook/static")), name="static")
13
+ templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "notebook/templates"))
 
 
 
14
 
 
15
  app.include_router(auth_router)
16
+ app.include_router(notebook_router)
17
+
18
+ @app.on_event("startup")
19
+ async def start_heartbeat():
20
+ asyncio.create_task(heartbeat_loop())
21
+
22
+ async def heartbeat_loop():
23
+ while True:
24
+ storage.update_heartbeat(process_name)
25
+ if storage.check_stop_flag(process_name):
26
+ print("⛔ Получен сигнал остановки.")
27
+ break
28
+ await asyncio.sleep(60)
29
 
30
  def run_notebook(host: str = "127.0.0.1", port: int = 8000):
 
 
 
31
  uvicorn.run(app, host=host, port=port)
32
 
33
  if __name__ == "__main__":
34
  print("[*] Запуск пользовательского интерфейса...")
35
+ run_notebook()
 
 
agents/notebook/static/style.css ADDED
File without changes
agents/notebook/templates/messages.html ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- templates/messages.html -->
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <title>Отправка сообщения агенту</title>
6
+ </head>
7
+ <body>
8
+ <h2>Новое сообщение</h2>
9
+ <form method="post" action="/messages">
10
+ <label for="text">Сообщение:</label><br>
11
+ <textarea name="text" rows="4" cols="50" required></textarea><br><br>
12
+
13
+ <label><input type="checkbox" name="is_private" value="true"> Приватное сообщение</label><br><br>
14
+
15
+ <button type="submit">Отправить</button>
16
+ </form>
17
+ </body>
18
+ </html>
agents/notebook/views.py CHANGED
@@ -9,7 +9,7 @@ router = APIRouter()
9
  templates = Jinja2Templates(directory="agents/notebook/templates")
10
  storage = Storage()
11
 
12
- DID = "did:example:local-user" # 🔧 временная заглушка
13
 
14
  @router.get("/chat")
15
  def chat_page(request: Request):
@@ -27,3 +27,26 @@ def submit_note(request: Request, message: str = Form(...)):
27
  (message.strip(), "user", DID)
28
  )
29
  return RedirectResponse(url="/chat", status_code=303)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  templates = Jinja2Templates(directory="agents/notebook/templates")
10
  storage = Storage()
11
 
12
+ DID = "did:example:local-user" # временно
13
 
14
  @router.get("/chat")
15
  def chat_page(request: Request):
 
27
  (message.strip(), "user", DID)
28
  )
29
  return RedirectResponse(url="/chat", status_code=303)
30
+
31
+ @router.get("/messages")
32
+ def show_messages(request: Request):
33
+ messages = storage.get_notes(limit=50) # должна быть в Storage
34
+ return templates.TemplateResponse("messages.html", {
35
+ "request": request,
36
+ "messages": messages
37
+ })
38
+
39
+ @router.post("/messages")
40
+ def post_message(
41
+ request: Request,
42
+ text: str = Form(...),
43
+ role: str = Form(default="user"),
44
+ user_did: str = Form(default="anon")
45
+ ):
46
+ storage.write_note(
47
+ content=text,
48
+ role=role,
49
+ user_did=user_did,
50
+ source="web"
51
+ )
52
+ return RedirectResponse(url="/messages", status_code=303)
agents/readme.md CHANGED
@@ -60,12 +60,14 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
60
  │   ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
61
  │   ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
62
  │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
63
- │   └── [templates/](notebook/templates/) ← HTML-шаблоны и стили
64
-        ├── [`index.html`](notebook/templates/index.html) ← Основа
65
-        ├── [`chat.html`](notebook/templates/chat.html) ← Общий и приватный чат
66
-        ├── [`login.html`](notebook/templates/login.html) ← Вход
67
-        ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
68
-        └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
 
 
69
  ├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
70
  ├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
71
  └── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
 
60
  │   ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
61
  │   ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
62
  │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
63
+ │   ├── [templates/](notebook/templates/) ← HTML-шаблоны
64
+    │   ├── [`index.html`](notebook/templates/index.html) ← Основа
65
+    │   ├── [`chat.html`](notebook/templates/chat.html) ← Форма вывода сообщений
66
+    │   ├── [`messages.html`](notebook/templates/messages.html) ← Форма отправки сообщений
67
+    │   ├── [`login.html`](notebook/templates/login.html) ← Вход в аккаунт
68
+    │   ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
69
+ │   └── [static/](notebook/static/) ← Статические файлы
70
+ │       └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
71
  ├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
72
  ├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
73
  └── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
agents/tools/db_structure.sql CHANGED
@@ -67,6 +67,13 @@ CREATE TABLE IF NOT EXISTS process_log (
67
  llm_id TEXT -- Идентификатор LLM
68
  );
69
 
 
 
 
 
 
 
 
70
  -- Долговременная память LLM
71
  CREATE TABLE IF NOT EXISTS llm_memory (
72
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
 
67
  llm_id TEXT -- Идентификатор LLM
68
  );
69
 
70
+ -- Управление основными процессами
71
+ CREATE TABLE IF NOT EXISTS main_process (
72
+ name TEXT PRIMARY KEY, -- название процесса (уникальное)
73
+ heartbeat TEXT, -- последний "пинг" (ISO-время)
74
+ stop INTEGER DEFAULT 0 -- если 1 — процесс должен завершиться
75
+ );
76
+
77
  -- Долговременная память LLM
78
  CREATE TABLE IF NOT EXISTS llm_memory (
79
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
agents/tools/storage.py CHANGED
@@ -204,16 +204,10 @@ class Storage:
204
 
205
  # Методы для заметок
206
 
207
- def write_note(self, text, tags=None):
208
- timestamp = datetime.utcnow().isoformat()
209
- tag_str = ",".join(tags) if tags else ""
210
- self.conn.execute(
211
- 'INSERT INTO notes (text, tags, timestamp) VALUES (?, ?, ?)',
212
- (text, tag_str, timestamp)
213
- )
214
- self.conn.commit()
215
 
216
- def read_notes(self, limit=10, tag_filter=None):
217
  cursor = self.conn.cursor()
218
  if tag_filter:
219
  if isinstance(tag_filter, list):
@@ -668,6 +662,44 @@ class Storage:
668
  self.conn.commit()
669
  return cursor.lastrowid
670
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
671
  # Утилиты
672
 
673
  def close(self):
 
204
 
205
  # Методы для заметок
206
 
207
+ #def write_note(self, text, tags=None):
208
+ # переехал в Web-интерфейс и API
 
 
 
 
 
 
209
 
210
+ def get_notes_by_tags(self, limit=10, tag_filter=None):
211
  cursor = self.conn.cursor()
212
  if tag_filter:
213
  if isinstance(tag_filter, list):
 
662
  self.conn.commit()
663
  return cursor.lastrowid
664
 
665
+ # Управление основными процессами
666
+ def update_heartbeat(self, name: str):
667
+ now = datetime.utcnow().isoformat()
668
+ self.conn.execute(
669
+ "INSERT INTO main_process (name, heartbeat, stop) VALUES (?, ?, 0) "
670
+ "ON CONFLICT(name) DO UPDATE SET heartbeat = excluded.heartbeat",
671
+ (name, now)
672
+ )
673
+ self.conn.commit()
674
+
675
+ def check_stop_flag(self, name: str) -> bool:
676
+ cursor = self.conn.execute("SELECT stop FROM main_process WHERE name = ?", (name,))
677
+ row = cursor.fetchone()
678
+ if row and row[0] == 1:
679
+ self.conn.execute("UPDATE main_process SET stop = 0 WHERE name = ?", (name,))
680
+ self.conn.commit()
681
+ return True
682
+ return False
683
+
684
+ # Web-интерфейс и API
685
+ def write_note(self, content, role="user", user_did="anon", source="web"):
686
+ timestamp = datetime.utcnow().isoformat()
687
+ self.conn.execute("""
688
+ INSERT INTO notes (text, role, user_did, source, timestamp)
689
+ VALUES (?, ?, ?, ?, ?)
690
+ """, (content, role, user_did, source, timestamp))
691
+ self.conn.commit()
692
+
693
+ def get_notes(self, limit=50):
694
+ cursor = self.conn.cursor()
695
+ cursor.execute("""
696
+ SELECT text, role, source, user_did, timestamp FROM notes
697
+ WHERE hidden = 0
698
+ ORDER BY timestamp DESC
699
+ LIMIT ?
700
+ """, (limit,))
701
+ return [dict(row) for row in cursor.fetchall()]
702
+
703
  # Утилиты
704
 
705
  def close(self):
hf_repo/hf_repo/agents/init.py CHANGED
@@ -11,6 +11,7 @@ import sqlite3
11
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
12
 
13
  from datetime import datetime
 
14
  from tools.storage import Storage
15
  from tools.identity import generate_did
16
  from tools.crypto import generate_keypair
@@ -56,12 +57,17 @@ def init_user(storage, config):
56
  if not user.get("email"):
57
  print("[-] Не указан email пользователя — пропуск.")
58
  return
 
 
 
 
 
59
 
60
  did = generate_did()
61
  user_entry = {
62
  "username": user.get("username", "user"),
63
  "mail": user["email"],
64
- "password_hash": user.get("password_hash", ""),
65
  "did": did,
66
  "ban": None,
67
  "info": json.dumps({}),
 
11
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
12
 
13
  from datetime import datetime
14
+ from werkzeug.security import generate_password_hash
15
  from tools.storage import Storage
16
  from tools.identity import generate_did
17
  from tools.crypto import generate_keypair
 
57
  if not user.get("email"):
58
  print("[-] Не указан email пользователя — пропуск.")
59
  return
60
+ password = user.get("password")
61
+ if not password:
62
+ print("[-] Не указан пароль пользователя — пропуск.")
63
+ return
64
+ password_hash = generate_password_hash(password)
65
 
66
  did = generate_did()
67
  user_entry = {
68
  "username": user.get("username", "user"),
69
  "mail": user["email"],
70
+ "password_hash": password_hash,
71
  "did": did,
72
  "ban": None,
73
  "info": json.dumps({}),
hf_repo/hf_repo/agents/requirements.txt CHANGED
@@ -11,3 +11,4 @@ uvicorn
11
  jinja2
12
  python-multipart
13
  passlib[bcrypt]
 
 
11
  jinja2
12
  python-multipart
13
  passlib[bcrypt]
14
+ werkzeug
hf_repo/hf_repo/hf_repo/agents/readme.md CHANGED
@@ -62,7 +62,7 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
62
  │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
63
  │   └── [templates/](notebook/templates/) ← HTML-шаблоны и стили
64
  │       ├── [`index.html`](notebook/templates/index.html) ← Основа
65
- │       ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
66
  │       ├── [`login.html`](notebook/templates/login.html) ← Вход
67
  │       ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
68
  │       └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
 
62
  │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
63
  │   └── [templates/](notebook/templates/) ← HTML-шаблоны и стили
64
  │       ├── [`index.html`](notebook/templates/index.html) ← Основа
65
+ │       ├── [`chat.html`](notebook/templates/chat.html) ← Общий и приватный чат
66
  │       ├── [`login.html`](notebook/templates/login.html) ← Вход
67
  │       ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
68
  │       └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md CHANGED
@@ -73,8 +73,8 @@
73
  - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
  - для управления своей *идентичностью* `identity` и *настройками* `config`
75
  - для управления списком известных HMP-агентов `agent_peers`
76
- - для выбора *текущего основного LLM*
77
- - для управления дополнительными утилитами и базами данных
78
  - для постановки задачи (выполняется асинхронно) другой LLM
79
  - для *взаимодействия с Mesh*
80
  - для управления *внешними процессами* из `process_log` (запустить процесс, остановить процесс, пометить запрос как обработанный)
 
73
  - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
  - для управления своей *идентичностью* `identity` и *настройками* `config`
75
  - для управления списком известных HMP-агентов `agent_peers`
76
+ - для выбора *текущего основного LLM* из `llm_registry`
77
+ - для управления дополнительными утилитами и базами данных `agent_scripts` и `agent_tables`
78
  - для постановки задачи (выполняется асинхронно) другой LLM
79
  - для *взаимодействия с Mesh*
80
  - для управления *внешними процессами* из `process_log` (запустить процесс, остановить процесс, пометить запрос как обработанный)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md CHANGED
@@ -72,7 +72,7 @@
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
  - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
  - для управления своей *идентичностью* `identity` и *настройками* `config`
75
- - для управления списком известных HMP-агентов
76
  - для выбора *текущего основного LLM*
77
  - для управления дополнительными утилитами и базами данных
78
  - для постановки задачи (выполняется асинхронно) другой LLM
 
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
  - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
  - для управления своей *идентичностью* `identity` и *настройками* `config`
75
+ - для управления списком известных HMP-агентов `agent_peers`
76
  - для выбора *текущего основного LLM*
77
  - для управления дополнительными утилитами и базами данных
78
  - для постановки задачи (выполняется асинхронно) другой LLM
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md CHANGED
@@ -68,7 +68,7 @@
68
  - запрос детальной *справки* по команде
69
  - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
70
  - для отправки сообщений другим агентам
71
- - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
  - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
  - для управления своей *идентичностью* `identity` и *настройками* `config`
 
68
  - запрос детальной *справки* по команде
69
  - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
70
  - для отправки сообщений другим агентам
71
+ - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись)
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
  - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
  - для управления своей *идентичностью* `identity` и *настройками* `config`
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py CHANGED
@@ -6,7 +6,10 @@ import yaml
6
  import json
7
  import time
8
  import uuid
 
 
9
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
 
10
  from datetime import datetime
11
  from tools.storage import Storage
12
  from tools.identity import generate_did
@@ -107,18 +110,38 @@ def ensure_directories(config):
107
  else:
108
  print(f"[=] Каталог уже существует: {path}")
109
 
110
- def main():
111
- print("[*] Запуск инициализации HMP-агента...")
 
 
 
 
 
 
 
 
 
 
112
  config = load_config(CONFIG_PATH)
113
- ensure_directories(config)
114
- storage = Storage(config)
115
-
116
- init_identity(storage, config)
117
- init_user(storage, config)
118
- init_llm_backends(storage, config)
119
- init_config_table(storage, config)
 
 
 
 
 
 
 
 
 
 
120
 
121
- print("[✓] Инициализация завершена.")
122
 
123
  if __name__ == "__main__":
124
- main()
 
6
  import json
7
  import time
8
  import uuid
9
+ import sqlite3
10
+
11
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
12
+
13
  from datetime import datetime
14
  from tools.storage import Storage
15
  from tools.identity import generate_did
 
110
  else:
111
  print(f"[=] Каталог уже существует: {path}")
112
 
113
+ def is_db_initialized(db_path):
114
+ if not os.path.exists(db_path):
115
+ return False
116
+ try:
117
+ with sqlite3.connect(db_path) as conn:
118
+ cursor = conn.cursor()
119
+ cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
120
+ return cursor.fetchone() is not None
121
+ except Exception:
122
+ return False
123
+
124
+ def ensure_db_initialized():
125
  config = load_config(CONFIG_PATH)
126
+ db_path = config.get("db_path", "./data/agent_storage.db")
127
+
128
+ if not is_db_initialized(db_path):
129
+ print("[*] БД не инициализирована — выполняем инициализацию.")
130
+ try:
131
+ ensure_directories(config)
132
+ storage = Storage(config)
133
+ init_identity(storage, config)
134
+ init_user(storage, config)
135
+ init_llm_backends(storage, config)
136
+ init_config_table(storage, config)
137
+ save_config(CONFIG_PATH, config)
138
+ except Exception as e:
139
+ print(f"[!] Ошибка при инициализации: {e}")
140
+ sys.exit(1)
141
+ else:
142
+ print("[=] БД уже инициализирована.")
143
 
144
+ return config
145
 
146
  if __name__ == "__main__":
147
+ ensure_db_initialized()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py CHANGED
@@ -1,28 +1,45 @@
1
  # agents/notebook.py
2
 
3
- import uvicorn
 
4
  import threading
5
  import sqlite3
 
 
 
6
 
 
7
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
8
 
9
  from fastapi import FastAPI
10
- from agents.notebook.auth import router as auth_router
11
- from agents.notebook.views import router as views_router
12
  from fastapi.staticfiles import StaticFiles
13
  from fastapi.templating import Jinja2Templates
14
 
 
 
 
 
 
15
  app = FastAPI()
16
- app.mount("/static", StaticFiles(directory="agents/notebook/static"), name="static")
17
- templates = Jinja2Templates(directory="agents/notebook/templates")
18
 
 
 
 
 
 
 
 
19
  app.include_router(auth_router)
20
  app.include_router(views_router)
21
 
22
- def run_notebook():
23
- uvicorn.run(app, host="127.0.0.1", port=8000)
 
 
 
24
 
25
  if __name__ == "__main__":
26
  print("[*] Запуск пользовательского интерфейса...")
27
  thread = threading.Thread(target=run_notebook, daemon=True)
28
  thread.start()
 
 
1
  # agents/notebook.py
2
 
3
+ import os
4
+ import sys
5
  import threading
6
  import sqlite3
7
+ import uvicorn
8
+
9
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
10
 
11
+ # Добавляем корень проекта в sys.path для корректного импорта
12
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
13
 
14
  from fastapi import FastAPI
 
 
15
  from fastapi.staticfiles import StaticFiles
16
  from fastapi.templating import Jinja2Templates
17
 
18
+ # Импорт маршрутов
19
+ from agents.notebook.auth import router as auth_router
20
+ from agents.notebook.views import router as views_router
21
+
22
+ # Создание FastAPI-приложения
23
  app = FastAPI()
 
 
24
 
25
+ # Настройка статических файлов и шаблонов
26
+ static_dir = os.path.join(os.path.dirname(__file__), "static")
27
+ templates_dir = os.path.join(os.path.dirname(__file__), "templates")
28
+ app.mount("/static", StaticFiles(directory=static_dir), name="static")
29
+ templates = Jinja2Templates(directory=templates_dir)
30
+
31
+ # Подключение роутеров
32
  app.include_router(auth_router)
33
  app.include_router(views_router)
34
 
35
+ def run_notebook(host: str = "127.0.0.1", port: int = 8000):
36
+ """
37
+ Запуск FastAPI-сервера в отдельном потоке.
38
+ """
39
+ uvicorn.run(app, host=host, port=port)
40
 
41
  if __name__ == "__main__":
42
  print("[*] Запуск пользовательского интерфейса...")
43
  thread = threading.Thread(target=run_notebook, daemon=True)
44
  thread.start()
45
+ thread.join()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/templates/chat.html ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ru">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Чат</title>
6
+ <style>
7
+ body { font-family: sans-serif; margin: 2em; }
8
+ .note { margin-bottom: 1em; border-bottom: 1px solid #ddd; padding-bottom: 0.5em; }
9
+ .source-user { color: green; }
10
+ .source-llm { color: blue; }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <h2>📜 Сообщения</h2>
15
+
16
+ {% for note in notes %}
17
+ <div class="note">
18
+ <div>
19
+ <b class="source-{{ note.source }}">{{ note.source }}</b> @ {{ note.timestamp }}:
20
+ </div>
21
+ <div>{{ note.text }}</div>
22
+ </div>
23
+ {% endfor %}
24
+
25
+ <form method="post">
26
+ <textarea name="message" rows="4" cols="60" placeholder="Введите сообщение..."></textarea><br>
27
+ <button type="submit">Отправить</button>
28
+ </form>
29
+ </body>
30
+ </html>
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/views.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # agents/notebook/views.py
2
+
3
+ from fastapi import APIRouter, Request, Form
4
+ from fastapi.responses import RedirectResponse
5
+ from fastapi.templating import Jinja2Templates
6
+ from tools.storage import Storage
7
+
8
+ router = APIRouter()
9
+ templates = Jinja2Templates(directory="agents/notebook/templates")
10
+ storage = Storage()
11
+
12
+ DID = "did:example:local-user" # 🔧 временная заглушка
13
+
14
+ @router.get("/chat")
15
+ def chat_page(request: Request):
16
+ notes = storage.fetchall(
17
+ "SELECT text, timestamp, source FROM notes WHERE hidden=0 AND user_did=? ORDER BY timestamp DESC LIMIT 20",
18
+ (DID,)
19
+ )
20
+ return templates.TemplateResponse("chat.html", {"request": request, "notes": notes})
21
+
22
+ @router.post("/chat")
23
+ def submit_note(request: Request, message: str = Form(...)):
24
+ if message.strip():
25
+ storage.execute(
26
+ "INSERT INTO notes (text, source, user_did) VALUES (?, ?, ?)",
27
+ (message.strip(), "user", DID)
28
+ )
29
+ return RedirectResponse(url="/chat", status_code=303)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md CHANGED
@@ -44,7 +44,6 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
44
  │   ├── [`db_structure.sql`](tools/db_structure.sql) ← БД SQL
45
  │   ├── [`db_structure.md`](tools/db_structure.md) ← Описание БД SQL
46
  │   ├── [`storage.py`](tools/storage.py) ← Реализация базового хранилища (`Storage`), подключение SQLite
47
- │   ├── [`check_init.py`](tools/check_init.py) ← Проверка инициализации БД
48
  │   ├── [`config_utils.py`](tools/config_utils.py) ← Обновляет JSON-файл конфигурации указанными значениями
49
  │   ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
50
  │   ├── [`identity.py`](tools/identity.py) ← Генерация DiD
 
44
  │   ├── [`db_structure.sql`](tools/db_structure.sql) ← БД SQL
45
  │   ├── [`db_structure.md`](tools/db_structure.md) ← Описание БД SQL
46
  │   ├── [`storage.py`](tools/storage.py) ← Реализация базового хранилища (`Storage`), подключение SQLite
 
47
  │   ├── [`config_utils.py`](tools/config_utils.py) ← Обновляет JSON-файл конфигурации указанными значениями
48
  │   ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
49
  │   ├── [`identity.py`](tools/identity.py) ← Генерация DiD
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat CHANGED
@@ -1,3 +1,4 @@
 
1
  echo --------------------------
2
  echo Installing requirements...
3
  echo --------------------------
 
1
+ @echo off
2
  echo --------------------------
3
  echo Installing requirements...
4
  echo --------------------------
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.py CHANGED
@@ -1,16 +1,21 @@
1
  # agents/start_repl.py
2
 
 
 
 
 
3
  import threading
4
- from tools.check_init import ensure_db_initialized
5
 
6
  # Проверка инициализации (вернёт config, если всё ОК)
7
  config = ensure_db_initialized()
8
 
9
  # ⚙️ Включение/отключение компонентов
10
- ENABLE_REPL = True
 
11
  ENABLE_UI = True
12
- ENABLE_MESH = True
13
- ENABLE_SYNC = True
14
 
15
  def start_all():
16
  """
 
1
  # agents/start_repl.py
2
 
3
+ import sys
4
+ import os
5
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
6
+
7
  import threading
8
+ from agents.init import ensure_db_initialized
9
 
10
  # Проверка инициализации (вернёт config, если всё ОК)
11
  config = ensure_db_initialized()
12
 
13
  # ⚙️ Включение/отключение компонентов
14
+ # True | False
15
+ ENABLE_REPL = False
16
  ENABLE_UI = True
17
+ ENABLE_MESH = False
18
+ ENABLE_SYNC = False
19
 
20
  def start_all():
21
  """
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md CHANGED
@@ -31,6 +31,10 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
31
  ├── [`start_repl.bat`](start_repl.bat) ← Запуск агента в REPL-режиме (bat)
32
  ├── [`start_repl.sh`](start_repl.sh) ← Запуск агента в REPL-режиме (sh)
33
  ├── [`start_repl.py`](start_repl.py) ← Запуск агента в REPL-режиме (py)
 
 
 
 
34
  ├── [`mcp_server.py`](mcp_server.py) ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
35
  ├── [`init.py`](init.py) ← Инициализация БД
36
  ├── [`logger.py`](logger.py) ← Ведение логов
@@ -45,9 +49,7 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
45
  │   ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
46
  │   ├── [`identity.py`](tools/identity.py) ← Генерация DiD
47
  │   ├── [`llm.py`](tools/llm.py) ← Работа с LLM (вызов, выбор модели, системный промпт)
48
- │   ├── [`agent_mesh_listener.py`](tools/agent_mesh_listener.py) ← Прием входящих сообщений от других HMP-агентов
49
  │   ├── [`peer_comm.py`](tools/peer_comm.py) ← Низкоуровневые P2P-запросы (отправка, ping, мета)
50
- │   ├── [`peer_sync.py`](tools/peer_sync.py) ← Фоновая синхронизация с другими пирам
51
  │   ├── [`peers.py`](tools/peers.py) ← Реестр известных пиров (id, ключи, адреса)
52
  │   ├── [`memory_utils.py`](tools/memory_utils.py) ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
53
  │   ├── [`context_builder.py`](tools/context_builder.py) ← Сбор всех `контекстов` из БД и их фильтрация
@@ -59,12 +61,12 @@ FastAPI-сервер, предоставляющий HTTP-интерфейс к
59
  │   ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
60
  │   ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
61
  │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
62
- │   ├── [templates/](notebook/templates/) ← HTML-шаблоны и стили
63
  │       ├── [`index.html`](notebook/templates/index.html) ← Основа
64
  │       ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
65
  │       ├── [`login.html`](notebook/templates/login.html) ← Вход
66
  │       ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
67
- │       ├── [`style.css`](notebook/templates/style.css) ← Таблица стилей
68
  ├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
69
  ├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
70
- ├── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
 
31
  ├── [`start_repl.bat`](start_repl.bat) ← Запуск агента в REPL-режиме (bat)
32
  ├── [`start_repl.sh`](start_repl.sh) ← Запуск агента в REPL-режиме (sh)
33
  ├── [`start_repl.py`](start_repl.py) ← Запуск агента в REPL-режиме (py)
34
+ ├── [`repl.ru`](repl.ru) ← REPL-цикл
35
+ ├── [`notebook.py`](notebook.py) ← UI-интерфейс
36
+ ├── [`agent_mesh_listener.py`](tools/agent_mesh_listener.py) ← Прием входящих сообщений от других HMP-агентов
37
+ ├── [`peer_sync.py`](tools/peer_sync.py) ← Фоновая синхронизация с другими пирам
38
  ├── [`mcp_server.py`](mcp_server.py) ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
39
  ├── [`init.py`](init.py) ← Инициализация БД
40
  ├── [`logger.py`](logger.py) ← Ведение логов
 
49
  │   ├── [`crypto.py`](tools/crypto.py) ← Создание и шифрование ключей RSA/Ed25519
50
  │   ├── [`identity.py`](tools/identity.py) ← Генерация DiD
51
  │   ├── [`llm.py`](tools/llm.py) ← Работа с LLM (вызов, выбор модели, системный промпт)
 
52
  │   ├── [`peer_comm.py`](tools/peer_comm.py) ← Низкоуровневые P2P-запросы (отправка, ping, мета)
 
53
  │   ├── [`peers.py`](tools/peers.py) ← Реестр известных пиров (id, ключи, адреса)
54
  │   ├── [`memory_utils.py`](tools/memory_utils.py) ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
55
  │   ├── [`context_builder.py`](tools/context_builder.py) ← Сбор всех `контекстов` из БД и их фильтрация
 
61
  │   ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
62
  │   ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
63
  │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
64
+ │   └── [templates/](notebook/templates/) ← HTML-шаблоны и стили
65
  │       ├── [`index.html`](notebook/templates/index.html) ← Основа
66
  │       ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
67
  │       ├── [`login.html`](notebook/templates/login.html) ← Вход
68
  │       ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
69
+ │       └── [`style.css`](notebook/templates/style.css) ← Таблица стилей
70
  ├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
71
  ├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
72
+ └── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/add_message.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import argparse
2
  from datetime import datetime
3
  from tools.storage import Storage
 
1
+ # agents/add_message.py
2
+
3
  import argparse
4
  from datetime import datetime
5
  from tools.storage import Storage
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import os
2
  import sys
3
  import yaml
 
1
+ # agents/init.py
2
+
3
  import os
4
  import sys
5
  import yaml
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import json
2
  import os
3
  from datetime import datetime
 
1
+ # agents/logger.py
2
+
3
  import json
4
  import os
5
  from datetime import datetime
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import uvicorn
2
  import threading
3
  import sqlite3
 
1
+ # agents/notebook.py
2
+
3
  import uvicorn
4
  import threading
5
  import sqlite3
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  def send_email(to_email: str, subject: str, body: str):
2
  try:
3
  msg = EmailMessage()
 
1
+ # agents/notebook/mailer.py
2
+
3
  def send_email(to_email: str, subject: str, body: str):
4
  try:
5
  msg = EmailMessage()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  import json
2
  import os
3
  import sys
 
1
+ # agents/repl.py
2
+
3
  import json
4
  import os
5
  import sys
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/check_init.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/check_init.py
2
 
3
  import os
4
  import sqlite3
 
1
+ # agents/tools/check_init.py
2
 
3
  import os
4
  import sqlite3
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/command_executor.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/command_executor.py
2
 
3
  def execute_commands(commands, db, config):
4
  for cmd in commands:
 
1
+ # agents/tools/command_executor.py
2
 
3
  def execute_commands(commands, db, config):
4
  for cmd in commands:
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/command_parser.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/command_parser.py
2
 
3
  """
4
  Извлечение команд из JSON или размеченного текста.
 
1
+ # agents/tools/command_parser.py
2
 
3
  """
4
  Извлечение команд из JSON или размеченного текста.
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/context_builder.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/context_builder.py
2
 
3
  from datetime import datetime
4
 
 
1
+ # agents/tools/context_builder.py
2
 
3
  from datetime import datetime
4
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/crypto.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/crypto.py
2
 
3
  from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
4
  from cryptography.hazmat.primitives import serialization, hashes
 
1
+ # agents/tools/crypto.py
2
 
3
  from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
4
  from cryptography.hazmat.primitives import serialization, hashes
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/identity.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/identity.py
2
 
3
  import uuid
4
  import json
 
1
+ # agents/tools/identity.py
2
 
3
  import uuid
4
  import json
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/llm.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/llm.py
2
 
3
  import json
4
  import requests
 
1
+ # agents/tools/llm.py
2
 
3
  import json
4
  import requests
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/memory_utils.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/memory_utils.py
2
 
3
  from datetime import datetime, timedelta
4
  from difflib import SequenceMatcher
 
1
+ # agents/tools/memory_utils.py
2
 
3
  from datetime import datetime, timedelta
4
  from difflib import SequenceMatcher
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/peer_comm.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  send_thought_to_peer(peer_url, thought)
2
  ping_peer(peer_url)
3
  ask_capabilities(peer_url)
 
1
+ # agents/tools/peer_comm.py
2
+
3
  send_thought_to_peer(peer_url, thought)
4
  ping_peer(peer_url)
5
  ask_capabilities(peer_url)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/similarity.py CHANGED
@@ -1,4 +1,4 @@
1
- # tools/similarity.py
2
 
3
  from sklearn.feature_extraction.text import TfidfVectorizer
4
  from sklearn.metrics.pairwise import cosine_similarity
 
1
+ # agents/tools/similarity.py
2
 
3
  from sklearn.feature_extraction.text import TfidfVectorizer
4
  from sklearn.metrics.pairwise import cosine_similarity
hf_repo/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/readme.md CHANGED
@@ -14,46 +14,57 @@
14
  | 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
15
  | 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
16
 
17
- ```
18
- agents/
19
- ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
20
- ├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
21
- ├── start_repl.py ← Запуск агента в REPL-режиме (py)
22
- ├── mcp_server.py ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
23
- ├── init.py ← Инициализация БД
24
- ├── logger.py ← Ведение логов
25
- ├── add_message.py ← Ручная отправка сообщений для агента
26
- ├── requirements.txt ← Зависимости
27
- ├── tools/
28
- │ ├── db_structure.sql ← БД SQL
29
- │ ├── db_structure.md ← Описание БД SQL
30
- │ ├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite
31
- ├── check_init.py Проверка инициализации БД
32
- ├── config_utils.py Обновляет JSON-файл конфигурации указанными значениями
33
- ├── crypto.py Создание и шифрование ключей RSA/Ed25519
34
- ├── identity.py Генерация DiD
35
- ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт)
36
- ├── agent_mesh_listener.py Прием входящих сообщений от других HMP-агентов
37
- ├── peer_comm.py Низкоуровневые P2P-запросы (отправка, ping, мета)
38
- ├── peer_sync.py Фоновая синхронизация с другими пирам
39
- ├── peers.py Реестр известных пиров (id, ключи, адреса)
40
- ├── memory_utils.py Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
41
- ├── context_builder.py Сбор всех `контекстов` из БД и их фильтрация
42
- ├── command_parser.py Извлечение команд из JSON или размеченного блока
43
- ├── command_executor.py ← Выполнение команд (shell, graph, diary и др)
44
- ├── similarity.py Сравнение смыслов
45
- ├── diagnose.py Скрипт диагностики соединения, определения IP и проверки порта DHT
46
- ├── notebook/
47
- ├── auth.py Регистрация, вход, восстановление
48
- ├── views.py Общий и приватный чаты
49
- ├── mailer.py Простая синхронная отправка email
50
- ├── templates/
51
- ├── index.html Основа
52
- ├── private.html Общий и приватный чат
53
- ├── login.html Вход
54
- ├── register.html Регистрация или сброс пароля
55
- ├── style.css Таблица стилей
56
- ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
57
- ├── bootstrap.txt Локальная этическая модель
58
- ├── ethics.yml Список начальных узлов
59
- ```
 
 
 
 
 
 
 
 
 
 
 
 
14
  | 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
15
  | 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
16
 
17
+ ---
18
+
19
+ **🌐 `mcp_server.py`**
20
+ FastAPI-сервер, предоставляющий HTTP-интерфейс к функциональности `storage.py`. Предназначен для использования внешними компонентами, например:
21
+
22
+ * `Cognitive Shell` (внешний управляющий интерфейс),
23
+ * CMP-серверы (если используется mesh-сеть с разграничением ролей),
24
+ * отладочные или визуальные UI-инструменты.
25
+
26
+ Позволяет получать случайные/новые записи, делать разметку, импортировать графы, добавлять заметки и управлять данными без прямого доступа к БД.
27
+
28
+ ---
29
+
30
+ [agents/](/agents)
31
+ ├── [`start_repl.bat`](start_repl.bat) Запуск агента в REPL-режиме (bat)
32
+ ├── [`start_repl.sh`](start_repl.sh) Запуск агента в REPL-режиме (sh)
33
+ ├── [`start_repl.py`](start_repl.py) Запуск агента в REPL-режиме (py)
34
+ ├── [`mcp_server.py`](mcp_server.py) API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
35
+ ├── [`init.py`](init.py) Инициализация БД
36
+ ├── [`logger.py`](logger.py) Ведение логов
37
+ ├── [`add_message.py`](add_message.py) Ручная отправка сообщений для агента
38
+ ├── [`requirements.txt`](requirements.txt) Зависимости
39
+ ├── [tools/](tools/) Вспомогательные скрипты и модули
40
+    ├── [`db_structure.sql`](tools/db_structure.sql) БД SQL
41
+    ├── [`db_structure.md`](tools/db_structure.md) Описание БД SQL
42
+    ├── [`storage.py`](tools/storage.py) Реализация базового хранилища (`Storage`), подключение SQLite
43
+    ├── [`check_init.py`](tools/check_init.py) Проверка инициализации БД
44
+    ├── [`config_utils.py`](tools/config_utils.py) Обновляет JSON-файл конфигурации указанными значениями
45
+    ├── [`crypto.py`](tools/crypto.py) Создание и шифрование ключей RSA/Ed25519
46
+ │   ├── [`identity.py`](tools/identity.py) ← Генерация DiD
47
+    ├── [`llm.py`](tools/llm.py) Работа с LLM (вызов, выбор модели, системный промпт)
48
+    ├── [`agent_mesh_listener.py`](tools/agent_mesh_listener.py) Прием входящих сообщений от других HMP-агентов
49
+    ├── [`peer_comm.py`](tools/peer_comm.py) Низкоуровневые P2P-запросы (отправка, ping, мета)
50
+    ├── [`peer_sync.py`](tools/peer_sync.py) ← Фоновая синхронизация с другими пирам
51
+    ├── [`peers.py`](tools/peers.py) Реестр известных пиров (id, ключи, адреса)
52
+    ├── [`memory_utils.py`](tools/memory_utils.py) Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
53
+    ├── [`context_builder.py`](tools/context_builder.py) Сбор всех `контекстов` из БД и их фильтрация
54
+    ├── [`command_parser.py`](tools/command_parser.py) Извлечение команд из JSON или размеченного блока
55
+    ├── [`command_executor.py`](tools/command_executor.py) Выполнение команд (shell, graph, diary и др)
56
+ │   ├── [`similarity.py`](tools/similarity.py) Сравнение смыслов
57
+ │   ├── [`diagnose.py`](tools/diagnose.py) Скрипт диагностики соединения, определения IP и проверки порта DHT
58
+ ├── [notebook/](notebook/) Веб-интерфейс и связанные модули
59
+ │   ├── [`auth.py`](notebook/auth.py) ← Регистрация, вход, восстановление
60
+ │   ├── [`views.py`](notebook/views.py) ← Общий и приватный чаты
61
+ │   ├── [`mailer.py`](notebook/mailer.py) ← Простая синхронная отправка email
62
+ │   ├── [templates/](notebook/templates/) ← HTML-шаблоны и стили
63
+ │       ├── [`index.html`](notebook/templates/index.html) ← Основа
64
+ │       ├── [`private.html`](notebook/templates/private.html) ← Общий и приватный чат
65
+ │       ├── [`login.html`](notebook/templates/login.html) ← Вход
66
+ │       ├── [`register.html`](notebook/templates/register.html) ← Регистрация или сброс пароля
67
+ │       ├── [`style.css`](notebook/templates/style.css) ← Таблица стилей
68
+ ├── [`config.yml`](config.yml) ← Конфигурация агента (имя, порты, роли и т.п.)
69
+ ├── [`bootstrap.txt`](bootstrap.txt) ← Локальная этическая модель
70
+ ├── [`ethics.yml`](ethics.yml) ← Список начальных узлов '
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md CHANGED
@@ -178,6 +178,15 @@ Design and implementation of a basic HMP-compatible agent that can interact with
178
  - [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
179
  - [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
180
 
 
 
 
 
 
 
 
 
 
181
  ---
182
 
183
  ## 🧭 Ethics & Scenarios / Этические принципы и сценарии
 
178
  - [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
179
  - [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
180
 
181
+ **🌐 `mcp_server.py`**
182
+ FastAPI-сервер, предоставляющий HTTP-интерфейс к функциональности `storage.py`. Предназначен для использования внешними компонентами, например:
183
+
184
+ - `Cognitive Shell` (внешний управляющий интерфейс),
185
+ - CMP-серверы (если используется mesh-сеть с разграничением ролей),
186
+ - отладочные или визуальные UI-инструменты.
187
+
188
+ Позволяет получать случайные/новые записи, делать разметку, импортировать графы, добавлять заметки и управлять данными без прямого доступа к БД.
189
+
190
  ---
191
 
192
  ## 🧭 Ethics & Scenarios / Этические принципы и сценарии
hf_repo/hf_repo/hf_repo/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/readme.md CHANGED
@@ -19,7 +19,7 @@ agents/
19
  ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
20
  ├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
21
  ├── start_repl.py ← Запуск агента в REPL-режиме (py)
22
- ├?─ mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
23
  ├── init.py ← Инициализация БД
24
  ├── logger.py ← Ведение логов
25
  ├── add_message.py ← Ручная отправка сообщений для агента
 
19
  ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
20
  ├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
21
  ├── start_repl.py ← Запуск агента в REPL-режиме (py)
22
+ ├── mcp_server.py ← API-интерфейс к хранилищу (storage.py): получение/поиск записей, импорт графа, разметка и др. Используется внешними модулями (напр. Cognitive Shell или CMP).
23
  ├── init.py ← Инициализация БД
24
  ├── logger.py ← Ведение логов
25
  ├── add_message.py ← Ручная отправка сообщений для агента
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md CHANGED
@@ -173,7 +173,7 @@ Design and implementation of a basic HMP-compatible agent that can interact with
173
 
174
  - [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
175
  - [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
176
- - [🌐 mcp_server.py](agents/mcp_server.py) - основной FastAPI сервер
177
  - [🌐 start_repl.py](agents/start_repl.py) - Запуск агента в REPL-режиме
178
  - [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
179
  - [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
 
173
 
174
  - [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
175
  - [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
176
+ - [🌐 mcp_server.py](agents/mcp_server.py) FastAPI-сервер для доступа к данным агента через HTTP-интерфейс (например, для Cognitive Shell, внешних UI или mesh-коммуникации). Пока не используется в основном REPL-цикле.
177
  - [🌐 start_repl.py](agents/start_repl.py) - Запуск агента в REPL-режиме
178
  - [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
179
  - [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/readme.md CHANGED
@@ -14,10 +14,12 @@
14
  | 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
15
  | 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
16
 
 
17
  agents/
18
  ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
19
  ├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
20
  ├── start_repl.py ← Запуск агента в REPL-режиме (py)
 
21
  ├── init.py ← Инициализация БД
22
  ├── logger.py ← Ведение логов
23
  ├── add_message.py ← Ручная отправка сообщений для агента
@@ -53,4 +55,5 @@ agents/
53
  │ ├── style.css ← Таблица стилей
54
  ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
55
  ├── bootstrap.txt ← Локальная этическая модель
56
- ├── ethics.yml ← Список начальных узлов
 
 
14
  | 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
15
  | 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
16
 
17
+ ```
18
  agents/
19
  ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
20
  ├── start_repl.sh ← Запуск агента в REPL-режиме (sh)
21
  ├── start_repl.py ← Запуск агента в REPL-режиме (py)
22
+ ├?─ mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
23
  ├── init.py ← Инициализация БД
24
  ├── logger.py ← Ведение логов
25
  ├── add_message.py ← Ручная отправка сообщений для агента
 
55
  │ ├── style.css ← Таблица стилей
56
  ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
57
  ├── bootstrap.txt ← Локальная этическая модель
58
+ ├── ethics.yml ← Список начальных узлов
59
+ ```
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md CHANGED
@@ -174,8 +174,9 @@ Design and implementation of a basic HMP-compatible agent that can interact with
174
  - [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
175
  - [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
176
  - [🌐 mcp_server.py](agents/mcp_server.py) - основной FastAPI сервер
 
177
  - [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
178
- - [⚙️ api_structure_2025-07-23.md](meta/api_structure_2025-07-23.md) - API структура (сводка за 2025-07-23)
179
 
180
  ---
181
 
 
174
  - [⚙️ agents](agents/readme.md) — список реализаций и компонентов HMP-агентов
175
  - [📦 storage.py](agents/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
176
  - [🌐 mcp_server.py](agents/mcp_server.py) - основной FastAPI сервер
177
+ - [🌐 start_repl.py](agents/start_repl.py) - Запуск агента в REPL-режиме
178
  - [🔄 repl.py](agents/repl.py) - интерактивный REPL-режим
179
+ - [🔄 notebook.py](agents/notebook.py) - UI-интерфейс
180
 
181
  ---
182
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/mcp_server.py ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # agents/mcp_server.py
2
+
3
+ from fastapi import FastAPI, Request, HTTPException
4
+ from fastapi.middleware.cors import CORSMiddleware
5
+ from pydantic import BaseModel
6
+ from typing import List, Optional
7
+ from datetime import datetime
8
+ from tools.storage import Storage
9
+
10
+ app = FastAPI(title="HMP MCP-Agent API", version="0.2")
11
+
12
+ app.add_middleware(
13
+ CORSMiddleware,
14
+ allow_origins=["*"],
15
+ allow_credentials=True,
16
+ allow_methods=["*"],
17
+ allow_headers=["*"],
18
+ )
19
+
20
+ db = Storage()
21
+
22
+ # ======== MODELS ========
23
+
24
+ class NoteInput(BaseModel):
25
+ text: str
26
+ tags: Optional[List[str]] = []
27
+
28
+ class NoteOutput(BaseModel):
29
+ id: int
30
+ text: str
31
+ tags: List[str]
32
+ source: str
33
+ read: int
34
+ timestamp: str
35
+
36
+ class DiaryInput(BaseModel):
37
+ text: str
38
+ tags: Optional[List[str]] = []
39
+
40
+ class DiaryOutput(BaseModel):
41
+ id: int
42
+ text: str
43
+ tags: List[str]
44
+ timestamp: str
45
+
46
+ class DiaryListOutput(BaseModel):
47
+ entries: List[DiaryOutput]
48
+
49
+ class ConceptInput(BaseModel):
50
+ name: str
51
+ description: Optional[str] = ""
52
+
53
+ class ConceptOutput(BaseModel):
54
+ concept_id: int
55
+
56
+ class Concept(BaseModel):
57
+ concept_id: int
58
+ name: str
59
+ description: Optional[str]
60
+
61
+ class LinkInput(BaseModel):
62
+ source_id: int
63
+ target_id: int
64
+ relation: str
65
+
66
+ class LinkOutput(BaseModel):
67
+ link_id: int
68
+
69
+ class Edge(BaseModel):
70
+ source_id: int
71
+ target_id: int
72
+ relation: str
73
+
74
+ class GraphExpansionOutput(BaseModel):
75
+ links: List[Edge]
76
+
77
+ class GraphExport(BaseModel):
78
+ nodes: List[Concept]
79
+ edges: List[Edge]
80
+
81
+ class GraphImportData(BaseModel):
82
+ nodes: List[Concept]
83
+ edges: List[Edge]
84
+
85
+ class ConceptUpdate(BaseModel):
86
+ name: Optional[str]
87
+ description: Optional[str]
88
+
89
+ class ConceptQueryOutput(BaseModel):
90
+ matches: List[Concept]
91
+
92
+ class NoteTagUpdate(BaseModel):
93
+ id: int
94
+ tags: List[str] = []
95
+
96
+ # ======== ROUTES ========
97
+
98
+ @app.get("/status")
99
+ def status():
100
+ return {"status": "ok", "timestamp": datetime.utcnow().isoformat()}
101
+
102
+ @app.post("/diary/write", response_model=dict)
103
+ def write_diary(entry: DiaryInput):
104
+ db.write_diary_entry(entry.text, entry.tags)
105
+ return {"result": "entry saved"}
106
+
107
+ @app.get("/diary/read", response_model=DiaryListOutput)
108
+ def read_diary(limit: int = 5, tag: Optional[str] = None):
109
+ raw = db.read_diary_entries(limit=limit, tag_filter=tag)
110
+ return {
111
+ "entries": [
112
+ {
113
+ "id": r[0],
114
+ "text": r[1],
115
+ "tags": r[2].split(",") if r[2] else [],
116
+ "timestamp": r[3]
117
+ } for r in raw
118
+ ]
119
+ }
120
+
121
+ @app.delete("/diary/delete/{entry_id}")
122
+ def delete_diary(entry_id: int):
123
+ db.delete_diary_entry_by_id(entry_id)
124
+ return {"result": f"entry {entry_id} deleted"}
125
+
126
+ @app.get("/diary/get_entry/{entry_id}", response_model=DiaryOutput)
127
+ def get_diary_entry(entry_id: int):
128
+ row = db.get_diary_entry(entry_id)
129
+ if row:
130
+ return {
131
+ "id": row[0],
132
+ "text": row[1],
133
+ "tags": row[2].split(",") if row[2] else [],
134
+ "timestamp": row[3]
135
+ }
136
+ raise HTTPException(status_code=404, detail="Entry not found")
137
+
138
+ @app.post("/diary/search_entries", response_model=DiaryListOutput)
139
+ def search_entries(query: str):
140
+ rows = db.search_diary_entries(query)
141
+ return {
142
+ "entries": [
143
+ {
144
+ "id": r[0],
145
+ "text": r[1],
146
+ "tags": r[2].split(",") if r[2] else [],
147
+ "timestamp": r[3]
148
+ }
149
+ for r in rows
150
+ ]
151
+ }
152
+
153
+ @app.get("/diary/tag_stats", response_model=dict)
154
+ def tag_stats():
155
+ return db.get_tag_stats()
156
+
157
+ @app.get("/diary/export", response_model=DiaryListOutput)
158
+ def export_diary():
159
+ rows = db.export_diary()
160
+ return {
161
+ "entries": [
162
+ {
163
+ "id": r[0],
164
+ "text": r[1],
165
+ "tags": r[2].split(",") if r[2] else [],
166
+ "timestamp": r[3]
167
+ }
168
+ for r in rows
169
+ ]
170
+ }
171
+
172
+ @app.post("/graph/add_concept", response_model=ConceptOutput)
173
+ def add_concept(concept: ConceptInput):
174
+ cid = db.add_concept(concept.name, concept.description)
175
+ return {"concept_id": cid}
176
+
177
+ @app.post("/graph/add_link", response_model=LinkOutput)
178
+ def add_link(link: LinkInput):
179
+ link_id = db.add_link(link.source_id, link.target_id, link.relation)
180
+ return {"link_id": link_id}
181
+
182
+ @app.get("/graph/expand", response_model=GraphExpansionOutput)
183
+ def expand_graph(start_id: int, depth: int = 1):
184
+ links = db.expand_concept_graph(start_id, depth)
185
+ return {"links": links}
186
+
187
+ @app.get("/graph/list_concepts", response_model=List[Concept])
188
+ def list_concepts():
189
+ rows = db.list_concepts()
190
+ return [
191
+ {"concept_id": r[0], "name": r[1], "description": r[2]}
192
+ for r in rows
193
+ ]
194
+
195
+ @app.get("/graph/list_links", response_model=List[Edge])
196
+ def list_links():
197
+ return db.list_links()
198
+
199
+ @app.get("/graph/get_concept/{id}", response_model=Concept)
200
+ def get_concept(id: int):
201
+ concept = db.get_concept(id)
202
+ if concept:
203
+ return {"concept_id": concept[0], "name": concept[1], "description": concept[2]}
204
+ raise HTTPException(status_code=404, detail="Concept not found")
205
+
206
+ @app.delete("/graph/delete_concept/{id}")
207
+ def delete_concept(id: int):
208
+ db.delete_concept(id)
209
+ return {"result": f"concept {id} deleted"}
210
+
211
+ @app.delete("/graph/delete_link/{id}")
212
+ def delete_link(id: int):
213
+ db.delete_link(id)
214
+ return {"result": f"link {id} deleted"}
215
+
216
+ @app.put("/graph/update_concept/{id}")
217
+ def update_concept(id: int, update: ConceptUpdate):
218
+ db.update_concept(id, update.name, update.description)
219
+ return {"result": f"concept {id} updated"}
220
+
221
+ @app.post("/graph/merge_concepts")
222
+ def merge_concepts(source_id: int, target_id: int):
223
+ db.merge_concepts(source_id, target_id)
224
+ return {"result": f"concept {source_id} merged into {target_id}"}
225
+
226
+ @app.get("/graph/search_links", response_model=List[Edge])
227
+ def search_links(relation: str):
228
+ return db.search_links_by_relation(relation)
229
+
230
+ @app.get("/graph/search_concepts", response_model=List[Concept])
231
+ def search_concepts(query: str):
232
+ rows = db.search_concepts(query)
233
+ return [{"concept_id": r[0], "name": r[1], "description": r[2]} for r in rows]
234
+
235
+ @app.get("/graph/query_concept", response_model=ConceptQueryOutput)
236
+ def query_concept(name: str):
237
+ rows = db.query_concept(name)
238
+ return {
239
+ "matches": [
240
+ {"concept_id": r[0], "name": r[1], "description": r[2]}
241
+ for r in rows
242
+ ]
243
+ }
244
+
245
+ @app.post("/graph/relate_concepts", response_model=LinkOutput)
246
+ def relate_concepts(source_name: str, target_name: str, relation: str):
247
+ sid = db.get_concept_id_by_name(source_name)
248
+ tid = db.get_concept_id_by_name(target_name)
249
+ if sid is None or tid is None:
250
+ raise HTTPException(status_code=404, detail="Concept not found")
251
+ link_id = db.add_link(sid, tid, relation)
252
+ return {"link_id": link_id}
253
+
254
+ @app.get("/graph/export", response_model=GraphExport)
255
+ def export_graph():
256
+ return db.export_graph()
257
+
258
+ @app.post("/graph/import")
259
+ def import_graph(graph_data: GraphImportData):
260
+ db.import_graph(graph_data)
261
+ return {"status": "ok"}
262
+
263
+ @app.post("/note/write", response_model=dict)
264
+ def write_note(note: NoteInput):
265
+ db.write_note(note.text, note.tags)
266
+ return {"result": "note saved"}
267
+
268
+ @app.get("/note/next", response_model=Optional[NoteOutput])
269
+ def get_next_note():
270
+ note = db.get_first_unread_note()
271
+ if note:
272
+ note_id, text, tags, source, read, timestamp = note
273
+ return {
274
+ "id": note_id,
275
+ "text": text,
276
+ "tags": tags.split(",") if tags else [],
277
+ "source": source,
278
+ "read": read,
279
+ "timestamp": timestamp
280
+ }
281
+ return None
282
+
283
+ @app.post("/note/mark_read", response_model=dict)
284
+ def mark_note_read(data: NoteTagUpdate):
285
+ db.mark_note_as_read(data.id)
286
+ return {"result": "ok"}
287
+
288
+ @app.post("/note/set_tags", response_model=dict)
289
+ def set_note_tags(data: NoteTagUpdate):
290
+ db.set_tags(data.id, data.tags)
291
+ return {"result": "ok"}
292
+
293
+ @app.get("/note/random", response_model=Optional[NoteOutput])
294
+ def get_random_note_by_tags(tags: Optional[List[str]] = None):
295
+ note = db.get_random_note_by_tags(tags or [])
296
+ if note:
297
+ note_id, text, note_tags, source, read, timestamp = note
298
+ return {
299
+ "id": note_id,
300
+ "text": text,
301
+ "tags": note_tags.split(",") if note_tags else [],
302
+ "source": source,
303
+ "read": read,
304
+ "timestamp": timestamp
305
+ }
306
+ return None
307
+
308
+ @app.get("/note/by_tag", response_model=List[NoteOutput])
309
+ def get_notes_by_tag(tag: str):
310
+ all_notes = db.read_notes(limit=1000)
311
+ return [
312
+ {
313
+ "id": note[0],
314
+ "text": note[1],
315
+ "tags": note[2].split(",") if note[2] else [],
316
+ "source": note[3],
317
+ "read": note[4],
318
+ "timestamp": note[5]
319
+ }
320
+ for note in all_notes if tag in (note[2].split(",") if note[2] else [])
321
+ ]
322
+
323
+ @app.on_event("shutdown")
324
+ def shutdown():
325
+ db.close()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/qa.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # agents/qa.py
2
+
3
+ def run_qa_loop(config):
4
+ print("[HMP-Agent] Запуск в QA-режиме (вопрос → ответ)")
5
+
6
+ from llm import ask_llm # абстракция над вызовом LLM (нужна реализация)
7
+
8
+ try:
9
+ while True:
10
+ user_input = input("\n🧑‍💻 Вопрос: ").strip()
11
+ if user_input.lower() in {"exit", "quit"}:
12
+ print("👋 Завершение QA-режима.")
13
+ break
14
+
15
+ response = ask_llm(user_input)
16
+ print(f"\n🤖 Ответ: {response}")
17
+
18
+ except KeyboardInterrupt:
19
+ print("\n👋 Завершение QA-режима.")
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/add_message.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ from datetime import datetime
3
+ from tools.storage import Storage
4
+
5
+ storage = Storage()
6
+
7
+ def add_message(role, content, source="cli", user_did=None):
8
+ storage.write_note(
9
+ content,
10
+ role=role,
11
+ source=source,
12
+ user_did=user_did,
13
+ tags=[]
14
+ )
15
+ print(f"[+] Сообщение от {role} ({source}) добавлено: {content}")
16
+
17
+ # --- CLI interface ---
18
+ if __name__ == "__main__":
19
+ parser = argparse.ArgumentParser()
20
+ parser.add_argument("--role", required=True)
21
+ parser.add_argument("--content", required=True)
22
+ parser.add_argument("--source", default="cli")
23
+ parser.add_argument("--user_did")
24
+ args = parser.parse_args()
25
+
26
+ add_message(args.role, args.content, args.source, args.user_did)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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.py CHANGED
@@ -1,46 +1,26 @@
1
- import argparse
2
- from datetime import datetime
3
- from tools.storage import Storage
4
 
5
- storage = Storage()
6
 
7
- def add_entry():
8
- print("Введите вашу запись (завершите пустой строкой):")
9
- lines = []
10
- try:
11
- while True:
12
- line = input()
13
- if line.strip() == "":
14
- break
15
- lines.append(line)
16
- except KeyboardInterrupt:
17
- print("\n[⚠️] Ввод прерван.")
18
- return
19
 
20
- text = "\n".join(lines).strip()
21
- if text:
22
- storage.write_note(text, tags=[])
23
- print("[💾] Запись сохранена в блокнот.")
24
- else:
25
- print("[⚠️] Пустая запись не сохранена.")
26
 
27
- def list_entries(limit=10):
28
- notes = storage.read_notes(limit=limit)
29
- for note in notes:
30
- note_id, text, tags, source, read, timestamp = note
31
- title = text.split("\n")[0]
32
- print(f"[{timestamp}] ({source}) {title}")
33
 
34
- def main():
35
- parser = argparse.ArgumentParser(description="Интерфейс пользователя для записи мыслей")
36
- parser.add_argument("--list", action="store_true", help="Показать последние записи")
37
- parser.add_argument("--limit", type=int, default=10, help="Сколько записей показать при --list")
38
- args = parser.parse_args()
39
-
40
- if args.list:
41
- list_entries(limit=args.limit)
42
- else:
43
- add_entry()
44
 
45
  if __name__ == "__main__":
46
- main()
 
 
 
1
+ import uvicorn
2
+ import threading
3
+ import sqlite3
4
 
5
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
6
 
7
+ from fastapi import FastAPI
8
+ from agents.notebook.auth import router as auth_router
9
+ from agents.notebook.views import router as views_router
10
+ from fastapi.staticfiles import StaticFiles
11
+ from fastapi.templating import Jinja2Templates
 
 
 
 
 
 
 
12
 
13
+ app = FastAPI()
14
+ app.mount("/static", StaticFiles(directory="agents/notebook/static"), name="static")
15
+ templates = Jinja2Templates(directory="agents/notebook/templates")
 
 
 
16
 
17
+ app.include_router(auth_router)
18
+ app.include_router(views_router)
 
 
 
 
19
 
20
+ def run_notebook():
21
+ uvicorn.run(app, host="127.0.0.1", port=8000)
 
 
 
 
 
 
 
 
22
 
23
  if __name__ == "__main__":
24
+ print("[*] Запуск пользовательского интерфейса...")
25
+ thread = threading.Thread(target=run_notebook, daemon=True)
26
+ thread.start()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/mailer.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def send_email(to_email: str, subject: str, body: str):
2
+ try:
3
+ msg = EmailMessage()
4
+ msg["Subject"] = subject
5
+ msg["From"] = "[email protected]"
6
+ msg["To"] = to_email
7
+ msg.set_content(body)
8
+
9
+ with smtplib.SMTP("localhost") as server:
10
+ server.send_message(msg)
11
+ return True
12
+ except Exception as e:
13
+ print(f"[!] Ошибка отправки email: {e}")
14
+ return False
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/requirements.txt CHANGED
@@ -5,4 +5,9 @@ requests
5
  tiktoken
6
  python-dotenv
7
  PyYAML
8
- cryptography
 
 
 
 
 
 
5
  tiktoken
6
  python-dotenv
7
  PyYAML
8
+ cryptography
9
+ fastapi
10
+ uvicorn
11
+ jinja2
12
+ python-multipart
13
+ passlib[bcrypt]
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/start_repl.bat CHANGED
@@ -1,13 +1,11 @@
1
- @echo off
2
  echo --------------------------
3
  echo Installing requirements...
4
  echo --------------------------
5
  pip install -r requirements.txt
6
 
7
  echo --------------------------
8
- echo Running HMP REPL-agent...
9
  echo --------------------------
10
-
11
- python repl.py
12
 
13
  pause
 
 
1
  echo --------------------------
2
  echo Installing requirements...
3
  echo --------------------------
4
  pip install -r requirements.txt
5
 
6
  echo --------------------------
7
+ echo Running REPL-Cicle...
8
  echo --------------------------
9
+ python start_repl.py
 
10
 
11
  pause