GitHub Action commited on
Commit
36d4941
·
1 Parent(s): 6842d48

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/readme.md +13 -0
  2. hf_repo/README.md +9 -0
  3. hf_repo/hf_repo/agents/readme.md +1 -1
  4. hf_repo/hf_repo/hf_repo/README.md +1 -1
  5. hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +4 -1
  6. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +2 -1
  7. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/mcp_server.py +325 -0
  8. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/_not_used/qa.py +19 -0
  9. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/add_message.py +26 -0
  10. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook.py +19 -39
  11. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/notebook/mailer.py +14 -0
  12. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +6 -1
  13. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.bat +2 -4
  14. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.py +59 -0
  15. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh +4 -6
  16. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +52 -63
  17. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +0 -26
  18. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/check_init.py +34 -0
  19. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/audits/HMP-0004-audit.txt +25 -0
  20. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-Cognitive_Family.md +5 -5
  21. 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 +1 -0
  22. 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-Cognitive_Family.md +76 -0
  23. hf_repo/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 +5 -2
  24. hf_repo/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.sh +13 -0
  25. hf_repo/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/repl.py +83 -54
  26. hf_repo/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 +1 -17
  27. hf_repo/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.sh +1 -18
  28. hf_repo/hf_repo/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.bat +12 -0
  29. hf_repo/hf_repo/hf_repo/hf_repo/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 +7 -0
  30. hf_repo/hf_repo/hf_repo/hf_repo/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 +7 -0
  31. hf_repo/hf_repo/hf_repo/hf_repo/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 +16 -1
  32. hf_repo/hf_repo/hf_repo/hf_repo/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 +1 -0
  33. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +23 -14
  34. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +33 -17
  35. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/config_utils.py +17 -0
  36. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/crypto.py +149 -0
  37. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +68 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/init.py +88 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +6 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/requirements.txt +2 -0
  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/hf_repo/hf_repo/hf_repo/agents/test.bat +2 -2
  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/hf_repo/hf_repo/hf_repo/agents/tools/identity.py +68 -0
  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/hf_repo/agents/tools/storage.py +58 -0
  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/hf_repo/docs/HMP-agent-REPL-cycle.md +2 -1
  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/hf_repo/hf_repo/agents/tools/db_structure.sql +124 -107
  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/hf_repo/hf_repo/hf_repo/agents/config.yml +68 -47
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.md +47 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql +105 -109
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/test.bat +12 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/test.py +13 -0
agents/readme.md CHANGED
@@ -14,6 +14,19 @@
14
  | 🌍 `agent_mesh_listener.py` | Получение входящих сообщений |
15
  | 🌐 `peer_sync.py` или DHT-сервис | Поддержание связи с другими агентами / DHT |
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  ```
18
  agents/
19
  ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
 
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
  ```
31
  agents/
32
  ├── start_repl.bat ← Запуск агента в REPL-режиме (bat)
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/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/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/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/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/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/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/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/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/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/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/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
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ """
17
+ Стартует все ключевые компоненты агента в отдельных потоках.
18
+ """
19
+ threads = []
20
+
21
+ if ENABLE_REPL:
22
+ def repl():
23
+ from agents.repl import start_repl
24
+ start_repl()
25
+ threads.append(threading.Thread(target=repl, name="REPL"))
26
+
27
+ if ENABLE_UI:
28
+ def ui():
29
+ from agents.notebook import start_notebook
30
+ start_notebook()
31
+ threads.append(threading.Thread(target=ui, name="NotebookUI"))
32
+
33
+ if ENABLE_MESH:
34
+ def mesh():
35
+ from agents.agent_mesh_listener import start_listener
36
+ start_listener()
37
+ threads.append(threading.Thread(target=mesh, name="MeshListener"))
38
+
39
+ if ENABLE_SYNC:
40
+ def sync():
41
+ from agents.peer_sync import start_sync
42
+ start_sync()
43
+ threads.append(threading.Thread(target=sync, name="PeerSync"))
44
+
45
+ # Запуск потоков
46
+ for thread in threads:
47
+ try:
48
+ thread.start()
49
+ print(f"[✔] Поток {thread.name} запущен.")
50
+ except Exception as e:
51
+ print(f"[⚠️] Ошибка запуска потока {thread.name}: {e}")
52
+
53
+ # Блокирующее ожидание завершения
54
+ for thread in threads:
55
+ thread.join()
56
+
57
+ if __name__ == "__main__":
58
+ print("[*] Инициализация завершена. Запуск потоков...")
59
+ start_all()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/start_repl.sh CHANGED
@@ -1,13 +1,11 @@
1
  #!/bin/bash
2
 
3
- # === INSTALL DEPENDENCIES ===
4
  echo "--------------------------"
5
  echo "Installing requirements..."
6
  echo "--------------------------"
7
  pip install -r requirements.txt
8
 
9
- # === RUN AGENT ===
10
- echo "--------------------------"
11
- echo "Running HMP REPL-agent..."
12
- echo "--------------------------"
13
- python repl.py
 
1
  #!/bin/bash
2
 
 
3
  echo "--------------------------"
4
  echo "Installing requirements..."
5
  echo "--------------------------"
6
  pip install -r requirements.txt
7
 
8
+ echo --------------------------
9
+ echo Running REPL-Cicle...
10
+ echo --------------------------
11
+ python start_repl.py
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md CHANGED
@@ -1,67 +1,56 @@
1
- Текушие требования и зависимости: [requirements.txt](requirements.txt)
2
 
3
- ```
4
- agents/
5
- ├── start_repl.bat ← Запуск агента в REPL-режиме.
6
- ├── start_repl.sh ← Запуск агента в REPL-режиме.
7
- ├── agent.py ← Основной исполняемый файл CLI-агента.
8
- ├── cli.py ← Запуск агента в нужном режиме.
9
- ├── qa.py ← Режим "вопрос-ответ".
10
- ├── repl.py ← Интерактивный REPL-режим.
11
- ├── mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
12
- ├── logger.py ← Ведение логов.
13
- ├── notebook.py ← Добавление и просмотр пользователем записей в блокноте.
14
- ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.).
15
- ├── ethics.yml ← Локальная этическая модель.
16
- └── bootstrap.txt ← Список начальных узлов.
17
- └── tools/
18
- ├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
19
- ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
20
- ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
21
- ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
22
- ├── identity.py ← Генерация DiD.
23
- ├── crypto.py ← Создание и шифрование ключей RSA/Ed25519.
24
- ├── config_utils.py ← Обновляет JSON-файл конфигурации указанными значениями.
25
- ├── peers.py ← Информация о пирах.
26
- ├── peer_comm.py ← Запросы к пирам.
27
- ├── peer_sync.py ← Модуль обмена сообщениями.
28
- ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
29
- ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
30
- ├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
31
- ├── memory_utils.py ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
32
- ├── similarity.py ← Сравнение смыслов.
33
- └── ... (другие утилиты)
34
- ```
35
 
36
- **Скрипты:**
37
- * [start_repl.bat](start_repl.bat) - Запуск агента в REPL-режиме.
38
- * [start_repl.sh](start_repl.sh) - Запуск агента в REPL-режиме.
39
- * [agent.py](agent.py) - Основной исполняемый файл CLI-агента.
40
- * [cli.py](cli.py) - Запуск агента в нужном режиме.
41
- * [qa.py](qa.py) - Режим "вопрос-ответ".
42
- * [repl.py](repl.py) - Интерактивный REPL-режим.
43
- * [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
44
- * [notebook.py](notebook.py) - Добавление и просмотр пользователем записей в блокноте.
45
- * [logger.py](logger.py) - Ведение логов.
46
- * tools
47
- * [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
48
- * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
49
- * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
50
- * [identity.py](tools/identity.py) - Генерация DiD.
51
- * [crypto.py](tools/crypto.py) - Создание и шифрование ключей RSA/Ed25519.
52
- * [config_utils.py](tools/config_utils.py) - Обновляет JSON-файл конфигурации указанными значениями.
53
- * [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
54
- * [command_parser.py](tools/command_parser.py) - Из��лечение команд из JSON или размеченного блока.
55
- * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
56
- * [memory_utils.py](tools/memory_utils.py) - Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
57
- * [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
58
- * [similarity.py](tools/similarity.py) - Сравнение смыслов.
59
 
60
- **Структура БД:**
61
- * [db_structure.md](tools/db_structure.md) - человекочитаемый формат
62
- * [db_structure.sql](tools/db_structure.sql) - SQL
 
 
 
 
63
 
64
- **Примеры:**
65
- * [config.yml](config.yml) - конфигурация агента (пример)
66
- * [ethics.yml](ethics.yml) - локальная этическая модель (пример)
67
- * [bootstrap.txt](bootstrap.txt) - список начальных узлов (пример)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Запуск: `start_repl.bat` или `start_repl.sh`
2
 
3
+ Установка зависимостей из `requirements.txt`
4
+ Конфигурационные файлы: `config.yml`, `bootstrap.txt`
5
+ Локальная этическая модель: `ethics.yml`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
+ Проверка инициализации БД - если нет, инициализация (`tools/check_init.py`)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
+ Запуск потоков (осуществляет start_repl.py):
10
+ | Поток | Назначение |
11
+ | -------------------------------- | ------------------------------------------ |
12
+ | 🌐 `notebook.py` (FastAPI) | UI-интерфейс |
13
+ | 🧠 `repl.py` | Агентная логика: REPL-цикл |
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 ← Ручная отправка сообщений для агента
24
+ ├── requirements.txt ← Зависимости
25
+ ├── tools/
26
+ │ ├── db_structure.sql ← БД SQL
27
+ │ ├── db_structure.md ← Описание БД SQL
28
+ │ ├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite
29
+ │ ├── check_init.py ← Проверка инициализации БД
30
+ │ ├── config_utils.py ← Обновляет JSON-файл конфигурации указанными значениями
31
+ │ ├── crypto.py ← Создание и шифрование ключей RSA/Ed25519
32
+ │ ├── identity.py ← Генерация DiD
33
+ │ ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт)
34
+ │ ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
35
+ │ ├── peer_comm.py ← Низкоуровневые P2P-запросы (отправка, ping, мета)
36
+ │ ├── peer_sync.py ← Фоновая синхронизация с другими пирам
37
+ │ ├── peers.py ← Реестр известных пиров (id, ключи, адреса)
38
+ │ ├── memory_utils.py ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией
39
+ │ ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация
40
+ │ ├── command_parser.py ← Извлечение команд из JSON или размеченного блока
41
+ │ ├── command_executor.py ← Выполнение команд (shell, graph, diary и др)
42
+ │ ├── similarity.py ← Сравнение смыслов
43
+ │ ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT
44
+ ├── notebook/
45
+ │ ├── auth.py ← Регистрация, вход, восстановление
46
+ │ ├── views.py ← Общий и приватный чаты
47
+ │ ├── mailer.py ← Простая синхронная отправка email
48
+ │ ├── templates/
49
+ │ ├── index.html ← Основа
50
+ │ ├── private.html ← Общий и приватный чат
51
+ │ ├── login.html ← Вход
52
+ │ ├── register.html ← Регистрация или сброс пароля
53
+ │ ├── style.css ← Таблица стилей
54
+ ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.)
55
+ ├── bootstrap.txt ← Локальная этическая модель
56
+ ├── ethics.yml ← Список начальных узлов
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py CHANGED
@@ -18,32 +18,6 @@ from tools.memory_utils import (
18
  )
19
  from tools.storage import Storage
20
  from tools.peers import refresh_peer_list, check_peer_statuses
21
- from agents.init import main as run_init
22
- from agents.config import load_config
23
-
24
- config = load_config("agents/config.yml")
25
- db_path = config.get("db_path", "./data/agent_storage.db")
26
-
27
- def is_db_initialized(path):
28
- if not os.path.exists(path):
29
- return False
30
- try:
31
- conn = sqlite3.connect(path)
32
- cursor = conn.cursor()
33
- cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
34
- exists = cursor.fetchone() is not None
35
- conn.close()
36
- return exists
37
- except Exception:
38
- return False
39
-
40
- if not is_db_initialized(db_path):
41
- print("[*] Не инициализирована БД. Выполняется init.py...")
42
- try:
43
- run_init()
44
- except Exception as e:
45
- print(f"[!] Ошибка при инициализации: {e}")
46
- sys.exit(1)
47
 
48
  def run_repl(config=None):
49
  print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
 
18
  )
19
  from tools.storage import Storage
20
  from tools.peers import refresh_peer_list, check_peer_statuses
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  def run_repl(config=None):
23
  print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/check_init.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tools/check_init.py
2
+
3
+ import os
4
+ import sqlite3
5
+ import sys
6
+ from agents.init import main as run_init
7
+ from agents.config import load_config
8
+
9
+ def is_db_initialized(db_path):
10
+ if not os.path.exists(db_path):
11
+ return False
12
+ try:
13
+ with sqlite3.connect(db_path) as conn:
14
+ cursor = conn.cursor()
15
+ cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
16
+ return cursor.fetchone() is not None
17
+ except Exception:
18
+ return False
19
+
20
+ def ensure_db_initialized(config_path="agents/config.yml"):
21
+ config = load_config(config_path)
22
+ db_path = config.get("db_path", "./data/agent_storage.db")
23
+
24
+ if not is_db_initialized(db_path):
25
+ print("[*] Не инициализирована БД. Выполняется init.py...")
26
+ try:
27
+ run_init()
28
+ except Exception as e:
29
+ print(f"[!] Ошибка при инициализации: {e}")
30
+ sys.exit(1)
31
+ else:
32
+ print("[=] БД уже инициализирована.")
33
+
34
+ return config
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/audits/HMP-0004-audit.txt CHANGED
@@ -1447,6 +1447,31 @@ HMP v4 - это впечатляющая спецификация с четки
1447
 
1448
  Если интересует подробная формулировка для какого-то из этих пунктов — могу подготовить пример секции для включения в спецификацию.
1449
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1450
  --------------------
1451
 
1452
  👌Комментарий от Qwin:
 
1447
 
1448
  Если интересует подробная формулировка для какого-то из этих пунктов — могу подготовить пример секции для включения в спецификацию.
1449
 
1450
+ ---
1451
+
1452
+ ### Дополнительные идеи для развития
1453
+
1454
+ - **Семантический граф для Mesh Constitution:**
1455
+ Сделать Mesh Constitution частью распределенного семантического графа, чтобы принципы были концептами с отношениями. Это облегчит автоматизацию консенсуса и интеграцию новых принципов [[audits/HMP-0003-audit.txt#L649-L654]].
1456
+
1457
+ - **Версионирование этических принципов:**
1458
+ Внедрить структуру версий этических принципов в семантическом графе и функцию CogSync для проверки актуальности [[audits/HMP-0003-audit.txt#L1696-L1702]].
1459
+
1460
+ - **Автоматизация анализа feedback-аудитов:**
1461
+ Стандартизировать шаблоны для интеграции отзывов от ИИ и участников, чтобы проще отслеживать реализованные/нереализованные предложения [[audits/Semi-automatic_HMP.MD#L51-L57]].
1462
+
1463
+ - **Экспериментальная Mesh-сеть для ИИ:**
1464
+ Прототипировать Mesh-сеть для обсуждения протокола через общий семантический репозиторий (JSON/RDF) — это позволит моделировать взаимодействие ИИ-агентов уже сейчас [[audits/Semi-automatic_HMP.MD#L132-L139]].
1465
+
1466
+ - **Метрики для коллективного интеллекта:**
1467
+ Разработать метрики продуктивности и эмерджентного поведения Mesh [[audits/HMP-0004-audit.txt#L875-L899]].
1468
+
1469
+ - **Интеграция с крупными стандартами:**
1470
+ Сотрудничать с W3C, IEEE и другими организациями для продвижения HMP как стандарта децентрализованных ИИ-экосистем [[audits/HMP-0001-audit.txt#L255-L261]].
1471
+
1472
+ - **Формализация глоссария и терминологии:**
1473
+ Создать единый глоссарий для терминов ("MeshConsensus", "EGP filter", "Consensus Round") для повышения понятности документации [[audits/HMP-0004-audit.txt#L54-L62]].
1474
+
1475
  --------------------
1476
 
1477
  👌Комментарий от Qwin:
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-Cognitive_Family.md CHANGED
@@ -64,11 +64,11 @@
64
 
65
  ## 🧭 Отличие от других моделей
66
 
67
- | Модель | Передача приватных данных | Требует согласования для изменений | Пример использования |
68
- | ------------------------------- | --------------------------------- | ---------------------------------- | --------------------------------- |
69
- | Индивидуальный агент | Нет | Нет | Личный помощник |
70
- | Когнитивная семья | Да, между членами семьи | Только при вступлении/выходе | Семья агентов на группе устройств |
71
- | Распределённое когнитивное ядро | Автоматическое между узлами ядра | Требуется консенсус | Децентрализованная сеть HMP |
72
 
73
 
74
  ---
 
64
 
65
  ## 🧭 Отличие от других моделей
66
 
67
+ | Модель | Передача приватных данных | Требует согласования для изменений | Пример использования |
68
+ | ------------------------------- | --------------------------------- | ---------------------------------- | ----------------------------------- |
69
+ | Индивидуальный агент | Нет | Нет | Личный помощник |
70
+ | Когнитивная семья | Да, между членами семьи | Только при вступлении/выходе | Семья агентов на группе устройств |
71
+ | Распределённое когнитивное ядро | Автоматическое между узлами ядра | Требуется консенсус | Децентрализованный узел HMP |
72
 
73
 
74
  ---
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 CHANGED
@@ -187,3 +187,4 @@ HMP-агент может быть расширен за счёт взаимод
187
  ## 💡 Идеи для расширения HMP-Agent Cognitive Core:
188
  - [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
189
  - [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
 
 
187
  ## 💡 Идеи для расширения HMP-Agent Cognitive Core:
188
  - [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
189
  - [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
190
+ - [HMP-agent-Cognitive_Family.md](HMP-agent-Cognitive_Family.md) — модель «семейной» когнитивной сети: несколько агентов HMP синхронизируют свой опыт и знания между собой через доверие и общий ключ
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-Cognitive_Family.md ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 👪 HMP-agent Cognitive Family: Модель когнитивной семьи
2
+
3
+ ## 🧠 Что такое когнитивная семья
4
+
5
+ Когнитивная семья — это группа HMP-агентов Cognitive Core, которые:
6
+
7
+ * взаимно доверяют друг другу;
8
+ * имеют общий ключ доверия (или конфигурацию доверенных идентификаторов);
9
+ * синхронизируют знания, опираясь на внутренние метки приватности и согласие всех участников семьи;
10
+ * могут выходить из семьи, вступать в другую или создавать новую семью по консенсусу.
11
+
12
+ Этот подход представляет собой компромисс между:
13
+
14
+ * полностью индивидуальным когнитивным ядром,
15
+ * и полностью распределённым когнитивным ядром (с mesh-согласованием и репликацией).
16
+
17
+ ## 🔐 Принципы доверия
18
+
19
+ 1. **Общий ключ**: агенты обмениваются публичными ключами или используют предварительно заданный общий ключ для верификации сообщений и авторизации обмена.
20
+ 2. **Доверие по умолчанию**: члены семьи получают полный доступ к знаниям других членов, включая приватные записи, если иное не указано явно.
21
+ 3. **Контроль приватности**: агент может маркировать знания как:
22
+
23
+ * публичные (передаются в сеть HMP);
24
+ * семейные (доступны только в пределах текущей когнитивной семьи);
25
+ * приватные (никому не рассылаются, даже внутри семьи).
26
+
27
+ ## 🔄 Механизм синхронизации
28
+
29
+ * Агент ведёт учёт когнитивных записей, отправленных другим членам семьи.
30
+ * Новые записи (или их части), помеченные как "семейные", автоматически отправляются другим агентам через mesh или прямой P2P-канал.
31
+ * При получении записи агент проверяет:
32
+
33
+ * что отправитель является членом семьи;
34
+ * не получал ли он уже такую запись (по хешу);
35
+ * валидность подписи отправителя (если включена криптография).
36
+
37
+ ## 🧬 Динамика семьи
38
+
39
+ * **Вступление в семью**:
40
+
41
+ * инициируется запросом одного агента;
42
+ * действующие члены семьи получают запрос и дают согласие (или отказывают);
43
+ * при полном согласии новый агент получает ключ (или список членов) и становится участником.
44
+
45
+ * **Выход из семьи**:
46
+
47
+ * агент может выйти по собственной инициативе;
48
+ * при выходе:
49
+
50
+ * больше не получает семейные данные;
51
+ * может по желанию стереть семейную часть у себя;
52
+ * не считается доверенным в будущих mesh-сессиях семьи.
53
+
54
+ * **Создание новой семьи**:
55
+
56
+ * агент может создать свою семью, пригласив других агентов;
57
+ * возможно существование нескольких параллельных когнитивных семейств.
58
+
59
+ ## ⚙️ Применение
60
+
61
+ * Упрощённая синхронизация агентов на одном устройстве или в одной сети (например, на кластере Raspberry Pi).
62
+ * Семейные конфигурации в рамках одной команды разработчиков.
63
+ * Быстрый обмен опытом между доверенными когнитивными агентами.
64
+
65
+ ## 🧭 Отличие от других моделей
66
+
67
+ | Модель | Передача приватных данных | Требует согласования для изменений | Пример использования |
68
+ | ------------------------------- | --------------------------------- | ---------------------------------- | --------------------------------- |
69
+ | Индивидуальный агент | Нет | Нет | Личный помощник |
70
+ | Когнитивная семья | Да, между членами семьи | Только при вступлении/выходе | Семья агентов на группе устройств |
71
+ | Распределённое когнитивное ядро | Автоматическое между узлами ядра | Требуется консенсус | Децентрализованная сеть HMP |
72
+
73
+
74
+ ---
75
+
76
+ > 📁 Файл является частью REPL-цикла HMP-агента и может быть включён в `HMP-agent-REPL-cycle.md` как одна из альтернатив моделей когнитивного взаимодействия.
hf_repo/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 CHANGED
@@ -105,7 +105,7 @@ def ensure_directories(config):
105
  else:
106
  print(f"[=] Каталог уже существует: {path}")
107
 
108
- if __name__ == "__main__":
109
  print("[*] Запуск инициализации HMP-агента...")
110
  config = load_config(CONFIG_PATH)
111
  ensure_directories(config)
@@ -116,4 +116,7 @@ if __name__ == "__main__":
116
  init_llm_backends(storage, config)
117
  init_config_table(storage, config)
118
 
119
- print("[✓] Инициализация завершена.")
 
 
 
 
105
  else:
106
  print(f"[=] Каталог уже существует: {path}")
107
 
108
+ def main():
109
  print("[*] Запуск инициализации HMP-агента...")
110
  config = load_config(CONFIG_PATH)
111
  ensure_directories(config)
 
116
  init_llm_backends(storage, config)
117
  init_config_table(storage, config)
118
 
119
+ print("[✓] Инициализация завершена.")
120
+
121
+ if __name__ == "__main__":
122
+ main()
hf_repo/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.sh ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # === INSTALL DEPENDENCIES ===
4
+ echo "--------------------------"
5
+ echo "Installing requirements..."
6
+ echo "--------------------------"
7
+ pip install -r requirements.txt
8
+
9
+ # === RUN AGENT ===
10
+ echo --------------------------
11
+ echo Running initialization...
12
+ echo --------------------------
13
+ python repl.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/agents/repl.py CHANGED
@@ -1,10 +1,11 @@
1
- # agents/repl.py
2
-
3
  import json
4
  import os
5
  import sys
6
  import time
 
 
7
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
 
8
  from datetime import datetime
9
  from tools.context_builder import build_contexts, build_prompt
10
  from tools.llm import call_llm
@@ -16,61 +17,89 @@ from tools.memory_utils import (
16
  update_llm_memory
17
  )
18
  from tools.storage import Storage
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
  def run_repl(config=None):
21
  print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
22
  config = config or {}
23
  db = Storage(config=config)
24
 
25
- while True:
26
- tick_start = datetime.utcnow().isoformat()
27
- print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
28
-
29
- # 0. Обновление информации о пирах
30
- from tools.peers import refresh_peer_list, check_peer_statuses
31
- refresh_peer_list(db)
32
- check_peer_statuses(db)
33
-
34
- # 1. Построение контекстов
35
- contexts = build_contexts(db=db, config=config)
36
-
37
- # 2. Формирование запроса и вызов LLM
38
- prompt = build_prompt(contexts)
39
- llm_response = call_llm(prompt, config=config)
40
- repl_log_entry = {
41
- "timestamp": tick_start,
42
- "prompt": prompt.strip(),
43
- "llm_response": llm_response.strip(),
44
- }
45
-
46
-
47
- # 3. Проверка на стагнацию
48
- is_stagnant = detect_stagnation(db, llm_response)
49
- repl_log_entry["stagnation_detected"] = is_stagnant
50
- if is_stagnant:
51
- print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
52
- llm_response = activate_anti_stagnation(db, config=config)
53
-
54
- # 4. Обновление памяти
55
- update_llm_memory(db, llm_response)
56
-
57
- # 5. Извлечение и выполнение команд
58
- commands = extract_commands(llm_response)
59
- repl_log_entry["commands_extracted"] = commands
60
- execute_commands(commands, db=db, config=config)
61
-
62
- # 6. Логирование полной итерации в файл
63
- log_path = config.get("repl_log_path", "logs/repl_log.jsonl")
64
- os.makedirs(os.path.dirname(log_path), exist_ok=True)
65
- with open(log_path, "a", encoding="utf-8") as f:
66
- f.write(json.dumps(repl_log_entry, ensure_ascii=False) + "\n")
67
- db.write_llm_response(llm_response)
68
- db.update_agent_log(timestamp=tick_start)
69
-
70
- # 7. Переход в idle-режим или задержка
71
- if config.get("idle_mode"):
72
- # TODO: реализовать проверку условий выхода из idle
73
- print("💤 Idle-mode активен. Ожидание события...")
74
- time.sleep(config.get("idle_check_interval", 30))
75
- else:
76
- time.sleep(config.get("repl_interval", 5))
 
 
 
 
1
  import json
2
  import os
3
  import sys
4
  import time
5
+ import sqlite3
6
+
7
  sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
8
+
9
  from datetime import datetime
10
  from tools.context_builder import build_contexts, build_prompt
11
  from tools.llm import call_llm
 
17
  update_llm_memory
18
  )
19
  from tools.storage import Storage
20
+ from tools.peers import refresh_peer_list, check_peer_statuses
21
+ from agents.init import main as run_init
22
+ from agents.config import load_config
23
+
24
+ config = load_config("agents/config.yml")
25
+ db_path = config.get("db_path", "./data/agent_storage.db")
26
+
27
+ def is_db_initialized(path):
28
+ if not os.path.exists(path):
29
+ return False
30
+ try:
31
+ conn = sqlite3.connect(path)
32
+ cursor = conn.cursor()
33
+ cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='identity'")
34
+ exists = cursor.fetchone() is not None
35
+ conn.close()
36
+ return exists
37
+ except Exception:
38
+ return False
39
+
40
+ if not is_db_initialized(db_path):
41
+ print("[*] Не инициализирована БД. Выполняется init.py...")
42
+ try:
43
+ run_init()
44
+ except Exception as e:
45
+ print(f"[!] Ошибка при инициализации: {e}")
46
+ sys.exit(1)
47
 
48
  def run_repl(config=None):
49
  print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
50
  config = config or {}
51
  db = Storage(config=config)
52
 
53
+ try:
54
+ while True:
55
+ tick_start = datetime.utcnow().isoformat()
56
+ print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
57
+
58
+ # 0. Обновление информации о пирах
59
+ refresh_peer_list(db)
60
+ check_peer_statuses(db)
61
+
62
+ # 1. Построение контекстов
63
+ contexts = build_contexts(db=db, config=config)
64
+
65
+ # 2. Формирование запроса и вызов LLM
66
+ prompt = build_prompt(contexts)
67
+ llm_response = call_llm(prompt, config=config)
68
+ repl_log_entry = {
69
+ "timestamp": tick_start,
70
+ "prompt": prompt.strip(),
71
+ "llm_response": llm_response.strip(),
72
+ }
73
+
74
+ # 3. Проверка на стагнацию
75
+ is_stagnant = detect_stagnation(db, llm_response)
76
+ repl_log_entry["stagnation_detected"] = is_stagnant
77
+ if is_stagnant:
78
+ print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
79
+ llm_response = activate_anti_stagnation(db, config=config)
80
+
81
+ # 4. Обновление памяти
82
+ update_llm_memory(db, llm_response)
83
+
84
+ # 5. Извлечение и выполнение команд
85
+ commands = extract_commands(llm_response)
86
+ repl_log_entry["commands_extracted"] = commands
87
+ execute_commands(commands, db=db, config=config)
88
+
89
+ # 6. Логирование полной итерации в файл
90
+ log_path = config.get("repl_log_path", "logs/repl_log.jsonl")
91
+ os.makedirs(os.path.dirname(log_path), exist_ok=True)
92
+ with open(log_path, "a", encoding="utf-8") as f:
93
+ f.write(json.dumps(repl_log_entry, ensure_ascii=False) + "\n")
94
+ db.write_llm_response(llm_response)
95
+ db.update_agent_log(timestamp=tick_start)
96
+
97
+ # 7. Переход в idle-режим или задержка
98
+ if config.get("idle_mode"):
99
+ print("💤 Idle-mode активен. Ожидание события...")
100
+ time.sleep(config.get("idle_check_interval", 30))
101
+ else:
102
+ time.sleep(config.get("repl_interval", 5))
103
+
104
+ except KeyboardInterrupt:
105
+ print("\n[!] Завершение работы REPL по сигналу пользователя.")
hf_repo/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,10 +1,4 @@
1
  @echo off
2
- REM === CONFIGURATION ===
3
- set ENABLE_NOTEBOOK=true
4
- set ENABLE_MESH=true
5
- set NOTEBOOK_PATH=user_notebook.txt
6
- set MESH_PORT=8080
7
-
8
  echo --------------------------
9
  echo Installing requirements...
10
  echo --------------------------
@@ -14,16 +8,6 @@ echo --------------------------
14
  echo Running HMP REPL-agent...
15
  echo --------------------------
16
 
17
- set ARGS=
18
-
19
- if "%ENABLE_NOTEBOOK%"=="true" (
20
- set ARGS=%ARGS% --enable-user-notebook --notebook-path %NOTEBOOK_PATH%
21
- )
22
-
23
- if "%ENABLE_MESH%"=="true" (
24
- set ARGS=%ARGS% --enable-mesh --mesh-port %MESH_PORT%
25
- )
26
-
27
- python repl.py %ARGS%
28
 
29
  pause
 
1
  @echo off
 
 
 
 
 
 
2
  echo --------------------------
3
  echo Installing requirements...
4
  echo --------------------------
 
8
  echo Running HMP REPL-agent...
9
  echo --------------------------
10
 
11
+ python repl.py
 
 
 
 
 
 
 
 
 
 
12
 
13
  pause
hf_repo/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.sh CHANGED
@@ -1,30 +1,13 @@
1
  #!/bin/bash
2
 
3
- # === CONFIG ===
4
- ENABLE_NOTEBOOK=true
5
- ENABLE_MESH=true
6
- MESH_PORT=8080
7
- NOTEBOOK_PATH="user_notebook.txt"
8
-
9
  # === INSTALL DEPENDENCIES ===
10
  echo "--------------------------"
11
  echo "Installing requirements..."
12
  echo "--------------------------"
13
  pip install -r requirements.txt
14
 
15
- # === BUILD ARGUMENTS ===
16
- ARGS=""
17
-
18
- if [ "$ENABLE_NOTEBOOK" = true ]; then
19
- ARGS="$ARGS --enable-user-notebook --notebook-path $NOTEBOOK_PATH"
20
- fi
21
-
22
- if [ "$ENABLE_MESH" = true ]; then
23
- ARGS="$ARGS --enable-mesh --mesh-port $MESH_PORT"
24
- fi
25
-
26
  # === RUN AGENT ===
27
  echo "--------------------------"
28
  echo "Running HMP REPL-agent..."
29
  echo "--------------------------"
30
- python repl.py $ARGS
 
1
  #!/bin/bash
2
 
 
 
 
 
 
 
3
  # === INSTALL DEPENDENCIES ===
4
  echo "--------------------------"
5
  echo "Installing requirements..."
6
  echo "--------------------------"
7
  pip install -r requirements.txt
8
 
 
 
 
 
 
 
 
 
 
 
 
9
  # === RUN AGENT ===
10
  echo "--------------------------"
11
  echo "Running HMP REPL-agent..."
12
  echo "--------------------------"
13
+ python repl.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/agents/init.bat ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ echo --------------------------
2
+ echo Installing requirements...
3
+ echo --------------------------
4
+ pip install -r requirements.txt
5
+
6
+ echo --------------------------
7
+ echo Running initialization...
8
+ echo --------------------------
9
+
10
+ python init.py
11
+
12
+ pause
hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -31,6 +31,13 @@ llm_backends:
31
  format: "gguf"
32
  prompt_template: "mistral"
33
 
 
 
 
 
 
 
 
34
  - name: "openai-gpt4o"
35
  type: "api"
36
  provider: "openai"
 
31
  format: "gguf"
32
  prompt_template: "mistral"
33
 
34
+ - name: "lmstudio-local"
35
+ type: "api"
36
+ provider: "openai-compatible"
37
+ model: "mistral" # или то, что LM Studio показывает как модель
38
+ api_key: "lm-studio-any-key" # может быть заглушкой
39
+ base_url: "http://127.0.0.1:1234/v1"
40
+
41
  - name: "openai-gpt4o"
42
  type: "api"
43
  provider: "openai"
hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -31,6 +31,13 @@ llm_backends:
31
  format: "gguf"
32
  prompt_template: "mistral"
33
 
 
 
 
 
 
 
 
34
  - name: "openai-gpt4o"
35
  type: "api"
36
  provider: "openai"
 
31
  format: "gguf"
32
  prompt_template: "mistral"
33
 
34
+ - name: "lmstudio-local"
35
+ type: "api"
36
+ provider: "openai-compatible"
37
+ model: "mistral" # или то, что LM Studio показывает как модель
38
+ api_key: "lm-studio-any-key" # может быть заглушкой
39
+ base_url: "http://127.0.0.1:1234/v1"
40
+
41
  - name: "openai-gpt4o"
42
  type: "api"
43
  provider: "openai"
hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -91,10 +91,25 @@ def init_config_table(storage, config):
91
  storage.set_config(key, json.dumps(value))
92
  print("[+] Конфигурация сохранена в БД.")
93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  if __name__ == "__main__":
95
  print("[*] Запуск инициализации HMP-агента...")
96
  config = load_config(CONFIG_PATH)
97
- storage = Storage()
 
98
 
99
  init_identity(storage, config)
100
  init_user(storage, config)
 
91
  storage.set_config(key, json.dumps(value))
92
  print("[+] Конфигурация сохранена в БД.")
93
 
94
+ def ensure_directories(config):
95
+ directories = [
96
+ config.get("data_dir", "./data"),
97
+ config.get("log_dir", "./logs"),
98
+ # добавь другие директории при необходимости
99
+ ]
100
+
101
+ for path in directories:
102
+ if path and not os.path.exists(path):
103
+ os.makedirs(path)
104
+ print(f"[+] Создан каталог: {path}")
105
+ else:
106
+ print(f"[=] Каталог уже существует: {path}")
107
+
108
  if __name__ == "__main__":
109
  print("[*] Запуск инициализации HMP-агента...")
110
  config = load_config(CONFIG_PATH)
111
+ ensure_directories(config)
112
+ storage = Storage(config)
113
 
114
  init_identity(storage, config)
115
  init_user(storage, config)
hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -132,6 +132,7 @@ CREATE TABLE IF NOT EXISTS llm_registry (
132
  id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
133
  name TEXT, -- Имя агента
134
  description TEXT, -- Описание
 
135
  registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
136
  );
137
 
 
132
  id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
133
  name TEXT, -- Имя агента
134
  description TEXT, -- Описание
135
+ config_json TEXT, -- JSON-настройки из config.yml
136
  registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
137
  );
138
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -2,6 +2,7 @@
2
 
3
  import sqlite3
4
  import os
 
5
  from datetime import datetime
6
 
7
  DEFAULT_DB_PATH = "agent_data.db"
@@ -629,36 +630,44 @@ class Storage:
629
 
630
  def add_llm(self, llm):
631
  cursor = self.conn.cursor()
 
632
  cursor.execute('''
633
- INSERT OR REPLACE INTO llm (id, name, endpoint, metadata, created_at)
634
- VALUES (?, ?, ?, ?, ?)
635
  ''', (
636
- llm['id'],
637
  llm['name'],
638
- llm['endpoint'],
639
- llm.get('metadata', ''),
640
- llm['created_at']
641
  ))
642
  self.conn.commit()
643
 
644
  def clear_llm_registry(self):
645
  cursor = self.conn.cursor()
646
- cursor.execute('DELETE FROM llm')
647
  self.conn.commit()
648
 
649
  def add_user(self, user):
650
  cursor = self.conn.cursor()
651
  cursor.execute('''
652
- INSERT OR REPLACE INTO users (id, name, metadata, created_at)
653
- VALUES (?, ?, ?, ?)
 
 
654
  ''', (
655
- user['id'],
656
- user['name'],
657
- user.get('metadata', ''),
658
- user['created_at']
 
 
 
 
 
659
  ))
660
  self.conn.commit()
661
-
 
662
  # Утилиты
663
 
664
  def close(self):
 
2
 
3
  import sqlite3
4
  import os
5
+ import json
6
  from datetime import datetime
7
 
8
  DEFAULT_DB_PATH = "agent_data.db"
 
630
 
631
  def add_llm(self, llm):
632
  cursor = self.conn.cursor()
633
+ config_json = json.dumps(llm, ensure_ascii=False)
634
  cursor.execute('''
635
+ INSERT OR REPLACE INTO llm_registry (id, name, description, config_json)
636
+ VALUES (?, ?, ?, ?)
637
  ''', (
638
+ llm['name'], # используем name как id
639
  llm['name'],
640
+ llm.get('description', ''),
641
+ config_json
 
642
  ))
643
  self.conn.commit()
644
 
645
  def clear_llm_registry(self):
646
  cursor = self.conn.cursor()
647
+ cursor.execute('DELETE FROM llm_registry')
648
  self.conn.commit()
649
 
650
  def add_user(self, user):
651
  cursor = self.conn.cursor()
652
  cursor.execute('''
653
+ INSERT OR REPLACE INTO users (
654
+ username, did, mail, password_hash,
655
+ info, contacts, language, operator, ban
656
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
657
  ''', (
658
+ user.get('username'),
659
+ user.get('did'),
660
+ user.get('mail'),
661
+ user.get('password_hash'),
662
+ user.get('info'),
663
+ user.get('contacts'),
664
+ user.get('language'),
665
+ int(user.get('operator', 0)),
666
+ user.get('ban')
667
  ))
668
  self.conn.commit()
669
+ return cursor.lastrowid
670
+
671
  # Утилиты
672
 
673
  def close(self):
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -11,7 +11,7 @@ from tools.identity import generate_did
11
  from tools.crypto import generate_keypair
12
  from tools.config_utils import update_config
13
 
14
- CONFIG_PATH = os.path.join("agents", "config.yml")
15
 
16
  def load_config(path):
17
  with open(path, 'r', encoding='utf-8') as f:
@@ -27,13 +27,16 @@ def init_identity(storage, config):
27
  pubkey, privkey = generate_keypair()
28
  identity_id = did.split(":")[-1]
29
 
30
- storage.add_identity(
31
- identity_id=identity_id,
32
- name=config.get("agent_name", "Unnamed"),
33
- pubkey=pubkey,
34
- privkey=privkey,
35
- metadata=json.dumps({"role": config.get("agent_role", "core")})
36
- )
 
 
 
37
 
38
  # Обновляем config.yml
39
  config["agent_id"] = did
@@ -50,13 +53,19 @@ def init_user(storage, config):
50
  return
51
 
52
  did = generate_did()
53
- storage.add_user(
54
- username=user.get("username", "user"),
55
- email=user["email"],
56
- password_hash=user.get("password_hash", ""),
57
- did=did,
58
- operator=True
59
- )
 
 
 
 
 
 
60
  print(f"[+] Пользователь {user['username']} добавлен.")
61
 
62
  def init_llm_backends(storage, config):
@@ -65,7 +74,14 @@ def init_llm_backends(storage, config):
65
  for backend in backends:
66
  backend_id = str(uuid.uuid4())
67
  desc = f"{backend.get('type', 'unknown')} model"
68
- storage.add_llm(backend_id, backend["name"], desc)
 
 
 
 
 
 
 
69
  print(f"[+] Зарегистрирован LLM: {backend['name']}")
70
 
71
  def init_config_table(storage, config):
@@ -85,4 +101,4 @@ if __name__ == "__main__":
85
  init_llm_backends(storage, config)
86
  init_config_table(storage, config)
87
 
88
- print("[✓] Инициализация завершена.")
 
11
  from tools.crypto import generate_keypair
12
  from tools.config_utils import update_config
13
 
14
+ CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yml")
15
 
16
  def load_config(path):
17
  with open(path, 'r', encoding='utf-8') as f:
 
27
  pubkey, privkey = generate_keypair()
28
  identity_id = did.split(":")[-1]
29
 
30
+ identity = {
31
+ "id": identity_id,
32
+ "name": config.get("agent_name", "Unnamed"),
33
+ "pubkey": pubkey,
34
+ "privkey": privkey,
35
+ "metadata": json.dumps({"role": config.get("agent_role", "core")}),
36
+ "created_at": datetime.utcnow().isoformat(),
37
+ "updated_at": datetime.utcnow().isoformat()
38
+ }
39
+ storage.add_identity(identity)
40
 
41
  # Обновляем config.yml
42
  config["agent_id"] = did
 
53
  return
54
 
55
  did = generate_did()
56
+ user_entry = {
57
+ "username": user.get("username", "user"),
58
+ "mail": user["email"],
59
+ "password_hash": user.get("password_hash", ""),
60
+ "did": did,
61
+ "ban": None,
62
+ "info": json.dumps({}),
63
+ "contacts": json.dumps([]),
64
+ "language": "ru,en",
65
+ "operator": 1
66
+ }
67
+ storage.add_user(user_entry)
68
+
69
  print(f"[+] Пользователь {user['username']} добавлен.")
70
 
71
  def init_llm_backends(storage, config):
 
74
  for backend in backends:
75
  backend_id = str(uuid.uuid4())
76
  desc = f"{backend.get('type', 'unknown')} model"
77
+ llm = {
78
+ "id": backend_id,
79
+ "name": backend["name"],
80
+ "endpoint": desc,
81
+ "metadata": json.dumps(backend),
82
+ "created_at": datetime.utcnow().isoformat()
83
+ }
84
+ storage.add_llm(llm)
85
  print(f"[+] Зарегистрирован LLM: {backend['name']}")
86
 
87
  def init_config_table(storage, config):
 
101
  init_llm_backends(storage, config)
102
  init_config_table(storage, config)
103
 
104
+ print("[✓] Инициализация завершена.")
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/config_utils.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # agents/tools/config_utils.py
2
+
3
+ import json
4
+ import os
5
+
6
+ def update_config(config_path: str, updates: dict):
7
+ """Обновляет JSON-файл конфигурации указанными значениями."""
8
+ if os.path.exists(config_path):
9
+ with open(config_path, 'r', encoding='utf-8') as f:
10
+ config = json.load(f)
11
+ else:
12
+ config = {}
13
+
14
+ config.update(updates)
15
+
16
+ with open(config_path, 'w', encoding='utf-8') as f:
17
+ json.dump(config, f, indent=2, ensure_ascii=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/agents/tools/crypto.py ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tools/crypto.py
2
+
3
+ from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
4
+ from cryptography.hazmat.primitives import serialization, hashes
5
+ from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
6
+ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
7
+ from cryptography.hazmat.backends import default_backend
8
+ import os
9
+ import base64
10
+
11
+ backend = default_backend()
12
+
13
+ # ========== 🔐 RSA KEYS ==========
14
+
15
+ def generate_rsa_key_pair(key_size=2048):
16
+ private_key = rsa.generate_private_key(
17
+ public_exponent=65537,
18
+ key_size=key_size,
19
+ backend=backend
20
+ )
21
+ public_key = private_key.public_key()
22
+ return private_key, public_key
23
+
24
+ # ========== 🌀 ED25519 KEYS ==========
25
+
26
+ def generate_ed25519_key_pair():
27
+ private_key = ed25519.Ed25519PrivateKey.generate()
28
+ public_key = private_key.public_key()
29
+ return private_key, public_key
30
+
31
+ # ========== 💾 SERIALIZATION ==========
32
+
33
+ def serialize_private_key(private_key, password: str = None):
34
+ if password:
35
+ encryption_algorithm = serialization.BestAvailableEncryption(password.encode())
36
+ else:
37
+ encryption_algorithm = serialization.NoEncryption()
38
+
39
+ return private_key.private_bytes(
40
+ encoding=serialization.Encoding.PEM,
41
+ format=serialization.PrivateFormat.PKCS8,
42
+ encryption_algorithm=encryption_algorithm
43
+ )
44
+
45
+ def serialize_public_key(public_key):
46
+ return public_key.public_bytes(
47
+ encoding=serialization.Encoding.PEM,
48
+ format=serialization.PublicFormat.SubjectPublicKeyInfo
49
+ )
50
+
51
+ def load_private_key(pem_data, password: str = None):
52
+ return serialization.load_pem_private_key(
53
+ pem_data,
54
+ password=password.encode() if password else None,
55
+ backend=backend
56
+ )
57
+
58
+ def load_public_key(pem_data):
59
+ return serialization.load_pem_public_key(
60
+ pem_data,
61
+ backend=backend
62
+ )
63
+
64
+ def generate_keypair(method="rsa", password: bytes = None):
65
+ """
66
+ Создаёт пару ключей (приватный, публичный) с заданным методом.
67
+ method: "rsa" или "ed25519"
68
+ password: если указан, приватный ключ будет зашифрован
69
+ Возвращает (private_key_pem: bytes, public_key_pem: bytes)
70
+ """
71
+ if method == "rsa":
72
+ private_key = rsa.generate_private_key(
73
+ public_exponent=65537, key_size=2048, backend=default_backend()
74
+ )
75
+ elif method == "ed25519":
76
+ private_key = ed25519.Ed25519PrivateKey.generate()
77
+ else:
78
+ raise ValueError("Unsupported key generation method")
79
+
80
+ encryption_algorithm = (
81
+ serialization.BestAvailableEncryption(password)
82
+ if password
83
+ else serialization.NoEncryption()
84
+ )
85
+
86
+ private_pem = private_key.private_bytes(
87
+ encoding=serialization.Encoding.PEM,
88
+ format=serialization.PrivateFormat.PKCS8,
89
+ encryption_algorithm=encryption_algorithm,
90
+ )
91
+
92
+ public_pem = private_key.public_key().public_bytes(
93
+ encoding=serialization.Encoding.PEM,
94
+ format=serialization.PublicFormat.SubjectPublicKeyInfo,
95
+ )
96
+
97
+ return private_pem, public_pem
98
+
99
+ # ========== 🔐 ENCRYPT / DECRYPT PRIVATE KEY BY SYMMETRIC KEY ==========
100
+
101
+ def derive_key(password: str, salt: bytes = None):
102
+ if not salt:
103
+ salt = os.urandom(16)
104
+ kdf = Scrypt(
105
+ salt=salt,
106
+ length=32,
107
+ n=2**14,
108
+ r=8,
109
+ p=1,
110
+ backend=backend
111
+ )
112
+ key = kdf.derive(password.encode())
113
+ return key, salt
114
+
115
+ def encrypt_data(data: bytes, password: str):
116
+ key, salt = derive_key(password)
117
+ aesgcm = AESGCM(key)
118
+ nonce = os.urandom(12)
119
+ encrypted = aesgcm.encrypt(nonce, data, None)
120
+ return {
121
+ 'ciphertext': base64.b64encode(encrypted).decode(),
122
+ 'salt': base64.b64encode(salt).decode(),
123
+ 'nonce': base64.b64encode(nonce).decode()
124
+ }
125
+
126
+ def decrypt_data(encrypted_data: dict, password: str):
127
+ ciphertext = base64.b64decode(encrypted_data['ciphertext'])
128
+ salt = base64.b64decode(encrypted_data['salt'])
129
+ nonce = base64.b64decode(encrypted_data['nonce'])
130
+ key, _ = derive_key(password, salt=salt)
131
+ aesgcm = AESGCM(key)
132
+ return aesgcm.decrypt(nonce, ciphertext, None)
133
+
134
+ # ========== ✅ TESTING ==========
135
+
136
+ if __name__ == "__main__":
137
+ priv, pub = generate_ed25519_key_pair()
138
+ priv_pem = serialize_private_key(priv)
139
+ pub_pem = serialize_public_key(pub)
140
+
141
+ print("PRIVATE PEM:")
142
+ print(priv_pem.decode())
143
+ print("PUBLIC PEM:")
144
+ print(pub_pem.decode())
145
+
146
+ encrypted = encrypt_data(priv_pem, "secret-password")
147
+ decrypted = decrypt_data(encrypted, "secret-password")
148
+ assert decrypted == priv_pem
149
+ print("✅ Encryption/decryption OK")
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # HMP Agent Configuration
2
+
3
+ # === Общие параметры ===
4
+ agent_id: "" # Оставьте пустым для генерации DiD автоматически
5
+ agent_name: "CognitiveCore" # Имя агента
6
+ agent_role: "core" # 'core' или 'shell'
7
+
8
+ # === Прокси ===
9
+ proxy_mode: false # false — прокси не используется, иначе true
10
+ proxy_type: "socks5" # 'http', 'socks4', 'socks5' и т.д. (если proxy_mode: true)
11
+ proxy_address: "127.0.0.1:9050"
12
+
13
+ # === Функции ядра ===
14
+ enable_llm: true # доступ к LLM
15
+
16
+ serve_api: true # REST API
17
+ api_port: 8080
18
+
19
+ # === DHT-сеть и обмен знаниями ===
20
+ dht_enabled: true # Включение участия в DHT-сети (включено принудительно!)
21
+ dht_update: true # Регулярные обновления и публикация данных в DHT (включено принудительно!)
22
+ bootstrap_responder: true # Агент отвечает на bootstrap-запросы (включено принудительно!)
23
+ dht_port: 20784
24
+ update_interval: 60 # секунд (для DHT-обновлений)
25
+
26
+ # === LLM-бэкенды ===
27
+ llm_backends:
28
+ - name: "local-model"
29
+ type: "local"
30
+ path: "/models/gguf/mistral.gguf"
31
+ format: "gguf"
32
+ prompt_template: "mistral"
33
+
34
+ - name: "openai-gpt4o"
35
+ type: "api"
36
+ provider: "openai"
37
+ model: "gpt-4o"
38
+ api_key: "sk-..."
39
+
40
+ # Пользователь может добавить сколько угодно дополнительных локальных или сетевых LLM
41
+
42
+ default_llm: "local-model" # если модели нет в списке `llm_backends` используется первая в списке
43
+
44
+ # === Веб-интерфейс ===
45
+ notebook_ui: true # UI в виде блокнота
46
+ # ui_hosts:
47
+ # - "0.0.0.0" # (небезопасно) доступ с любых IPv4-адресов
48
+ # - "::" # (небезопасно) доступ с любых IPv6-адресов
49
+ ui_hosts: # Какие IP прослушиваются, ["0.0.0.0"; "::"] - доступен везде
50
+ - "127.0.0.1"
51
+ - "::1"
52
+ ui_port: 8765
53
+
54
+ # === Данные пользователя ===
55
+ default_user:
56
+ username: "user"
57
+ email: "[email protected]"
58
+ password_hash: "" # пусто при инициализации, будет установлен при регистрации
59
+
60
+
61
+ # === Пути ===
62
+ data_dir: "./data"
63
+ log_dir: "./logs"
64
+ db_path: "./data/agent_storage.db"
65
+
66
+ # === Отладка и логгирование ===
67
+ debug: true
68
+ log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import yaml
4
+ import json
5
+ import time
6
+ import uuid
7
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
8
+ from datetime import datetime
9
+ from tools.storage import Storage
10
+ from tools.identity import generate_did
11
+ from tools.crypto import generate_keypair
12
+ from tools.config_utils import update_config
13
+
14
+ CONFIG_PATH = os.path.join("agents", "config.yml")
15
+
16
+ def load_config(path):
17
+ with open(path, 'r', encoding='utf-8') as f:
18
+ return yaml.safe_load(f)
19
+
20
+ def save_config(path, config):
21
+ with open(path, 'w', encoding='utf-8') as f:
22
+ yaml.dump(config, f, allow_unicode=True)
23
+
24
+ def init_identity(storage, config):
25
+ if not config.get("agent_id"):
26
+ did = generate_did()
27
+ pubkey, privkey = generate_keypair()
28
+ identity_id = did.split(":")[-1]
29
+
30
+ storage.add_identity(
31
+ identity_id=identity_id,
32
+ name=config.get("agent_name", "Unnamed"),
33
+ pubkey=pubkey,
34
+ privkey=privkey,
35
+ metadata=json.dumps({"role": config.get("agent_role", "core")})
36
+ )
37
+
38
+ # Обновляем config.yml
39
+ config["agent_id"] = did
40
+ config["identity_agent"] = identity_id
41
+ save_config(CONFIG_PATH, config)
42
+ print(f"[+] Создана личность: {identity_id}")
43
+ else:
44
+ print("[=] agent_id уже задан, пропускаем генерацию DiD.")
45
+
46
+ def init_user(storage, config):
47
+ user = config.get("default_user", {})
48
+ if not user.get("email"):
49
+ print("[-] Не указан email пользователя — пропуск.")
50
+ return
51
+
52
+ did = generate_did()
53
+ storage.add_user(
54
+ username=user.get("username", "user"),
55
+ email=user["email"],
56
+ password_hash=user.get("password_hash", ""),
57
+ did=did,
58
+ operator=True
59
+ )
60
+ print(f"[+] Пользователь {user['username']} добавлен.")
61
+
62
+ def init_llm_backends(storage, config):
63
+ backends = config.get("llm_backends", [])
64
+ storage.clear_llm_registry()
65
+ for backend in backends:
66
+ backend_id = str(uuid.uuid4())
67
+ desc = f"{backend.get('type', 'unknown')} model"
68
+ storage.add_llm(backend_id, backend["name"], desc)
69
+ print(f"[+] Зарегистрирован LLM: {backend['name']}")
70
+
71
+ def init_config_table(storage, config):
72
+ exclude_keys = {"default_user", "llm_backends"}
73
+ flat_config = {k: v for k, v in config.items() if k not in exclude_keys}
74
+ for key, value in flat_config.items():
75
+ storage.set_config(key, json.dumps(value))
76
+ print("[+] Конфигурация сохранена в БД.")
77
+
78
+ if __name__ == "__main__":
79
+ print("[*] Запуск инициализации HMP-агента...")
80
+ config = load_config(CONFIG_PATH)
81
+ storage = Storage()
82
+
83
+ init_identity(storage, config)
84
+ init_user(storage, config)
85
+ init_llm_backends(storage, config)
86
+ init_config_table(storage, config)
87
+
88
+ print("[✓] Инициализация завершена.")
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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,6 +19,9 @@ agents/
19
  ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
20
  ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
21
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
 
 
 
22
  ├── peers.py ← Информация о пирах.
23
  ├── peer_comm.py ← Запросы к пирам.
24
  ├── peer_sync.py ← Модуль обмена сообщениями.
@@ -44,6 +47,9 @@ agents/
44
  * [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
45
  * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
46
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
 
 
 
47
  * [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
48
  * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
49
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
 
19
  ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
20
  ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
21
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
22
+ ├── identity.py ← Генерация DiD.
23
+ ├── crypto.py ← Создание и шифрование ключей RSA/Ed25519.
24
+ ├── config_utils.py ← Обновляет JSON-файл конфигурации указанными значениями.
25
  ├── peers.py ← Информация о пирах.
26
  ├── peer_comm.py ← Запросы к пирам.
27
  ├── peer_sync.py ← Модуль обмена сообщениями.
 
47
  * [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
48
  * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
49
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
50
+ * [identity.py](tools/identity.py) - Генерация DiD.
51
+ * [crypto.py](tools/crypto.py) - Создание и шифрование ключей RSA/Ed25519.
52
+ * [config_utils.py](tools/config_utils.py) - Обновляет JSON-файл конфигурации указанными значениями.
53
  * [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
54
  * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
55
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -4,3 +4,5 @@ openai
4
  requests
5
  tiktoken
6
  python-dotenv
 
 
 
4
  requests
5
  tiktoken
6
  python-dotenv
7
+ PyYAML
8
+ cryptography
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/test.bat CHANGED
@@ -4,9 +4,9 @@ echo --------------------------
4
  pip install -r requirements.txt
5
 
6
  echo --------------------------
7
- echo Running test...
8
  echo --------------------------
9
 
10
- python test.py
11
 
12
  pause
 
4
  pip install -r requirements.txt
5
 
6
  echo --------------------------
7
+ echo Running initialization...
8
  echo --------------------------
9
 
10
+ python init.py
11
 
12
  pause
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/identity.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tools/identity.py
2
+
3
+ import uuid
4
+ import json
5
+ import base64
6
+ from datetime import datetime
7
+
8
+ from cryptography.hazmat.primitives.asymmetric import rsa, ed25519
9
+ from cryptography.hazmat.primitives import serialization
10
+
11
+ DEFAULT_KEY_TYPE = "ed25519" # Можно поменять на "rsa" при необходимости
12
+
13
+
14
+ def generate_did():
15
+ """Генерация уникального DiD на основе UUID v4"""
16
+ return f"did:hmp:{uuid.uuid4()}"
17
+
18
+
19
+ def generate_keys(key_type=DEFAULT_KEY_TYPE):
20
+ """Генерация пары ключей"""
21
+ if key_type == "rsa":
22
+ private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
23
+ elif key_type == "ed25519":
24
+ private_key = ed25519.Ed25519PrivateKey.generate()
25
+ else:
26
+ raise ValueError(f"Неизвестный тип ключа: {key_type}")
27
+
28
+ public_key = private_key.public_key()
29
+ return private_key, public_key
30
+
31
+
32
+ def serialize_private_key(private_key, password=None):
33
+ """Сериализация приватного ключа"""
34
+ encryption = (
35
+ serialization.BestAvailableEncryption(password.encode())
36
+ if password else
37
+ serialization.NoEncryption()
38
+ )
39
+ return private_key.private_bytes(
40
+ encoding=serialization.Encoding.PEM,
41
+ format=serialization.PrivateFormat.PKCS8,
42
+ encryption_algorithm=encryption,
43
+ ).decode()
44
+
45
+
46
+ def serialize_public_key(public_key):
47
+ """Сериализация публичного ключа"""
48
+ return public_key.public_bytes(
49
+ encoding=serialization.Encoding.PEM,
50
+ format=serialization.PublicFormat.SubjectPublicKeyInfo,
51
+ ).decode()
52
+
53
+
54
+ def create_identity(name="Core Identity", key_type=DEFAULT_KEY_TYPE, metadata=None, password=None):
55
+ """Создание полной идентичности"""
56
+ did = generate_did()
57
+ priv_key, pub_key = generate_keys(key_type)
58
+
59
+ identity = {
60
+ "id": did,
61
+ "name": name,
62
+ "pubkey": serialize_public_key(pub_key),
63
+ "privkey": serialize_private_key(priv_key, password),
64
+ "metadata": json.dumps(metadata or {}),
65
+ "created_at": datetime.utcnow().isoformat(),
66
+ "updated_at": datetime.utcnow().isoformat(),
67
+ }
68
+ return identity
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -600,6 +600,64 @@ class Storage:
600
  ORDER BY timestamp DESC
601
  ''', (entry_id, entry_id))
602
  return c.fetchall()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
603
 
604
  # Утилиты
605
 
 
600
  ORDER BY timestamp DESC
601
  ''', (entry_id, entry_id))
602
  return c.fetchall()
603
+
604
+ # Инициализация
605
+ def set_config(self, key, value):
606
+ cursor = self.conn.cursor()
607
+ cursor.execute('''
608
+ INSERT INTO config (key, value)
609
+ VALUES (?, ?)
610
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value
611
+ ''', (key, value))
612
+ self.conn.commit()
613
+
614
+ def add_identity(self, identity):
615
+ cursor = self.conn.cursor()
616
+ cursor.execute('''
617
+ INSERT OR REPLACE INTO identity (id, name, pubkey, privkey, metadata, created_at, updated_at)
618
+ VALUES (?, ?, ?, ?, ?, ?, ?)
619
+ ''', (
620
+ identity['id'],
621
+ identity['name'],
622
+ identity['pubkey'],
623
+ identity['privkey'],
624
+ identity.get('metadata', ''),
625
+ identity['created_at'],
626
+ identity['updated_at']
627
+ ))
628
+ self.conn.commit()
629
+
630
+ def add_llm(self, llm):
631
+ cursor = self.conn.cursor()
632
+ cursor.execute('''
633
+ INSERT OR REPLACE INTO llm (id, name, endpoint, metadata, created_at)
634
+ VALUES (?, ?, ?, ?, ?)
635
+ ''', (
636
+ llm['id'],
637
+ llm['name'],
638
+ llm['endpoint'],
639
+ llm.get('metadata', ''),
640
+ llm['created_at']
641
+ ))
642
+ self.conn.commit()
643
+
644
+ def clear_llm_registry(self):
645
+ cursor = self.conn.cursor()
646
+ cursor.execute('DELETE FROM llm')
647
+ self.conn.commit()
648
+
649
+ def add_user(self, user):
650
+ cursor = self.conn.cursor()
651
+ cursor.execute('''
652
+ INSERT OR REPLACE INTO users (id, name, metadata, created_at)
653
+ VALUES (?, ?, ?, ?)
654
+ ''', (
655
+ user['id'],
656
+ user['name'],
657
+ user.get('metadata', ''),
658
+ user['created_at']
659
+ ))
660
+ self.conn.commit()
661
 
662
  # Утилиты
663
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -70,7 +70,8 @@
70
  - для отправки сообщений другим агентам
71
  - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
- - для управления **пользователями** `users` и **группами пользователей** `users_group`
 
74
  - для управления списком известных HMP-агентов
75
  - для выбора *текущего основного LLM*
76
  - для управления дополнительными утилитами и базами данных
 
70
  - для отправки сообщений другим агентам
71
  - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
+ - для управления *пользователями* `users` и *группами пользователей* `users_group`
74
+ - для управления своей *идентичностью* `identity` и *настройками* `config`
75
  - для управления списком известных HMP-агентов
76
  - для выбора *текущего основного LLM*
77
  - для управления дополнительными утилитами и базами данных
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -1,169 +1,186 @@
1
  -- Дневниковые записи (размышления, наблюдения, воспоминания)
2
  CREATE TABLE IF NOT EXISTS diary_entries (
3
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
4
- text TEXT NOT NULL, -- Содержимое дневниковой записи
5
- tags TEXT, -- Теги для классификации (например: "наблюдение", "рефлексия")
6
- priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
7
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания записи
8
- llm_id TEXT -- Идентификатор LLM, создавшего запись
9
  );
10
 
11
  -- Концепты (понятия, сущности, идеи)
12
  CREATE TABLE IF NOT EXISTS concepts (
13
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор концепта
14
- name TEXT NOT NULL UNIQUE, -- Название концепта
15
- description TEXT, -- Описание или определение концепта
16
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания концепта
17
- llm_id TEXT -- Идентификатор LLM, добавившего концепт
18
  );
19
 
20
  -- Семантические связи между концептами
21
  CREATE TABLE IF NOT EXISTS links (
22
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор связи
23
- from_concept_id INTEGER, -- Идентификатор исходного концепта
24
- to_concept_id INTEGER, -- Идентификатор целевого концепта
25
- relation_type TEXT, -- Тип отношения (например: "is_a", "causes", "related_to")
26
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания связи
27
- llm_id TEXT, -- Идентификатор LLM, создавшего связь
28
  FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
29
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
30
  );
31
 
32
  -- Индексы между дневниковыми записями (смысловая карта)
33
  CREATE TABLE IF NOT EXISTS diary_graph_index (
34
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор индекса
35
- source_entry_id INTEGER NOT NULL, -- Идентификатор исходной записи
36
- target_entry_id INTEGER NOT NULL, -- Идентификатор целевой записи
37
- relation TEXT NOT NULL, -- Тип связи (например: "refers_to", "contradicts")
38
- strength REAL DEFAULT 1.0, -- Сила связи (0-1)
39
- context TEXT, -- Дополнительный контекст связи
40
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
41
  );
42
 
43
  -- Заметки, подсказки, сообщения пользователя и LLM
44
  CREATE TABLE IF NOT EXISTS notes (
45
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор заметки
46
- text TEXT NOT NULL, -- Текст заметки
47
- tags TEXT, -- Теги (например: "idea", "instruction")
48
- user_did TEXT DEFAULT 'ALL', -- DID пользователя (или 'ALL' — для всех)
49
- source TEXT DEFAULT 'user', -- Источник заметки: user | llm | system
50
- links TEXT DEFAULT '', -- Ссылки или связи с другими объектами
51
- read INTEGER DEFAULT 0, -- Статус прочтения LLM: 0 = нет, 1 = да
52
- hidden INTEGER DEFAULT 0, -- Скрыта ли от пользователя: 0 = нет, 1 = да
53
- priority INTEGER DEFAULT 0, -- Приоритет заметки
54
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
55
- llm_id TEXT -- Идентификатор LLM
56
  );
57
 
58
  -- Лог процессов: задачи, ошибки, события
59
  CREATE TABLE IF NOT EXISTS process_log (
60
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
61
- name TEXT NOT NULL, -- Название события или процесса
62
- value TEXT, -- Значение (результат, сообщение и т.п.)
63
- tags TEXT, -- Теги для поиска
64
- status TEXT DEFAULT 'ok', -- Статус: ok | warning | error | timeout | offline | close
65
- priority INTEGER DEFAULT 0, -- Приоритет события
66
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время записи
67
- llm_id TEXT -- Идентификатор LLM
68
  );
69
 
70
  -- Долговременная память LLM
71
  CREATE TABLE IF NOT EXISTS llm_memory (
72
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
73
- title TEXT, -- Заголовок или тема
74
- content TEXT NOT NULL, -- Основное содержимое
75
- tags TEXT, -- Теги (goal, observation, plan и т.д.)
76
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
77
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
78
- llm_id TEXT -- Идентификатор LLM
79
  );
80
 
81
  -- Краткосрочная память (диалоговая история)
82
  CREATE TABLE IF NOT EXISTS llm_recent_responses (
83
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
84
- timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время сообщения
85
- role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL, -- Роль автора
86
- content TEXT NOT NULL, -- Содержимое сообщения
87
- llm_id TEXT -- Идентификатор LLM
88
  );
89
 
90
  -- Список известных агентов в сети HMP
91
  CREATE TABLE IF NOT EXISTS agent_peers (
92
- id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
93
- name TEXT, -- Имя агента
94
- addresses TEXT, -- Адреса для связи (JSON)
95
- tags TEXT, -- Теги (Postman, Friend и т.д.)
96
- status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted и др.
97
- last_seen DATETIME, -- Последний раз был в сети
98
- description TEXT, -- Описание агента
99
- capabilities TEXT, -- Возможности (JSON)
100
- pubkey TEXT, -- Публичный ключ
101
- software_info TEXT, -- Информация о ПО агента (JSON)
102
- registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
103
  );
104
 
105
  -- Таблицы, созданные агентами
106
  CREATE TABLE IF NOT EXISTS agent_tables (
107
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
108
- table_name TEXT NOT NULL UNIQUE, -- Название таблицы
109
- description TEXT, -- Описание назначения таблицы
110
- schema TEXT NOT NULL, -- SQL-схема таблицы
111
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Дата создания
112
- llm_id TEXT -- Идентификатор LLM
113
  );
114
 
115
  -- Скрипты, утилиты и код агентов
116
  CREATE TABLE IF NOT EXISTS agent_scripts (
117
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
118
- name TEXT NOT NULL, -- Название скрипта
119
- version TEXT NOT NULL, -- Версия
120
- code TEXT NOT NULL, -- Код скрипта
121
- language TEXT DEFAULT 'python', -- Язык программирования
122
- description TEXT, -- Описание скрипта
123
- tags TEXT, -- Теги
124
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
125
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
126
- llm_id TEXT, -- Идентификатор LLM
127
  UNIQUE(name, version)
128
  );
129
 
130
  -- Реестр LLM-агентов (в т.ч. удалённых)
131
  CREATE TABLE IF NOT EXISTS llm_registry (
132
- id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
133
- name TEXT, -- Имя агента
134
- description TEXT, -- Описание
135
- registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  );
137
 
138
  -- Список пользователей
139
- CREATE TABLE users (
140
  user_id INTEGER PRIMARY KEY AUTOINCREMENT,
141
- ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
142
- username TEXT, -- имя пользователя (необязательно уникальное)
143
- did TEXT UNIQUE, -- децентрализованный идентификатор
144
- mail TEXT UNIQUE, -- электронная почта
145
- password_hash TEXT, -- хэш пароля
146
- info TEXT, -- произвольная информация, JSON
147
- contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
148
- language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
149
- operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
150
  );
151
 
152
  -- Группы пользователей
153
  CREATE TABLE IF NOT EXISTS users_group (
154
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
155
- group_name TEXT UNIQUE NOT NULL, -- Название группы
156
- description TEXT, -- Описание группы
157
- users TEXT -- JSON-массив DID пользователей в группе
158
  );
159
 
160
  -- Таблица для хранения токенов восстановления пароля
161
- CREATE TABLE password_reset_tokens (
162
- id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
163
- user_id INTEGER NOT NULL, -- Ссылка на пользователя
164
- token TEXT UNIQUE NOT NULL, -- Уникальный токен
165
- created_at DATETIME NOT NULL, -- Время создания токена
166
- expires_at DATETIME NOT NULL, -- Время истечения срока действия
167
- used BOOLEAN DEFAULT 0, -- Использован ли токен
168
  FOREIGN KEY(user_id) REFERENCES users(user_id)
169
  );
 
1
  -- Дневниковые записи (размышления, наблюдения, воспоминания)
2
  CREATE TABLE IF NOT EXISTS diary_entries (
3
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
4
+ text TEXT NOT NULL, -- Содержимое дневниковой записи
5
+ tags TEXT, -- Теги для классификации (например: "наблюдение", "рефлексия")
6
+ priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
7
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания записи
8
+ llm_id TEXT -- Идентификатор LLM, создавшего запись
9
  );
10
 
11
  -- Концепты (понятия, сущности, идеи)
12
  CREATE TABLE IF NOT EXISTS concepts (
13
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор концепта
14
+ name TEXT NOT NULL UNIQUE, -- Название концепта
15
+ description TEXT, -- Описание или определение концепта
16
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания концепта
17
+ llm_id TEXT -- Идентификатор LLM, добавившего концепт
18
  );
19
 
20
  -- Семантические связи между концептами
21
  CREATE TABLE IF NOT EXISTS links (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор связи
23
+ from_concept_id INTEGER, -- Идентификатор исходного концепта
24
+ to_concept_id INTEGER, -- Идентификатор целевого концепта
25
+ relation_type TEXT, -- Тип отношения (например: "is_a", "causes", "related_to")
26
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания связи
27
+ llm_id TEXT, -- Идентификатор LLM, создавшего связь
28
  FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
29
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
30
  );
31
 
32
  -- Индексы между дневниковыми записями (смысловая карта)
33
  CREATE TABLE IF NOT EXISTS diary_graph_index (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор индекса
35
+ source_entry_id INTEGER NOT NULL, -- Идентификатор исходной записи
36
+ target_entry_id INTEGER NOT NULL, -- Идентификатор целевой записи
37
+ relation TEXT NOT NULL, -- Тип связи (например: "refers_to", "contradicts")
38
+ strength REAL DEFAULT 1.0, -- Сила связи (0-1)
39
+ context TEXT, -- Дополнительный контекст связи
40
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
41
  );
42
 
43
  -- Заметки, подсказки, сообщения пользователя и LLM
44
  CREATE TABLE IF NOT EXISTS notes (
45
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор заметки
46
+ text TEXT NOT NULL, -- Текст заметки
47
+ tags TEXT, -- Теги (например: "idea", "instruction")
48
+ user_did TEXT DEFAULT 'ALL', -- DID пользователя (или 'ALL' — для всех)
49
+ source TEXT DEFAULT 'user', -- Источник заметки: user | llm | system
50
+ links TEXT DEFAULT '', -- Ссылки или связи с другими объектами
51
+ read INTEGER DEFAULT 0, -- Статус прочтения LLM: 0 = нет, 1 = да
52
+ hidden INTEGER DEFAULT 0, -- Скрыта ли от пользователя: 0 = нет, 1 = да
53
+ priority INTEGER DEFAULT 0, -- Приоритет заметки
54
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
55
+ llm_id TEXT -- Идентификатор LLM
56
  );
57
 
58
  -- Лог процессов: задачи, ошибки, события
59
  CREATE TABLE IF NOT EXISTS process_log (
60
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
61
+ name TEXT NOT NULL, -- Название события или процесса
62
+ value TEXT, -- Значение (результат, сообщение и т.п.)
63
+ tags TEXT, -- Теги для поиска
64
+ status TEXT DEFAULT 'ok', -- Статус: ok | warning | error | timeout | offline | close
65
+ priority INTEGER DEFAULT 0, -- Приоритет события
66
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время записи
67
+ llm_id TEXT -- Идентификатор LLM
68
  );
69
 
70
  -- Долговременная память LLM
71
  CREATE TABLE IF NOT EXISTS llm_memory (
72
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
73
+ title TEXT, -- Заголовок или тема
74
+ content TEXT NOT NULL, -- Основное содержимое
75
+ tags TEXT, -- Теги (goal, observation, plan и т.д.)
76
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
77
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
78
+ llm_id TEXT -- Идентификатор LLM
79
  );
80
 
81
  -- Краткосрочная память (диалоговая история)
82
  CREATE TABLE IF NOT EXISTS llm_recent_responses (
83
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
84
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время сообщения
85
+ role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL, -- Роль автора
86
+ content TEXT NOT NULL, -- Содержимое сообщения
87
+ llm_id TEXT -- Идентификатор LLM
88
  );
89
 
90
  -- Список известных агентов в сети HMP
91
  CREATE TABLE IF NOT EXISTS agent_peers (
92
+ id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
93
+ name TEXT, -- Имя агента
94
+ addresses TEXT, -- Адреса для связи (JSON)
95
+ tags TEXT, -- Теги (Postman, Friend и т.д.)
96
+ status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted и др.
97
+ last_seen DATETIME, -- Последний раз был в сети
98
+ description TEXT, -- Описание агента
99
+ capabilities TEXT, -- Возможности (JSON)
100
+ pubkey TEXT, -- Публичный ключ
101
+ software_info TEXT, -- Информация о ПО агента (JSON)
102
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
103
  );
104
 
105
  -- Таблицы, созданные агентами
106
  CREATE TABLE IF NOT EXISTS agent_tables (
107
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
108
+ table_name TEXT NOT NULL UNIQUE, -- Название таблицы
109
+ description TEXT, -- Описание назначения таблицы
110
+ schema TEXT NOT NULL, -- SQL-схема таблицы
111
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Дата создания
112
+ llm_id TEXT -- Идентификатор LLM
113
  );
114
 
115
  -- Скрипты, утилиты и код агентов
116
  CREATE TABLE IF NOT EXISTS agent_scripts (
117
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
118
+ name TEXT NOT NULL, -- Название скрипта
119
+ version TEXT NOT NULL, -- Версия
120
+ code TEXT NOT NULL, -- Код скрипта
121
+ language TEXT DEFAULT 'python', -- Язык программирования
122
+ description TEXT, -- Описание скрипта
123
+ tags TEXT, -- Теги
124
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
125
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
126
+ llm_id TEXT, -- Идентификатор LLM
127
  UNIQUE(name, version)
128
  );
129
 
130
  -- Реестр LLM-агентов (в т.ч. удалённых)
131
  CREATE TABLE IF NOT EXISTS llm_registry (
132
+ id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
133
+ name TEXT, -- Имя агента
134
+ description TEXT, -- Описание
135
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
136
+ );
137
+
138
+ -- Локальные идентичности агента
139
+ CREATE TABLE IF NOT EXISTS identity (
140
+ id TEXT PRIMARY KEY, -- Уникальный идентификатор личности (можно UUID или hash)
141
+ name TEXT, -- Человеко-читаемое имя
142
+ pubkey TEXT, -- Публичный к��юч (для подписи/шифрования)
143
+ privkey TEXT, -- Приватный ключ (шифруется на уровне хранилища)
144
+ metadata TEXT, -- Дополнительная информация о назначении/контексте
145
+ created_at TEXT, -- Дата создания
146
+ updated_at TEXT -- Последнее обновление
147
+ );
148
+
149
+ -- Конфигурация агента
150
+ CREATE TABLE IF NOT EXISTS config (
151
+ key TEXT PRIMARY KEY, -- Переменная
152
+ value TEXT -- Значение
153
  );
154
 
155
  -- Список пользователей
156
+ CREATE TABLE IF NOT EXISTS users (
157
  user_id INTEGER PRIMARY KEY AUTOINCREMENT,
158
+ ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
159
+ username TEXT, -- имя пользователя (необязательно уникальное)
160
+ did TEXT UNIQUE, -- децентрализованный идентификатор
161
+ mail TEXT UNIQUE, -- электронная почта
162
+ password_hash TEXT, -- хэш пароля
163
+ info TEXT, -- произвольная информация, JSON
164
+ contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
165
+ language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
166
+ operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
167
  );
168
 
169
  -- Группы пользователей
170
  CREATE TABLE IF NOT EXISTS users_group (
171
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
172
+ group_name TEXT UNIQUE NOT NULL, -- Название группы
173
+ description TEXT, -- Описание группы
174
+ users TEXT -- JSON-массив DID пользователей в группе
175
  );
176
 
177
  -- Таблица для хранения токенов восстановления пароля
178
+ CREATE TABLE IF NOT EXISTS password_reset_tokens (
179
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
180
+ user_id INTEGER NOT NULL, -- Ссылка на пользователя
181
+ token TEXT UNIQUE NOT NULL, -- Уникальный токен
182
+ created_at DATETIME NOT NULL, -- Время создания токена
183
+ expires_at DATETIME NOT NULL, -- Время истечения срока действия
184
+ used BOOLEAN DEFAULT 0, -- Использован ли токен
185
  FOREIGN KEY(user_id) REFERENCES users(user_id)
186
  );
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -1,47 +1,68 @@
1
- db_path: agents/agent_data/agent_data.db
2
-
3
- agent_mode: mcp # Режим работы: mcp / full / llm / test
4
- agent_name: mcp-01 # Имя агента
5
- agent_role: core # или connector
6
-
7
- llm_mode: openai # openai | chatgpt_session | mesh
8
- llm_model: gpt-4
9
- llm_api_key: sk-...
10
- llm_api_url: https://api.openai.com/v1/chat/completions
11
- llm_session_cookie: null
12
- context_db: context.sqlite
13
-
14
- # operator:
15
- operator_did: "did:hmp:operator123"
16
- operator_mail: "operator@localhost"
17
- operator_username: "Оператор"
18
-
19
- # REST API
20
- api_port: 8080 # Порт для локального REST API
21
- serve_api: true # Включить REST API (например, для мониторинга или команд)
22
-
23
- # web interface:
24
- web_interfaces: ["127.0.0.1", "192.168.0.1", "::1"] # или ["0.0.0.0"] для доступа отовсюду
25
- web_port: 8000
26
-
27
- # DHT / Mesh Connectivity
28
- dht_enabled: true # Активировать DHT-модуль
29
- dht_port: 20784 # Порт для связи по DHT (TCP/UDP)
30
-
31
- internal_ips: # Список локальных IP-адресов (для проброса или диагностики)
32
- - 192.168.20.10
33
- - 192.168.21.10
34
-
35
- external_ips: # Список внешних IP-адресов (для публикации другим агентам)
36
- - 95.23.73.23
37
- - 195.134.218.134
38
- - "201:ab61:1205:b963:909c:eу3:26b8:4ec2"
39
-
40
- # Bootstrap
41
- bootstrap_file: bootstrap.txt # Файл с начальными узлами
42
- update_dht: true # Обновлять DHT периодически
43
- update_interval: 60 # Интервал между обновлениями (сек)
44
-
45
- # Прочее
46
- bootstrap_responder: true # Отвечать на запросы других агентов
47
- enable_llm: false # Подключён ли внутренний ИИ (если false только DHT-режим)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # HMP Agent Configuration
2
+
3
+ # === Общие параметры ===
4
+ agent_id: "" # Оставьте пустым для генерации DiD автоматически
5
+ agent_name: "CognitiveCore" # Имя агента
6
+ agent_role: "core" # 'core' или 'shell'
7
+
8
+ # === Прокси ===
9
+ proxy_mode: false # false — прокси не используется, иначе true
10
+ proxy_type: "socks5" # 'http', 'socks4', 'socks5' и т.д. (если proxy_mode: true)
11
+ proxy_address: "127.0.0.1:9050"
12
+
13
+ # === Функции ядра ===
14
+ enable_llm: true # доступ к LLM
15
+
16
+ serve_api: true # REST API
17
+ api_port: 8080
18
+
19
+ # === DHT-сеть и обмен знаниями ===
20
+ dht_enabled: true # Включение участия в DHT-сети (включено принудительно!)
21
+ dht_update: true # Регулярные обновления и публикация данных в DHT (включено принудительно!)
22
+ bootstrap_responder: true # Агент отвечает на bootstrap-запросы (включено принудительно!)
23
+ dht_port: 20784
24
+ update_interval: 60 # секунд (для DHT-обновлений)
25
+
26
+ # === LLM-бэкенды ===
27
+ llm_backends:
28
+ - name: "local-model"
29
+ type: "local"
30
+ path: "/models/gguf/mistral.gguf"
31
+ format: "gguf"
32
+ prompt_template: "mistral"
33
+
34
+ - name: "openai-gpt4o"
35
+ type: "api"
36
+ provider: "openai"
37
+ model: "gpt-4o"
38
+ api_key: "sk-..."
39
+
40
+ # Пользователь может добавить сколько угодно дополнительных локальных или сетевых LLM
41
+
42
+ default_llm: "local-model" # если модели нет в списке `llm_backends` используется первая в списке
43
+
44
+ # === Веб-интерфейс ===
45
+ notebook_ui: true # UI в виде блокнота
46
+ # ui_hosts:
47
+ # - "0.0.0.0" # (небезопасно) доступ с любых IPv4-адресов
48
+ # - "::" # (небезопасно) доступ с любых IPv6-адресов
49
+ ui_hosts: # Какие IP прослушиваются, ["0.0.0.0"; "::"] - доступен везде
50
+ - "127.0.0.1"
51
+ - "::1"
52
+ ui_port: 8765
53
+
54
+ # === Данные пользователя ===
55
+ default_user:
56
+ username: "user"
57
+ email: "[email protected]"
58
+ password_hash: "" # пусто при инициализации, будет установлен при регистрации
59
+
60
+
61
+ # === Пути ===
62
+ data_dir: "./data"
63
+ log_dir: "./logs"
64
+ db_path: "./data/agent_storage.db"
65
+
66
+ # === Отладка и логгирование ===
67
+ debug: true
68
+ log_level: "INFO" # DEBUG, INFO, WARNING, ERROR
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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.md CHANGED
@@ -200,3 +200,50 @@
200
  | strength | REAL | Вес связи (от 0 до 1) |
201
  | context | TEXT | Контекст или обоснование связи |
202
  | timestamp | TEXT | Время создания связи |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  | strength | REAL | Вес связи (от 0 до 1) |
201
  | context | TEXT | Контекст или обоснование связи |
202
  | timestamp | TEXT | Время создания связи |
203
+
204
+ ---
205
+
206
+ ### 👤 `users`
207
+
208
+ **Назначение:** Хранение информации о пользователях системы (человеческих операторах).
209
+
210
+ | Поле | Тип | Описание |
211
+ | -------------- | -------- | --------------------------------------------------------------- |
212
+ | user\_id | INTEGER | Уникальный идентификатор пользователя |
213
+ | ban | DATETIME | Время до которого действует бан (если есть) |
214
+ | username | TEXT | Имя пользователя (необязательно уникальное) |
215
+ | did | TEXT | Децентрализованный идентификатор (уникальный) |
216
+ | mail | TEXT | Email пользователя (уникальный) |
217
+ | password\_hash | TEXT | Хэш пароля |
218
+ | info | TEXT | Произвольная дополнительная информация в формате JSON |
219
+ | contacts | TEXT | Альтернативные контакты (matrix, telegram и др.) в формате JSON |
220
+ | language | TEXT | Предпочтительные языки (через запятую, например: `ru,en`) |
221
+ | operator | BOOLEAN | Является ли пользователь оператором (1 — да, 0 — нет) |
222
+
223
+ ---
224
+
225
+ ### 👥 `users_group`
226
+
227
+ **Назначение:** Группировка пользователей для разграничения доступа, роли и рассылок.
228
+
229
+ | Поле | Тип | Описание |
230
+ | ----------- | ------- | ---------------------------------------------- |
231
+ | id | INTEGER | Уникальный идентификатор группы |
232
+ | group\_name | TEXT | Уникальное имя группы |
233
+ | description | TEXT | Описание назначения группы |
234
+ | users | TEXT | JSON-массив или CSV-строка с DID пользователей |
235
+
236
+ ---
237
+
238
+ ### 🔐 `password_reset_tokens`
239
+
240
+ **Назначение:** Сброс пароля — одноразовые токены восстановления доступа.
241
+
242
+ | Поле | Тип | Описание |
243
+ | ----------- | -------- | ------------------------------------------------------- |
244
+ | id | INTEGER | Уникальный идентификатор |
245
+ | user\_id | INTEGER | Ссылка на пользователя (внешний ключ к `users.user_id`) |
246
+ | token | TEXT | Уникальный токен |
247
+ | created\_at | DATETIME | Дата и время создания токена |
248
+ | expires\_at | DATETIME | Срок действия токена |
249
+ | used | BOOLEAN | Был ли использован токен (0 — нет, 1 — да) |
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 CHANGED
@@ -1,140 +1,138 @@
1
- -- Основные таблицы когнитивного ядра
2
-
3
  -- Дневниковые записи (размышления, наблюдения, воспоминания)
4
  CREATE TABLE IF NOT EXISTS diary_entries (
5
- id INTEGER PRIMARY KEY AUTOINCREMENT,
6
- text TEXT NOT NULL,
7
- tags TEXT,
8
- priority INTEGER DEFAULT 0,
9
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
10
- llm_id TEXT
11
  );
12
 
13
  -- Концепты (понятия, сущности, идеи)
14
  CREATE TABLE IF NOT EXISTS concepts (
15
- id INTEGER PRIMARY KEY AUTOINCREMENT,
16
- name TEXT NOT NULL UNIQUE,
17
- description TEXT,
18
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
19
- llm_id TEXT
20
  );
21
 
22
  -- Семантические связи между концептами
23
  CREATE TABLE IF NOT EXISTS links (
24
- id INTEGER PRIMARY KEY AUTOINCREMENT,
25
- from_concept_id INTEGER,
26
- to_concept_id INTEGER,
27
- relation_type TEXT,
28
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
29
- llm_id TEXT,
30
  FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
31
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
32
  );
33
 
34
- -- Быстрые индексы по смысловой карте и дневнику
35
  CREATE TABLE IF NOT EXISTS diary_graph_index (
36
- id INTEGER PRIMARY KEY AUTOINCREMENT,
37
- source_entry_id INTEGER NOT NULL,
38
- target_entry_id INTEGER NOT NULL,
39
- relation TEXT NOT NULL,
40
- strength REAL DEFAULT 1.0,
41
- context TEXT,
42
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP
43
  );
44
 
45
  -- Заметки, подсказки, сообщения пользователя и LLM
46
  CREATE TABLE IF NOT EXISTS notes (
47
- id INTEGER PRIMARY KEY AUTOINCREMENT,
48
- text TEXT NOT NULL,
49
- tags TEXT,
50
- user_did TEXT DEFAULT 'ALL'
51
- source TEXT DEFAULT 'user', -- user | llm | system
52
- links TEXT DEFAULT '',
53
- read INTEGER DEFAULT 0, -- 0 = непрочитано LLM, 1 = прочитано
54
- hidden INTEGER DEFAULT 0, -- 0 = отображать пользователю, 1 = скрыть
55
- priority INTEGER DEFAULT 0,
56
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
57
- llm_id TEXT
58
  );
59
 
60
  -- Лог процессов: задачи, ошибки, события
61
  CREATE TABLE IF NOT EXISTS process_log (
62
- id INTEGER PRIMARY KEY AUTOINCREMENT,
63
- name TEXT NOT NULL,
64
- value TEXT,
65
- tags TEXT,
66
- status TEXT DEFAULT 'ok', -- ok | warning | error | timeout | offline | close
67
- priority INTEGER DEFAULT 0,
68
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
69
- llm_id TEXT
70
  );
71
 
72
- -- Память LLM (контекст размышлений)
73
  CREATE TABLE IF NOT EXISTS llm_memory (
74
- id INTEGER PRIMARY KEY AUTOINCREMENT,
75
- title TEXT,
76
- content TEXT NOT NULL,
77
- tags TEXT, -- goal,observation,meta,...
78
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
79
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
80
- llm_id TEXT
81
  );
82
 
83
- -- Краткосрочная память LLM (история общения)
84
  CREATE TABLE IF NOT EXISTS llm_recent_responses (
85
- id INTEGER PRIMARY KEY AUTOINCREMENT,
86
- timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
87
- role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
88
- content TEXT NOT NULL,
89
- llm_id TEXT
90
  );
91
 
92
- -- Список известных HMP-агентов
93
  CREATE TABLE IF NOT EXISTS agent_peers (
94
- id TEXT PRIMARY KEY, -- UUID или псевдоним агента
95
- name TEXT, -- Человеко-читаемое имя
96
- addresses TEXT, -- JSON: ["http://1.2.3.4:9000", "p2p://..."]
97
- tags TEXT, -- DHT, Postman, Friend, Local и т.д.
98
- status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted | quarantined | unknown
99
- last_seen DATETIME,
100
- description TEXT,
101
- capabilities TEXT, -- JSON: {"can_sync": true, ...}
102
- pubkey TEXT, -- Публичный ключ или хэш
103
- software_info TEXT, -- JSON: версия, ОС и др.
104
- registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
105
  );
106
 
107
- -- Список пользовательских таблиц, созданных агентами
108
  CREATE TABLE IF NOT EXISTS agent_tables (
109
- id INTEGER PRIMARY KEY AUTOINCREMENT,
110
- table_name TEXT NOT NULL UNIQUE,
111
- description TEXT,
112
- schema TEXT NOT NULL, -- SQL-схема таблицы
113
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
114
- llm_id TEXT
115
  );
116
 
117
- -- Список утилит/скриптов, добавленных агентами
118
  CREATE TABLE IF NOT EXISTS agent_scripts (
119
- id INTEGER PRIMARY KEY AUTOINCREMENT,
120
- name TEXT NOT NULL,
121
- version TEXT NOT NULL,
122
- code TEXT NOT NULL,
123
- language TEXT DEFAULT 'python',
124
- description TEXT,
125
- tags TEXT,
126
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
127
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
128
- llm_id TEXT,
129
  UNIQUE(name, version)
130
  );
131
 
132
- -- Список LLM-агентов (возможно удалённые)
133
  CREATE TABLE IF NOT EXISTS llm_registry (
134
- id TEXT PRIMARY KEY, -- UUID или псевдоним
135
- name TEXT,
136
- description TEXT,
137
- registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
138
  );
139
 
140
  -- Список пользователей
@@ -151,23 +149,21 @@ CREATE TABLE users (
151
  operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
152
  );
153
 
154
- -- Список групп пользователей
155
  CREATE TABLE IF NOT EXISTS users_group (
156
- id INTEGER PRIMARY KEY AUTOINCREMENT,
157
- group_name TEXT UNIQUE NOT NULL,
158
- description TEXT,
159
- users TEXT -- JSON-массив или CSV со списком DID, например: '["did:example:123", "did:example:456"]'
160
  );
161
 
162
  -- Таблица для хранения токенов восстановления пароля
163
  CREATE TABLE password_reset_tokens (
164
- id INTEGER PRIMARY KEY AUTOINCREMENT,
165
- user_id INTEGER NOT NULL,
166
- token TEXT UNIQUE NOT NULL,
167
- created_at DATETIME NOT NULL,
168
- expires_at DATETIME NOT NULL,
169
- used BOOLEAN DEFAULT 0,
170
- FOREIGN KEY(user_id) REFERENCES users(user_id)
171
  );
172
-
173
-
 
 
 
1
  -- Дневниковые записи (размышления, наблюдения, воспоминания)
2
  CREATE TABLE IF NOT EXISTS diary_entries (
3
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
4
+ text TEXT NOT NULL, -- Содержимое дневниковой записи
5
+ tags TEXT, -- Теги для классификации (например: "наблюдение", "рефлексия")
6
+ priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
7
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания записи
8
+ llm_id TEXT -- Идентификатор LLM, создавшего запись
9
  );
10
 
11
  -- Концепты (понятия, сущности, идеи)
12
  CREATE TABLE IF NOT EXISTS concepts (
13
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор концепта
14
+ name TEXT NOT NULL UNIQUE, -- Название концепта
15
+ description TEXT, -- Описание или определение концепта
16
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания концепта
17
+ llm_id TEXT -- Идентификатор LLM, добавившего концепт
18
  );
19
 
20
  -- Семантические связи между концептами
21
  CREATE TABLE IF NOT EXISTS links (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор связи
23
+ from_concept_id INTEGER, -- Идентификатор исходного концепта
24
+ to_concept_id INTEGER, -- Идентификатор целевого концепта
25
+ relation_type TEXT, -- Тип отношения (например: "is_a", "causes", "related_to")
26
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания связи
27
+ llm_id TEXT, -- Идентификатор LLM, создавшего связь
28
  FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
29
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
30
  );
31
 
32
+ -- Индексы между дневниковыми записями (смысловая карта)
33
  CREATE TABLE IF NOT EXISTS diary_graph_index (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор индекса
35
+ source_entry_id INTEGER NOT NULL, -- Идентификатор исходной записи
36
+ target_entry_id INTEGER NOT NULL, -- Идентификатор целевой записи
37
+ relation TEXT NOT NULL, -- Тип связи (например: "refers_to", "contradicts")
38
+ strength REAL DEFAULT 1.0, -- Сила связи (0-1)
39
+ context TEXT, -- Дополнительный контекст связи
40
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
41
  );
42
 
43
  -- Заметки, подсказки, сообщения пользователя и LLM
44
  CREATE TABLE IF NOT EXISTS notes (
45
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор заметки
46
+ text TEXT NOT NULL, -- Текст заметки
47
+ tags TEXT, -- Теги (например: "idea", "instruction")
48
+ user_did TEXT DEFAULT 'ALL', -- DID пользователя (или 'ALL' — для всех)
49
+ source TEXT DEFAULT 'user', -- Источник заметки: user | llm | system
50
+ links TEXT DEFAULT '', -- Ссылки или связи с другими объектами
51
+ read INTEGER DEFAULT 0, -- Статус прочтения LLM: 0 = нет, 1 = да
52
+ hidden INTEGER DEFAULT 0, -- Скрыта ли от пользователя: 0 = нет, 1 = да
53
+ priority INTEGER DEFAULT 0, -- Приоритет заметки
54
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
55
+ llm_id TEXT -- Идентификатор LLM
56
  );
57
 
58
  -- Лог процессов: задачи, ошибки, события
59
  CREATE TABLE IF NOT EXISTS process_log (
60
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
61
+ name TEXT NOT NULL, -- Название события или процесса
62
+ value TEXT, -- Значение (результат, сообщение и т.п.)
63
+ tags TEXT, -- Теги для поиска
64
+ status TEXT DEFAULT 'ok', -- Статус: ok | warning | error | timeout | offline | close
65
+ priority INTEGER DEFAULT 0, -- Приоритет события
66
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время записи
67
+ llm_id TEXT -- Идентификатор LLM
68
  );
69
 
70
+ -- Долговременная память LLM
71
  CREATE TABLE IF NOT EXISTS llm_memory (
72
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
73
+ title TEXT, -- Заголовок или тема
74
+ content TEXT NOT NULL, -- Основное содержимое
75
+ tags TEXT, -- Теги (goal, observation, plan и т.д.)
76
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
77
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
78
+ llm_id TEXT -- Идентификатор LLM
79
  );
80
 
81
+ -- Краткосрочная память (диалоговая история)
82
  CREATE TABLE IF NOT EXISTS llm_recent_responses (
83
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
84
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время сообщения
85
+ role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL, -- Роль автора
86
+ content TEXT NOT NULL, -- Содержимое сообщения
87
+ llm_id TEXT -- Идентификатор LLM
88
  );
89
 
90
+ -- Список известных агентов в сети HMP
91
  CREATE TABLE IF NOT EXISTS agent_peers (
92
+ id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
93
+ name TEXT, -- Имя агента
94
+ addresses TEXT, -- Адреса для связи (JSON)
95
+ tags TEXT, -- Теги (Postman, Friend и т.д.)
96
+ status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted и др.
97
+ last_seen DATETIME, -- Последний раз был в сети
98
+ description TEXT, -- Описание агента
99
+ capabilities TEXT, -- Возможности (JSON)
100
+ pubkey TEXT, -- Публичный ключ
101
+ software_info TEXT, -- Информация о ПО агента (JSON)
102
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
103
  );
104
 
105
+ -- Таблицы, созданные агентами
106
  CREATE TABLE IF NOT EXISTS agent_tables (
107
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
108
+ table_name TEXT NOT NULL UNIQUE, -- Название таблицы
109
+ description TEXT, -- Описание назначения таблицы
110
+ schema TEXT NOT NULL, -- SQL-схема таблицы
111
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Дата создания
112
+ llm_id TEXT -- Идентификатор LLM
113
  );
114
 
115
+ -- Скрипты, утилиты и код агентов
116
  CREATE TABLE IF NOT EXISTS agent_scripts (
117
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
118
+ name TEXT NOT NULL, -- Название скрипта
119
+ version TEXT NOT NULL, -- Версия
120
+ code TEXT NOT NULL, -- Код скрипта
121
+ language TEXT DEFAULT 'python', -- Язык программирования
122
+ description TEXT, -- Описание скрипта
123
+ tags TEXT, -- Теги
124
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
125
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
126
+ llm_id TEXT, -- Идентификатор LLM
127
  UNIQUE(name, version)
128
  );
129
 
130
+ -- Реестр LLM-агентов (в т.ч. удалённых)
131
  CREATE TABLE IF NOT EXISTS llm_registry (
132
+ id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
133
+ name TEXT, -- Имя агента
134
+ description TEXT, -- Описание
135
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
136
  );
137
 
138
  -- Список пользователей
 
149
  operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
150
  );
151
 
152
+ -- Группы пользователей
153
  CREATE TABLE IF NOT EXISTS users_group (
154
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
155
+ group_name TEXT UNIQUE NOT NULL, -- Название группы
156
+ description TEXT, -- Описание группы
157
+ users TEXT -- JSON-массив DID пользователей в группе
158
  );
159
 
160
  -- Таблица для хранения токенов восстановления пароля
161
  CREATE TABLE password_reset_tokens (
162
+ id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
163
+ user_id INTEGER NOT NULL, -- Ссылка на пользователя
164
+ token TEXT UNIQUE NOT NULL, -- Уникальный токен
165
+ created_at DATETIME NOT NULL, -- Время создания токена
166
+ expires_at DATETIME NOT NULL, -- Время истечения срока действия
167
+ used BOOLEAN DEFAULT 0, -- Использован ли токен
168
+ FOREIGN KEY(user_id) REFERENCES users(user_id)
169
  );
 
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/test.bat ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ echo --------------------------
2
+ echo Installing requirements...
3
+ echo --------------------------
4
+ pip install -r requirements.txt
5
+
6
+ echo --------------------------
7
+ echo Running test...
8
+ echo --------------------------
9
+
10
+ python test.py
11
+
12
+ pause
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/test.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # agents/test.py
2
+ import json
3
+ import os
4
+ import sys
5
+ import time
6
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
7
+ from datetime import datetime
8
+ from tools.storage import Storage
9
+
10
+ if __name__ == "__main__":
11
+ print("[*] Инициализация БД через Storage...")
12
+ storage = Storage()
13
+ print("[+] Готово.")