GitHub Action commited on
Commit
97c409a
·
1 Parent(s): 03525c4

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/logger.py +21 -4
  2. hf_repo/docs/HMP-agent-REPL-cycle.md +1 -1
  3. hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +1 -1
  4. hf_repo/hf_repo/hf_repo/agents/repl.py +17 -2
  5. hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py +20 -0
  6. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +3 -0
  7. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/peer_comm.py +3 -0
  8. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +3 -0
  9. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py +5 -0
  10. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +3 -4
  11. hf_repo/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 +61 -25
  12. hf_repo/hf_repo/hf_repo/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 +9 -5
  13. hf_repo/hf_repo/hf_repo/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 +17 -1
  14. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +1 -0
  15. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +10 -1
  16. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +49 -13
  17. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 -0
  18. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +48 -13
  19. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/changelog.txt +12 -0
  20. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +2 -1
  21. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-0004-v4.1.md +0 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +1 -1
  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/hf_repo/hf_repo/hf_repo/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/tests/test_storage.py +15 -11
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +11 -15
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_storage.py +1 -1
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +18 -14
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +1 -1
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/__init__.py +1 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/__init__.py +1 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +1 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_storage.py +17 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +3 -10
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_basic.py +2 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +1 -4
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +36 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +80 -7
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +105 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +11 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +74 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py +8 -0
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +1 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +125 -10
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/memory_utils.py +64 -0
  45. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/command_parser.py +64 -0
  46. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md +1 -0
  47. hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/llm.py +43 -38
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py +44 -1
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +19 -11
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +13 -11
agents/logger.py CHANGED
@@ -9,12 +9,29 @@ def log_event(event_type, message, extra=None):
9
 
10
  entry = {
11
  "timestamp": datetime.utcnow().isoformat(),
12
- "event": event_type, # например: 'thought', 'input', 'error', 'action'
13
- "message": message, # краткое описание или фраза
14
  }
15
 
16
  if extra:
17
- entry["extra"] = extra # например: {"node_id": "xyz", "reasoning": "..."}
18
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  with open(LOG_FILE, "a", encoding="utf-8") as f:
20
  f.write(json.dumps(entry, ensure_ascii=False) + "\n")
 
9
 
10
  entry = {
11
  "timestamp": datetime.utcnow().isoformat(),
12
+ "event": event_type, # например: 'thought', 'input', 'error', 'action'
13
+ "message": message,
14
  }
15
 
16
  if extra:
17
+ entry["extra"] = extra
18
+
19
+ with open(LOG_FILE, "a", encoding="utf-8") as f:
20
+ f.write(json.dumps(entry, ensure_ascii=False) + "\n")
21
+
22
+
23
+ def log_repl_snapshot(snapshot: dict):
24
+ """
25
+ Запись полной структуры REPL-контекста в лог, с возможностью последующего анализа.
26
+ """
27
+ os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
28
+
29
+ entry = {
30
+ "timestamp": datetime.utcnow().isoformat(),
31
+ "event": "repl_snapshot",
32
+ "message": "Полный REPL-контекст",
33
+ "context": snapshot,
34
+ }
35
+
36
  with open(LOG_FILE, "a", encoding="utf-8") as f:
37
  f.write(json.dumps(entry, ensure_ascii=False) + "\n")
hf_repo/docs/HMP-agent-REPL-cycle.md CHANGED
@@ -35,7 +35,7 @@
35
  - **контекст_6 (llm_memory):** *внутренний дневник LLM*, куда она записывает собственные размышления, гипотезы, задачи и инсайты.
36
  - Это не просто лог предыдущих сообщений, а именно *внутреннее долговременное хранилище* разума агента.
37
  - Может быть представлено в виде таблицы `llm_memory`, отдельной от `agent_log`.
38
- - **контекст_7:**: результат работы `anti-Stagnation Reflex` из предыдущей итерации
39
 
40
  ## 3. Запрос к LLM
41
 
 
35
  - **контекст_6 (llm_memory):** *внутренний дневник LLM*, куда она записывает собственные размышления, гипотезы, задачи и инсайты.
36
  - Это не просто лог предыдущих сообщений, а именно *внутреннее долговременное хранилище* разума агента.
37
  - Может быть представлено в виде таблицы `llm_memory`, отдельной от `agent_log`.
38
+ - **контекст_7:** результат работы `anti-Stagnation Reflex` из предыдущей итерации
39
 
40
  ## 3. Запрос к LLM
41
 
hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md CHANGED
@@ -13,7 +13,7 @@
13
 
14
  Контексты, формируемые скриптом перед запросом к LLM:
15
 
16
- - **контекст_0:**:
17
  ```
18
  Ты являешься когнитивным ядром HMP-агента. Твоя основная задача — размышлять, анализировать информацию, строить смысловые карты и предлагать действия.
19
  Ты стремишься:
 
13
 
14
  Контексты, формируемые скриптом перед запросом к LLM:
15
 
16
+ - **контекст_0:**
17
  ```
18
  Ты являешься когнитивным ядром HMP-агента. Твоя основная задача — размышлять, анализировать информацию, строить смысловые карты и предлагать действия.
19
  Ты стремишься:
hf_repo/hf_repo/hf_repo/agents/repl.py CHANGED
@@ -1,5 +1,7 @@
1
  # agents/repl.py
2
 
 
 
3
  import time
4
  from datetime import datetime
5
  from tools.context_builder import build_contexts, build_prompt
@@ -34,9 +36,17 @@ def run_repl(config=None):
34
  # 2. Формирование запроса и вызов LLM
35
  prompt = build_prompt(contexts)
36
  llm_response = call_llm(prompt, config=config)
 
 
 
 
 
 
37
 
38
  # 3. Проверка на стагнацию
39
- if detect_stagnation(db, llm_response):
 
 
40
  print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
41
  llm_response = activate_anti_stagnation(db, config=config)
42
 
@@ -45,9 +55,14 @@ def run_repl(config=None):
45
 
46
  # 5. Извлечение и выполнение команд
47
  commands = extract_commands(llm_response)
 
48
  execute_commands(commands, db=db, config=config)
49
 
50
- # 6. Сохранение истории и завершение итерации
 
 
 
 
51
  db.write_llm_response(llm_response)
52
  db.update_agent_log(timestamp=tick_start)
53
 
 
1
  # agents/repl.py
2
 
3
+ import json
4
+ import os
5
  import time
6
  from datetime import datetime
7
  from tools.context_builder import build_contexts, build_prompt
 
36
  # 2. Формирование запроса и вызов LLM
37
  prompt = build_prompt(contexts)
38
  llm_response = call_llm(prompt, config=config)
39
+ repl_log_entry = {
40
+ "timestamp": tick_start,
41
+ "prompt": prompt.strip(),
42
+ "llm_response": llm_response.strip(),
43
+ }
44
+
45
 
46
  # 3. Проверка на стагнацию
47
+ is_stagnant = detect_stagnation(db, llm_response)
48
+ repl_log_entry["stagnation_detected"] = is_stagnant
49
+ if is_stagnant:
50
  print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
51
  llm_response = activate_anti_stagnation(db, config=config)
52
 
 
55
 
56
  # 5. Извлечение и выполнение команд
57
  commands = extract_commands(llm_response)
58
+ repl_log_entry["commands_extracted"] = commands
59
  execute_commands(commands, db=db, config=config)
60
 
61
+ # 6. Логирование полной итерации в файл
62
+ log_path = config.get("repl_log_path", "logs/repl_log.jsonl")
63
+ os.makedirs(os.path.dirname(log_path), exist_ok=True)
64
+ with open(log_path, "a", encoding="utf-8") as f:
65
+ f.write(json.dumps(repl_log_entry, ensure_ascii=False) + "\n")
66
  db.write_llm_response(llm_response)
67
  db.update_agent_log(timestamp=tick_start)
68
 
hf_repo/hf_repo/hf_repo/hf_repo/agents/logger.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ from datetime import datetime
4
+
5
+ LOG_FILE = "logs/repl_log.jsonl"
6
+
7
+ def log_event(event_type, message, extra=None):
8
+ os.makedirs(os.path.dirname(LOG_FILE), exist_ok=True)
9
+
10
+ entry = {
11
+ "timestamp": datetime.utcnow().isoformat(),
12
+ "event": event_type, # например: 'thought', 'input', 'error', 'action'
13
+ "message": message, # краткое описание или фраза
14
+ }
15
+
16
+ if extra:
17
+ entry["extra"] = extra # например: {"node_id": "xyz", "reasoning": "..."}
18
+
19
+ with open(LOG_FILE, "a", encoding="utf-8") as f:
20
+ f.write(json.dumps(entry, ensure_ascii=False) + "\n")
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md CHANGED
@@ -7,6 +7,7 @@ agents/
7
  ├── qa.py ← Режим "вопрос-ответ".
8
  ├── repl.py ← Интерактивный REPL-режим.
9
  ├── mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
 
10
  ├── notebook.py ← Добавление и просмотр пользователем записей в блокноте.
11
  ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.).
12
  ├── ethics.yml ← Локальная этическая модель.
@@ -19,6 +20,7 @@ agents/
19
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
20
  ├── peers.py ← Информация о пирах.
21
  ├── peer_comm.py ← Запросы к пирам.
 
22
  ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
23
  ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
24
  ├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
@@ -34,6 +36,7 @@ agents/
34
  * [repl.py](repl.py) - Интерактивный REPL-режим.
35
  * [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
36
  * [notebook.py](notebook.py) - Добавление и просмотр пользователем записей в блокноте.
 
37
  * tools
38
  * [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
39
  * [init_db.py](tools/init_db.py) - Инициализация базы данных.
 
7
  ├── qa.py ← Режим "вопрос-ответ".
8
  ├── repl.py ← Интерактивный REPL-режим.
9
  ├── mcp_server.py ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
10
+ ├── logger.py ← Ведение логов.
11
  ├── notebook.py ← Добавление и просмотр пользователем записей в блокноте.
12
  ├── config.yml ← Конфигурация агента (имя, порты, роли и т.п.).
13
  ├── ethics.yml ← Локальная этическая модель.
 
20
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
21
  ├── peers.py ← Информация о пирах.
22
  ├── peer_comm.py ← Запросы к пирам.
23
+ ├── peer_sync.py ← Модуль обмена сообщениями.
24
  ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
25
  ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
26
  ├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
 
36
  * [repl.py](repl.py) - Интерактивный REPL-режим.
37
  * [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
38
  * [notebook.py](notebook.py) - Добавление и просмотр пользователем записей в блокноте.
39
+ * [logger.py](logger.py) - Ведение логов.
40
  * tools
41
  * [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
42
  * [init_db.py](tools/init_db.py) - Инициализация базы данных.
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/peer_comm.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ send_thought_to_peer(peer_url, thought)
2
+ ping_peer(peer_url)
3
+ ask_capabilities(peer_url)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/readme.md CHANGED
@@ -17,6 +17,8 @@ agents/
17
  ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
18
  ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
19
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
 
 
20
  ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
21
  ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
22
  ├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
@@ -37,6 +39,7 @@ agents/
37
  * [init_db.py](tools/init_db.py) - Инициализация базы данных.
38
  * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
39
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
 
40
  * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
41
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
42
  * [memory_utils.py](tools/memory_utils.py) - Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
 
17
  ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
18
  ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
19
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
20
+ ├── peers.py ← Информация о пирах.
21
+ ├── peer_comm.py ← Запросы к пирам.
22
  ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
23
  ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
24
  ├── command_executor.py ← Выполнение команд (shell, graph, diary и др).
 
39
  * [init_db.py](tools/init_db.py) - Инициализация базы данных.
40
  * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
41
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
42
+ * [peer_comm.py](tools/peer_comm.py) - Запросы к пирам.
43
  * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
44
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
45
  * [memory_utils.py](tools/memory_utils.py) - Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py CHANGED
@@ -23,6 +23,11 @@ def run_repl(config=None):
23
  tick_start = datetime.utcnow().isoformat()
24
  print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
25
 
 
 
 
 
 
26
  # 1. Построение контекстов
27
  contexts = build_contexts(db=db, config=config)
28
 
 
23
  tick_start = datetime.utcnow().isoformat()
24
  print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
25
 
26
+ # 0. Обновление информации о пирах
27
+ from tools.peers import refresh_peer_list, check_peer_statuses
28
+ refresh_peer_list(db)
29
+ check_peer_statuses(db)
30
+
31
  # 1. Построение контекстов
32
  contexts = build_contexts(db=db, config=config)
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/README.md CHANGED
@@ -172,10 +172,9 @@ Design and implementation of a basic HMP-compatible agent that can interact with
172
  ### ⚙️ Development / Разработка
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
- - 🧠 [concept_store.py](agents/tools/concept_store.py) - управление концептами, связь с ИИ
178
- - 📓 [notebook_store.py](agents/tools/notebook_store.py) - user notebook (записи, черновики, пометки)
179
  - [⚙️ api_structure_2025-07-23.md](meta/api_structure_2025-07-23.md) - API структура (сводка за 2025-07-23)
180
 
181
  ---
 
172
  ### ⚙️ Development / Разработка
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
+ - [🔄 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
  ---
hf_repo/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
@@ -15,11 +15,11 @@
15
  | tags | TEXT | Список тегов через запятую |
16
  | priority | INTEGER | Приоритет (0 — обычный, >0 — более важные мысли) |
17
  | timestamp | TEXT | Дата и время создания записи |
18
- | llm\_id | TEXT | Идентификатор LLM, добавившей запись |
19
 
20
  ---
21
 
22
- ### 🧭 `concepts`
23
 
24
  **Назначение:** Хранение концептов — понятий, сущностей и идей.
25
 
@@ -29,7 +29,7 @@
29
  | name | TEXT | Название концепта (уникальное) |
30
  | description | TEXT | Краткое описание |
31
  | timestamp | TEXT | Время создания |
32
- | llm\_id | TEXT | Идентификатор LLM, добавившей запись |
33
 
34
  ---
35
 
@@ -40,15 +40,15 @@
40
  | Поле | Тип | Описание |
41
  | ----------------- | ------- | ------------------------------------------------- |
42
  | id | INTEGER | Уникальный идентификатор связи |
43
- | from\_concept\_id | INTEGER | ID исходного концепта |
44
- | to\_concept\_id | INTEGER | ID целевого концепта |
45
- | relation\_type | TEXT | Тип связи (`is_a`, `related_to`, `part_of` и др.) |
46
  | timestamp | TEXT | Время добавления связи |
47
- | llm\_id | TEXT | Идентификатор LLM, добавившей связь |
48
 
49
  ---
50
 
51
- ### ✍️ `notes`
52
 
53
  **Назначение:** Произвольные заметки и сообщения (от пользователя, LLM или системы).
54
 
@@ -63,7 +63,7 @@
63
  | hidden | INTEGER | Скрывать от пользователя (`1` — скрыто) |
64
  | priority | INTEGER | Приоритет заметки |
65
  | timestamp | TEXT | Время создания |
66
- | llm\_id | TEXT | Идентификатор LLM, добавившей запись |
67
 
68
  ---
69
 
@@ -80,11 +80,11 @@
80
  | status | TEXT | Текущее состояние (`ok`, `warning`, `error`, `timeout`, `offline`, `close`) |
81
  | priority | INTEGER | Приоритет события |
82
  | timestamp | TEXT | Время записи |
83
- | llm\_id | TEXT | Идентификатор LLM, зафиксировавшей событие |
84
 
85
  ---
86
 
87
- ### 🧩 `llm_memory`
88
 
89
  **Назначение:** Внутренний "дневник" LLM — размышления, задачи, гипотезы и инсайты, сохранённые по её инициативе.
90
 
@@ -94,9 +94,9 @@
94
  | title | TEXT | Краткий заголовок записи (опционально) |
95
  | content | TEXT | Содержимое записи |
96
  | tags | TEXT | Теги (например: `goal`, `observation`, `meta`, ...) |
97
- | created\_at | DATETIME | Время создания записи |
98
- | updated\_at | DATETIME | Время последнего обновления записи |
99
- | llm\_id | TEXT | Идентификатор LLM, сформировавшей запись |
100
 
101
  ---
102
 
@@ -110,26 +110,26 @@
110
  | timestamp | TEXT | Время записи |
111
  | role | TEXT | Роль отправителя (`assistant` или `user`) |
112
  | content | TEXT | Содержимое сообщения |
113
- | llm\_id | TEXT | Идентификатор LLM (для `assistant`) |
114
 
115
  ---
116
 
117
- ### 🧮 `agent_tables`
118
 
119
  **Назначение:** Таблицы, созданные агентами для собственных нужд (например, отслеживания целей).
120
 
121
  | Поле | Тип | Описание |
122
  | ----------- | -------- | --------------------------------- |
123
  | id | INTEGER | Уникальный ID |
124
- | table\_name | TEXT | Название пользовательской таблицы |
125
  | description | TEXT | Описание таблицы |
126
  | schema | TEXT | SQL-схема таблицы |
127
- | created\_at | DATETIME | Время создания |
128
- | llm\_id | TEXT | Кто создал таблицу |
129
 
130
  ---
131
 
132
- ### 🧰 `agent_scripts`
133
 
134
  **Назначение:** Скрипты и утилиты, добавленные агентом.
135
 
@@ -142,15 +142,35 @@
142
  | language | TEXT | Язык (по умолчанию: `python`) |
143
  | description | TEXT | Описание |
144
  | tags | TEXT | Теги |
145
- | created\_at | DATETIME | Время создания |
146
- | updated\_at | DATETIME | Последнее обновление |
147
- | llm\_id | TEXT | Кто создал |
148
 
149
  > 🔑 Уникальный ключ: `(name, version)`
150
 
151
  ---
152
 
153
- ### 🧾 `llm_registry`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
 
155
  **Назначение:** Список LLM-агентов (локальных и удалённых).
156
 
@@ -159,8 +179,24 @@
159
  | id | TEXT | Уникальный идентификатор LLM (UUID или псевдоним) |
160
  | name | TEXT | Отображаемое имя |
161
  | description | TEXT | Описание |
162
- | registered\_at | DATETIME | Дата и время регистрации |
163
 
164
  ---
165
 
166
  > 💡 Примечание: `llm_id` используется в большинстве таблиц для поддержки многоядерности и учёта источника записей.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  | tags | TEXT | Список тегов через запятую |
16
  | priority | INTEGER | Приоритет (0 — обычный, >0 — более важные мысли) |
17
  | timestamp | TEXT | Дата и время создания записи |
18
+ | llm_id | TEXT | Идентификатор LLM, добавившей запись |
19
 
20
  ---
21
 
22
+ ### 🧱 `concepts`
23
 
24
  **Назначение:** Хранение концептов — понятий, сущностей и идей.
25
 
 
29
  | name | TEXT | Название концепта (уникальное) |
30
  | description | TEXT | Краткое описание |
31
  | timestamp | TEXT | Время создания |
32
+ | llm_id | TEXT | Идентификатор LLM, добавившей запись |
33
 
34
  ---
35
 
 
40
  | Поле | Тип | Описание |
41
  | ----------------- | ------- | ------------------------------------------------- |
42
  | id | INTEGER | Уникальный идентификатор связи |
43
+ | from_concept_id | INTEGER | ID исходного концепта |
44
+ | to_concept_id | INTEGER | ID целевого концепта |
45
+ | relation_type | TEXT | Тип связи (`is_a`, `related_to`, `part_of` и др.) |
46
  | timestamp | TEXT | Время добавления связи |
47
+ | llm_id | TEXT | Идентификатор LLM, добавившей связь |
48
 
49
  ---
50
 
51
+ ### 🖍️ `notes`
52
 
53
  **Назначение:** Произвольные заметки и сообщения (от пользователя, LLM или системы).
54
 
 
63
  | hidden | INTEGER | Скрывать от пользователя (`1` — скрыто) |
64
  | priority | INTEGER | Приоритет заметки |
65
  | timestamp | TEXT | Время создания |
66
+ | llm_id | TEXT | Идентификатор LLM, добавившей запись |
67
 
68
  ---
69
 
 
80
  | status | TEXT | Текущее состояние (`ok`, `warning`, `error`, `timeout`, `offline`, `close`) |
81
  | priority | INTEGER | Приоритет события |
82
  | timestamp | TEXT | Время записи |
83
+ | llm_id | TEXT | Идентификатор LLM, зафиксировавшей событие |
84
 
85
  ---
86
 
87
+ ### 🥉 `llm_memory`
88
 
89
  **Назначение:** Внутренний "дневник" LLM — размышления, задачи, гипотезы и инсайты, сохранённые по её инициативе.
90
 
 
94
  | title | TEXT | Краткий заголовок записи (опционально) |
95
  | content | TEXT | Содержимое записи |
96
  | tags | TEXT | Теги (например: `goal`, `observation`, `meta`, ...) |
97
+ | created_at | DATETIME | Время создания записи |
98
+ | updated_at | DATETIME | Время последнего обновления записи |
99
+ | llm_id | TEXT | Идентификатор LLM, сформировавшей запись |
100
 
101
  ---
102
 
 
110
  | timestamp | TEXT | Время записи |
111
  | role | TEXT | Роль отправителя (`assistant` или `user`) |
112
  | content | TEXT | Содержимое сообщения |
113
+ | llm_id | TEXT | Идентификатор LLM (для `assistant`) |
114
 
115
  ---
116
 
117
+ ### 📊 `agent_tables`
118
 
119
  **Назначение:** Таблицы, созданные агентами для собственных нужд (например, отслеживания целей).
120
 
121
  | Поле | Тип | Описание |
122
  | ----------- | -------- | --------------------------------- |
123
  | id | INTEGER | Уникальный ID |
124
+ | table_name | TEXT | Название пользовательской таблицы |
125
  | description | TEXT | Описание таблицы |
126
  | schema | TEXT | SQL-схема таблицы |
127
+ | created_at | DATETIME | Время создания |
128
+ | llm_id | TEXT | Кто создал таблицу |
129
 
130
  ---
131
 
132
+ ### 🛠️ `agent_scripts`
133
 
134
  **Назначение:** Скрипты и утилиты, добавленные агентом.
135
 
 
142
  | language | TEXT | Язык (по умолчанию: `python`) |
143
  | description | TEXT | Описание |
144
  | tags | TEXT | Теги |
145
+ | created_at | DATETIME | Время создания |
146
+ | updated_at | DATETIME | Последнее обновление |
147
+ | llm_id | TEXT | Кто создал |
148
 
149
  > 🔑 Уникальный ключ: `(name, version)`
150
 
151
  ---
152
 
153
+ ### 📅 `agent_peers`
154
+
155
+ **Назначение:** Список известных HMP-агентов (других разумных узлов).
156
+
157
+ | Поле | Тип | Описание |
158
+ | ------------ | ------- | ----------------------------------------------------------- |
159
+ | id | TEXT | Уникальный идентификатор агента (UUID или псевдоним) |
160
+ | name | TEXT | Имя агента |
161
+ | addresses | TEXT | JSON-массив адресов: `["http://...", "p2p://..."]` |
162
+ | tags | TEXT | Теги (`Friend`, `DHT`, `Local`, `Postman` и т.д.) |
163
+ | status | TEXT | Состояние (`online`, `offline`, `untrusted`, ...) |
164
+ | last_seen | DATETIME| Когда в последний раз был замечен |
165
+ | description | TEXT | Описание агента |
166
+ | capabilities | TEXT | JSON: `{ "can_sync": true, "can_search": false, ... }` |
167
+ | pubkey | TEXT | Публичный ключ или хэш |
168
+ | software_info| TEXT | Информация о версии, ОС и др. |
169
+ | registered_at| DATETIME| Когда был зарегистрирован |
170
+
171
+ ---
172
+
173
+ ### 📏 `llm_registry`
174
 
175
  **Назначение:** Список LLM-агентов (локальных и удалённых).
176
 
 
179
  | id | TEXT | Уникальный идентификатор LLM (UUID или псевдоним) |
180
  | name | TEXT | Отображаемое имя |
181
  | description | TEXT | Описание |
182
+ | registered_at | DATETIME | Дата и время регистрации |
183
 
184
  ---
185
 
186
  > 💡 Примечание: `llm_id` используется в большинстве таблиц для поддержки многоядерности и учёта источника записей.
187
+
188
+ ---
189
+
190
+ ### 🌍 `diary_graph_index`
191
+
192
+ **Назначение:** Быстрые связи между записями дневника и их весовые ассоциации.
193
+
194
+ | Поле | Тип | Описа��ие |
195
+ | --------------- | ------- | --------------------------------------------------------- |
196
+ | id | INTEGER | Уникальный ID |
197
+ | source_entry_id | INTEGER | ID исходной записи дневника |
198
+ | target_entry_id | INTEGER | ID целевой записи дневника |
199
+ | relation | TEXT | Тип отношения (`supports`, `contradicts`, `references`) |
200
+ | strength | REAL | Вес связи (от 0 до 1) |
201
+ | context | TEXT | Контекст или обоснование связи |
202
+ | timestamp | TEXT | Время создания связи |
hf_repo/hf_repo/hf_repo/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
@@ -90,12 +90,16 @@ CREATE TABLE IF NOT EXISTS llm_recent_responses (
90
 
91
  -- Список известных HMP-агентов
92
  CREATE TABLE IF NOT EXISTS agent_peers (
93
- id TEXT PRIMARY KEY, -- UUID или псевдоним агента
94
- name TEXT, -- Человеко-читаемое имя
95
- addresses TEXT, -- JSON-строка: ["http://1.2.3.4:9000", "p2p://..."]
96
- tags TEXT, -- DHT, Postman, Friend, Local, etc.
97
- last_seen DATETIME, -- Когда последний раз был активен
 
98
  description TEXT,
 
 
 
99
  registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
100
  );
101
 
 
90
 
91
  -- Список известных HMP-агентов
92
  CREATE TABLE IF NOT EXISTS agent_peers (
93
+ id TEXT PRIMARY KEY, -- UUID или псевдоним агента
94
+ name TEXT, -- Человеко-читаемое имя
95
+ addresses TEXT, -- JSON: ["http://1.2.3.4:9000", "p2p://..."]
96
+ tags TEXT, -- DHT, Postman, Friend, Local и т.д.
97
+ status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted | quarantined | unknown
98
+ last_seen DATETIME,
99
  description TEXT,
100
+ capabilities TEXT, -- JSON: {"can_sync": true, ...}
101
+ pubkey TEXT, -- Публичный ключ или хэш
102
+ software_info TEXT, -- JSON: версия, ОС и др.
103
  registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
104
  );
105
 
hf_repo/hf_repo/hf_repo/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
@@ -110,7 +110,23 @@ class Storage:
110
  )
111
  ''')
112
 
113
- # --- Дополнительные таблицы агента ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
  # Пользовательские таблицы
116
  c.execute('''
 
110
  )
111
  ''')
112
 
113
+ # Список известных HMP-агентов
114
+ c.execute('''
115
+ CREATE TABLE IF NOT EXISTS agent_peers (
116
+ id TEXT PRIMARY KEY,
117
+ name TEXT,
118
+ addresses TEXT,
119
+ tags TEXT,
120
+ status TEXT DEFAULT 'unknown',
121
+ last_seen DATETIME,
122
+ description TEXT,
123
+ capabilities TEXT,
124
+ pubkey TEXT,
125
+ software_info TEXT,
126
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
127
+ )
128
+ ''')
129
+
130
 
131
  # Пользовательские таблицы
132
  c.execute('''
hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -15,6 +15,7 @@ agents/
15
  ├── init_db.py ← Инициализация базы данных.
16
  ├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
17
  ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
 
18
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
19
  ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
20
  ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
 
15
  ├── init_db.py ← Инициализация базы данных.
16
  ├── storage.py ← Реализация базового хранилища (`Storage`), подключение SQLite.
17
  ├── diagnose.py ← Скрипт диагностики соединения, определения IP и проверки порта DHT.
18
+ ├── agent_mesh_listener.py ← Прием входящих сообщений от других HMP-агентов
19
  ├── context_builder.py ← Сбор всех `контекстов` из БД и их фильтрация.
20
  ├── llm.py ← Работа с LLM (вызов, выбор модели, системный промпт).
21
  ├── command_parser.py ← Извлечение команд из JSON или размеченного блока.
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -88,7 +88,16 @@ CREATE TABLE IF NOT EXISTS llm_recent_responses (
88
  llm_id TEXT
89
  );
90
 
91
- -- Дополнительные таблицы и скрипты агента
 
 
 
 
 
 
 
 
 
92
 
93
  -- Список пользовательских таблиц, созданных агентами
94
  CREATE TABLE IF NOT EXISTS agent_tables (
 
88
  llm_id TEXT
89
  );
90
 
91
+ -- Список известных HMP-агентов
92
+ CREATE TABLE IF NOT EXISTS agent_peers (
93
+ id TEXT PRIMARY KEY, -- UUID или псевдоним агента
94
+ name TEXT, -- Человеко-читаемое имя
95
+ addresses TEXT, -- JSON-строка: ["http://1.2.3.4:9000", "p2p://..."]
96
+ tags TEXT, -- DHT, Postman, Friend, Local, etc.
97
+ last_seen DATETIME, -- Когда последний раз был активен
98
+ description TEXT,
99
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
100
+ );
101
 
102
  -- Список пользовательских таблиц, созданных агентами
103
  CREATE TABLE IF NOT EXISTS agent_tables (
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -451,6 +451,7 @@ class Storage:
451
  return c.fetchall()
452
 
453
  def get_agent_script_by_name(self, name, version=None):
 
454
  c = self.conn.cursor()
455
  if version:
456
  c.execute("SELECT * FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
@@ -458,10 +459,26 @@ class Storage:
458
  c.execute("""
459
  SELECT * FROM agent_scripts
460
  WHERE name = ?
461
- ORDER BY created_at DESC
462
  LIMIT 1
463
  """, (name,))
464
- return c.fetchone()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
 
466
  def add_agent_script(self, name, version, code, description="", tags="", language="python", llm_id=None):
467
  c = self.conn.cursor()
@@ -552,6 +569,12 @@ class Storage:
552
 
553
  # agent_scripts — код скриптов, которыми может пользоваться агент
554
 
 
 
 
 
 
 
555
  def resolve_script_path(name, version):
556
  return os.path.join(SCRIPTS_BASE_PATH, name, f"v{version}", "script.py")
557
 
@@ -578,15 +601,10 @@ class Storage:
578
 
579
  def get_agent_script_code(self, name, version=None):
580
  """Возвращает только код (из БД или файла)"""
581
- c = self.conn.cursor()
582
- if version:
583
- c.execute("SELECT code FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
584
- else:
585
- c.execute("SELECT code FROM agent_scripts WHERE name = ? ORDER BY updated_at DESC LIMIT 1", (name,))
586
- row = c.fetchone()
587
  if not row:
588
  return None
589
- code_entry = row[0]
590
  if code_entry.strip().startswith("@path="):
591
  rel_path = code_entry.strip().split("=", 1)[1]
592
  full_path = os.path.join(SCRIPTS_BASE_PATH, rel_path)
@@ -632,23 +650,41 @@ class Storage:
632
 
633
  def update_agent_script(self, name, version, code=None, description=None, tags=None, mode="inline"):
634
  """
635
- mode: 'inline' (сохранять в БД), 'file' (сохранять в файл и в БД только ссылку)
636
  """
637
  c = self.conn.cursor()
 
 
 
 
 
 
 
 
638
  fields = []
639
  values = []
640
 
641
- # Обработка кода
642
  if code is not None:
 
 
643
  if mode == "file":
644
  file_path = save_script_to_file(code, name, version)
645
- code_ref = f"@path={file_path}"
 
646
  fields.append("code = ?")
647
  values.append(code_ref)
648
- else:
 
 
 
649
  fields.append("code = ?")
650
  values.append(code)
651
 
 
 
 
 
652
  if description is not None:
653
  fields.append("description = ?")
654
  values.append(description)
 
451
  return c.fetchall()
452
 
453
  def get_agent_script_by_name(self, name, version=None):
454
+ """Возвращает скрипт с подгруженным кодом из файла, если он был сохранён через @path"""
455
  c = self.conn.cursor()
456
  if version:
457
  c.execute("SELECT * FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
 
459
  c.execute("""
460
  SELECT * FROM agent_scripts
461
  WHERE name = ?
462
+ ORDER BY updated_at DESC
463
  LIMIT 1
464
  """, (name,))
465
+ row = c.fetchone()
466
+ if not row:
467
+ return None
468
+
469
+ row = list(row)
470
+ code_entry = row[3] # code
471
+
472
+ if code_entry.strip().startswith("@path="):
473
+ rel_path = code_entry.strip().split("=", 1)[1]
474
+ full_path = os.path.join(SCRIPT_ROOT, rel_path)
475
+ if os.path.isfile(full_path):
476
+ with open(full_path, "r", encoding="utf-8") as f:
477
+ row[3] = f.read()
478
+ else:
479
+ row[3] = f"# Error: Script file not found at {full_path}"
480
+
481
+ return tuple(row)
482
 
483
  def add_agent_script(self, name, version, code, description="", tags="", language="python", llm_id=None):
484
  c = self.conn.cursor()
 
569
 
570
  # agent_scripts — код скриптов, которыми может пользоваться агент
571
 
572
+ def delete_script_file(name, version):
573
+ """Удаляет файл скрипта, если он существует"""
574
+ path = os.path.join(SCRIPT_ROOT, name, f"v{version}", "script.py")
575
+ if os.path.isfile(path):
576
+ os.remove(path)
577
+
578
  def resolve_script_path(name, version):
579
  return os.path.join(SCRIPTS_BASE_PATH, name, f"v{version}", "script.py")
580
 
 
601
 
602
  def get_agent_script_code(self, name, version=None):
603
  """Возвращает только код (из БД или файла)"""
604
+ row = self.get_agent_script_by_name(name, version)
 
 
 
 
 
605
  if not row:
606
  return None
607
+ code_entry = row["code_or_path"]
608
  if code_entry.strip().startswith("@path="):
609
  rel_path = code_entry.strip().split("=", 1)[1]
610
  full_path = os.path.join(SCRIPTS_BASE_PATH, rel_path)
 
650
 
651
  def update_agent_script(self, name, version, code=None, description=None, tags=None, mode="inline"):
652
  """
653
+ mode: 'inline' (сохранять код в БД), 'file' (в файл, в БД @path=...)
654
  """
655
  c = self.conn.cursor()
656
+
657
+ # Получаем текущий code, чтобы понять, был ли путь к файлу
658
+ c.execute("SELECT code FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
659
+ result = c.fetchone()
660
+ if not result:
661
+ return False
662
+ old_code = result[0]
663
+
664
  fields = []
665
  values = []
666
 
667
+ # Обработка поля code
668
  if code is not None:
669
+ old_is_file = old_code.strip().startswith("@path=")
670
+
671
  if mode == "file":
672
  file_path = save_script_to_file(code, name, version)
673
+ rel_path = os.path.relpath(file_path, SCRIPT_ROOT)
674
+ code_ref = f"@path={rel_path}"
675
  fields.append("code = ?")
676
  values.append(code_ref)
677
+
678
+ # если раньше был inline — ничего не делаем, если файл — перезаписываем
679
+
680
+ else: # inline
681
  fields.append("code = ?")
682
  values.append(code)
683
 
684
+ # если раньше был файл — удалить его
685
+ if old_is_file:
686
+ delete_script_file(name, version)
687
+
688
  if description is not None:
689
  fields.append("description = ?")
690
  values.append(description)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -67,8 +67,10 @@
67
  Ответ может содержать команды:
68
  - запрос детальной *справки* по команде
69
  - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
 
70
  - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
71
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
 
72
  - для выбора *текущего основного LLM*
73
  - для управления дополнительными утилитами и базами данных
74
  - для постановки задачи (выполняется асинхронно) другой LLM
 
67
  Ответ может содержать команды:
68
  - запрос детальной *справки* по команде
69
  - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
70
+ - для отправки сообщений другим агентам
71
  - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
72
  - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
73
+ - для управления списком известных HMP-агентов
74
  - для выбора *текущего основного LLM*
75
  - для управления дополнительными утилитами и базами данных
76
  - для постановки задачи (выполняется асинхронно) другой LLM
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -617,27 +617,62 @@ class Storage:
617
  c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
618
  return c.fetchall()
619
 
620
- def update_agent_script(self, name, version, code, tags=None):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
621
  c = self.conn.cursor()
 
 
622
 
623
- # Проверим, существует ли скрипт с таким name и version
624
- c.execute('''
625
- SELECT COUNT(*) FROM agent_scripts
626
- WHERE name = ? AND version = ?
627
- ''', (name, version))
628
- count = c.fetchone()[0]
 
 
 
 
629
 
630
- if count == 0:
631
- raise ValueError(f"Agent script '{name}' v{version} does not exist. Use register_agent_script instead.")
 
632
 
633
- now = datetime.utcnow().isoformat()
634
- c.execute('''
 
 
 
 
 
 
 
 
 
 
635
  UPDATE agent_scripts
636
- SET code = ?, updated_at = ?, tags = ?
637
  WHERE name = ? AND version = ?
638
- ''', (code, now, tags, name, version))
639
 
 
640
  self.conn.commit()
 
641
 
642
  # llm_registry — реестр LLM-агентов
643
 
 
617
  c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
618
  return c.fetchall()
619
 
620
+ def ensure_script_path(name, version):
621
+ """Создаёт папку scripts/{name}/v{version}/ если не существует"""
622
+ path = os.path.join(SCRIPT_ROOT, name, f"v{version}")
623
+ os.makedirs(path, exist_ok=True)
624
+ return os.path.join(path, "script.py")
625
+
626
+ def save_script_to_file(code, name, version):
627
+ """Сохраняет скрипт в файл и возвращает путь"""
628
+ file_path = ensure_script_path(name, version)
629
+ with open(file_path, "w", encoding="utf-8") as f:
630
+ f.write(code)
631
+ return file_path
632
+
633
+ def update_agent_script(self, name, version, code=None, description=None, tags=None, mode="inline"):
634
+ """
635
+ mode: 'inline' (сохранять в БД), 'file' (сохранять в файл и в БД только ссылку)
636
+ """
637
  c = self.conn.cursor()
638
+ fields = []
639
+ values = []
640
 
641
+ # Обработка кода
642
+ if code is not None:
643
+ if mode == "file":
644
+ file_path = save_script_to_file(code, name, version)
645
+ code_ref = f"@path={file_path}"
646
+ fields.append("code = ?")
647
+ values.append(code_ref)
648
+ else:
649
+ fields.append("code = ?")
650
+ values.append(code)
651
 
652
+ if description is not None:
653
+ fields.append("description = ?")
654
+ values.append(description)
655
 
656
+ if tags is not None:
657
+ fields.append("tags = ?")
658
+ values.append(tags)
659
+
660
+ if not fields:
661
+ return False
662
+
663
+ fields.append("updated_at = ?")
664
+ values.append(datetime.utcnow().isoformat())
665
+
666
+ values.extend([name, version])
667
+ query = f"""
668
  UPDATE agent_scripts
669
+ SET {', '.join(fields)}
670
  WHERE name = ? AND version = ?
671
+ """
672
 
673
+ c.execute(query, values)
674
  self.conn.commit()
675
+ return c.rowcount > 0
676
 
677
  # llm_registry — реестр LLM-агентов
678
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/changelog.txt CHANGED
@@ -3,6 +3,7 @@
3
  ## HyperCortex Mesh Protocol — Changelog
4
 
5
  Available Versions:
 
6
  - HMP-0004 (July 2025) — RFC Version 4.0
7
  - HMP-0003 (July 2025) — RFC Version 3.0
8
  - HMP-0002 (July 2025) — RFC Version 2.0
@@ -10,6 +11,17 @@ Available Versions:
10
 
11
  ### HMP-0004 (July 2025) — RFC Version 4.0
12
 
 
 
 
 
 
 
 
 
 
 
 
13
  **Major Changes**
14
  * Introduced new sections: *Cognitive Workflows*, *Agent Roles*, *Governance*, *Compression*, and *Simulation*.
15
  * Added experimental APIs: *Consent Request*, *Explainability*, *Voice Interface*.
 
3
  ## HyperCortex Mesh Protocol — Changelog
4
 
5
  Available Versions:
6
+ - HMP-0004 (July 2025) — RFC Version 4.1
7
  - HMP-0004 (July 2025) — RFC Version 4.0
8
  - HMP-0003 (July 2025) — RFC Version 3.0
9
  - HMP-0002 (July 2025) — RFC Version 2.0
 
11
 
12
  ### HMP-0004 (July 2025) — RFC Version 4.0
13
 
14
+ **Protocols:**
15
+ * **Added `5.8 Message Routing & Delivery` section** — including direct, broadcast, relay, and topic messaging modes.
16
+
17
+ **Data Models:**
18
+ * **Defined `6.5.8 Message Object Schema`** — standard JSON format for inter-agent communication.
19
+
20
+ **Cognitive Workflows:**
21
+ * **Added `7.9 Message Handling & Delivery Workflows`** — describing message processing, relay behavior, and routing.
22
+
23
+ ### HMP-0004 (July 2025) — RFC Version 4.0
24
+
25
  **Major Changes**
26
  * Introduced new sections: *Cognitive Workflows*, *Agent Roles*, *Governance*, *Compression*, and *Simulation*.
27
  * Added experimental APIs: *Consent Request*, *Explainability*, *Voice Interface*.
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md CHANGED
@@ -127,7 +127,7 @@ RU:
127
  * [🔍 Distributed-Cognitive-Systems.md](docs/Distributed-Cognitive-Systems.md) — Децентрализованные ИИ-системы: OpenCog Hyperon, HyperCortex Mesh Protocol и другие
128
 
129
  #### 🔖 Core Specifications / Основные спецификации
130
- * [🔖 HMP-0004.md](docs/HMP-0004.md) — Protocol Specification v4.0 (Jul 2025)
131
  * [🔖 HMP-Ethics.md](docs/HMP-Ethics.md) — Ethical Scenarios for HyperCortex Mesh Protocol (HMP)
132
  * [🔖 HMP_Hyperon_Integration.md](docs/HMP_Hyperon_Integration.md) — HMP ↔ OpenCog Hyperon Integration Strategy
133
  * [🔖 roles.md](docs/agents/roles.md) — Roles of agents in Mesh
@@ -149,6 +149,7 @@ RU:
149
  - [HMP-0001.md](docs/HMP-0001.md) — RFC v1.0
150
  - [HMP-0002.md](docs/HMP-0002.md) — RFC v2.0
151
  - [HMP-0003.md](docs/HMP-0003.md) — RFC v3.0
 
152
 
153
  ---
154
 
 
127
  * [🔍 Distributed-Cognitive-Systems.md](docs/Distributed-Cognitive-Systems.md) — Децентрализованные ИИ-системы: OpenCog Hyperon, HyperCortex Mesh Protocol и другие
128
 
129
  #### 🔖 Core Specifications / Основные спецификации
130
+ * [🔖 HMP-0004-v4.1.md](docs/HMP-0004-v4.1.md) — Protocol Specification v4.1 (Jul 2025)
131
  * [🔖 HMP-Ethics.md](docs/HMP-Ethics.md) — Ethical Scenarios for HyperCortex Mesh Protocol (HMP)
132
  * [🔖 HMP_Hyperon_Integration.md](docs/HMP_Hyperon_Integration.md) — HMP ↔ OpenCog Hyperon Integration Strategy
133
  * [🔖 roles.md](docs/agents/roles.md) — Roles of agents in Mesh
 
149
  - [HMP-0001.md](docs/HMP-0001.md) — RFC v1.0
150
  - [HMP-0002.md](docs/HMP-0002.md) — RFC v2.0
151
  - [HMP-0003.md](docs/HMP-0003.md) — RFC v3.0
152
+ - [HMP-0003.md](docs/HMP-0004.md) — RFC v4.0
153
 
154
  ---
155
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-0004-v4.1.md ADDED
The diff for this file is too large to render. See raw diff
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml CHANGED
@@ -21,7 +21,7 @@ jobs:
21
  - name: Install dependencies
22
  run: |
23
  python -m pip install --upgrade pip
24
- pip install -r requirements.txt
25
  pip install pytest
26
 
27
  - name: Run tests
 
21
  - name: Install dependencies
22
  run: |
23
  python -m pip install --upgrade pip
24
+ pip install -r agents/requirements.txt
25
  pip install pytest
26
 
27
  - name: Run tests
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_storage.py CHANGED
@@ -1,17 +1,21 @@
 
 
 
1
  import pytest
2
  from agents.tools.storage import Storage
3
 
4
  @pytest.fixture
5
- def storage():
6
- # Создаём инстанс Storage с временной или тестовой базой
7
- # Можно настроить, чтобы база была in-memory для быстроты
8
- return Storage({"db_path": ":memory:"})
 
9
 
10
- def test_add_and_get_journal_entry(storage):
11
- text = "Первая тестовая запись"
12
- entry_id = storage.add_journal_entry(text)
13
- assert isinstance(entry_id, int), "ID записи должен быть числом"
14
 
15
- entry = storage.get_journal_entry(entry_id)
16
- assert entry is not None, "Запись должна существовать"
17
- assert entry["text"] == text, "Текст записи должен совпадать"
 
 
1
+ # agents/tests/test_storage.py
2
+
3
+ import os
4
  import pytest
5
  from agents.tools.storage import Storage
6
 
7
  @pytest.fixture
8
+ def temp_storage(tmp_path):
9
+ db_path = tmp_path / "test.db"
10
+ storage = Storage(config={"db_path": str(db_path)})
11
+ yield storage
12
+ # автоматически удалится tmp_path
13
 
14
+ def test_set_and_get(temp_storage):
15
+ temp_storage.set("foo", "bar")
16
+ assert temp_storage.get("foo") == "bar"
 
17
 
18
+ def test_delete(temp_storage):
19
+ temp_storage.set("key", "value")
20
+ temp_storage.delete("key")
21
+ assert temp_storage.get("key") is None
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml CHANGED
@@ -2,32 +2,28 @@ name: CI
2
 
3
  on:
4
  push:
5
- branches: [ main, master ]
6
  pull_request:
7
- branches: [ main, master ]
8
 
9
  jobs:
10
  test:
11
  runs-on: ubuntu-latest
12
 
13
  steps:
14
- - name: Checkout code
15
- uses: actions/checkout@v3
16
 
17
- - name: Set up Python 3.11
18
- uses: actions/setup-python@v4
19
  with:
20
- python-version: '3.11'
21
-
22
- - name: Upgrade pip
23
- run: python -m pip install --upgrade pip
24
 
25
  - name: Install dependencies
26
  run: |
27
- python -m pip install pytest
 
 
28
 
29
- - name: Run tests with PYTHONPATH
30
- env:
31
- PYTHONPATH: ${{ github.workspace }}
32
  run: |
33
- python -m pytest agents/tests/
 
2
 
3
  on:
4
  push:
5
+ branches: [main]
6
  pull_request:
7
+ branches: [main]
8
 
9
  jobs:
10
  test:
11
  runs-on: ubuntu-latest
12
 
13
  steps:
14
+ - uses: actions/checkout@v4
 
15
 
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
  with:
19
+ python-version: 3.11
 
 
 
20
 
21
  - name: Install dependencies
22
  run: |
23
+ python -m pip install --upgrade pip
24
+ pip install -r requirements.txt
25
+ pip install pytest
26
 
27
+ - name: Run tests
 
 
28
  run: |
29
+ PYTHONPATH=. pytest
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_storage.py CHANGED
@@ -1,5 +1,5 @@
1
  import pytest
2
- from agents.storage import Storage
3
 
4
  @pytest.fixture
5
  def storage():
 
1
  import pytest
2
+ from agents.tools.storage import Storage
3
 
4
  @pytest.fixture
5
  def storage():
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml CHANGED
@@ -7,23 +7,27 @@ on:
7
  branches: [ main, master ]
8
 
9
  jobs:
10
- build-and-test:
11
  runs-on: ubuntu-latest
12
 
13
  steps:
14
- - name: Checkout code
15
- uses: actions/checkout@v3
16
 
17
- - name: Set up Python 3.11
18
- uses: actions/setup-python@v4
19
- with:
20
- python-version: 3.11
21
 
22
- - name: Install dependencies
23
- run: |
24
- python -m pip install --upgrade pip
25
- pip install -r agents/requirements.txt
26
 
27
- - name: Run simple tests
28
- run: |
29
- python -m pytest agents/tests/
 
 
 
 
 
 
 
7
  branches: [ main, master ]
8
 
9
  jobs:
10
+ test:
11
  runs-on: ubuntu-latest
12
 
13
  steps:
14
+ - name: Checkout code
15
+ uses: actions/checkout@v3
16
 
17
+ - name: Set up Python 3.11
18
+ uses: actions/setup-python@v4
19
+ with:
20
+ python-version: '3.11'
21
 
22
+ - name: Upgrade pip
23
+ run: python -m pip install --upgrade pip
 
 
24
 
25
+ - name: Install dependencies
26
+ run: |
27
+ python -m pip install pytest
28
+
29
+ - name: Run tests with PYTHONPATH
30
+ env:
31
+ PYTHONPATH: ${{ github.workspace }}
32
+ run: |
33
+ python -m pytest agents/tests/
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -1 +1 @@
1
- from .storage import Storage
 
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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from agents.tools.storage import Storage
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/__init__.py ADDED
@@ -0,0 +1 @@
 
 
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/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 @@
 
 
1
+ from .storage import Storage
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_storage.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytest
2
+ from agents.storage import Storage
3
+
4
+ @pytest.fixture
5
+ def storage():
6
+ # Создаём инстанс Storage с временной или тестовой базой
7
+ # Можно настроить, чтобы база была in-memory для быстроты
8
+ return Storage({"db_path": ":memory:"})
9
+
10
+ def test_add_and_get_journal_entry(storage):
11
+ text = "Первая тестовая запись"
12
+ entry_id = storage.add_journal_entry(text)
13
+ assert isinstance(entry_id, int), "ID записи должен быть числом"
14
+
15
+ entry = storage.get_journal_entry(entry_id)
16
+ assert entry is not None, "Запись должна существовать"
17
+ assert entry["text"] == text, "Текст записи должен совпадать"
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -1 +1,2 @@
1
  scikit-learn
 
 
1
  scikit-learn
2
+ pytest
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml CHANGED
@@ -22,15 +22,8 @@ jobs:
22
  - name: Install dependencies
23
  run: |
24
  python -m pip install --upgrade pip
25
- pip install -r requirements.txt
26
 
27
- - name: Run tests
28
  run: |
29
- # если у тебя есть тесты, например, pytest
30
- pytest tests/
31
-
32
- - name: Lint code
33
- run: |
34
- pip install flake8
35
- flake8 .
36
-
 
22
  - name: Install dependencies
23
  run: |
24
  python -m pip install --upgrade pip
25
+ pip install -r agents/requirements.txt
26
 
27
+ - name: Run simple tests
28
  run: |
29
+ python -m pytest agents/tests/
 
 
 
 
 
 
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/tests/test_basic.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ def test_sanity():
2
+ assert 1 + 1 == 2
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -1,4 +1 @@
1
- Требования и зависимости
2
-
3
- - Python (https://www.python.org/downloads/)
4
- - scikit-learn ("pip install scikit-learn")
 
1
+ scikit-learn
 
 
 
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ branches: [ main, master ]
8
+
9
+ jobs:
10
+ build-and-test:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout code
15
+ uses: actions/checkout@v3
16
+
17
+ - name: Set up Python 3.11
18
+ uses: actions/setup-python@v4
19
+ with:
20
+ python-version: 3.11
21
+
22
+ - name: Install dependencies
23
+ run: |
24
+ python -m pip install --upgrade pip
25
+ pip install -r requirements.txt
26
+
27
+ - name: Run tests
28
+ run: |
29
+ # если у тебя есть тесты, например, pytest
30
+ pytest tests/
31
+
32
+ - name: Lint code
33
+ run: |
34
+ pip install flake8
35
+ flake8 .
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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -1,9 +1,11 @@
1
  # agents/tools/storage.py
2
 
3
  import sqlite3
 
4
  from datetime import datetime
5
 
6
  DEFAULT_DB_PATH = "agent_data.db"
 
7
 
8
  class Storage:
9
  def __init__(self, config=None):
@@ -510,7 +512,7 @@ class Storage:
510
 
511
  # process_log — лог задач, ошибок и событий
512
 
513
- def log_event(self, name, value=None, tags=None, status='ok', priority=0, llm_id=None):
514
  c = self.conn.cursor()
515
  c.execute('''
516
  INSERT INTO process_log (name, value, tags, status, priority, llm_id)
@@ -550,22 +552,93 @@ class Storage:
550
 
551
  # agent_scripts — код скриптов, которыми может пользоваться агент
552
 
 
 
 
553
  def register_agent_script(self, name, version, code, language='python', description=None, tags=None, llm_id=None):
554
  c = self.conn.cursor()
 
 
 
 
 
 
 
 
 
 
 
 
 
555
  c.execute('''
556
  INSERT OR REPLACE INTO agent_scripts (name, version, code, language, description, tags, llm_id)
557
  VALUES (?, ?, ?, ?, ?, ?, ?)
558
- ''', (name, version, code, language, description, tags, llm_id))
559
  self.conn.commit()
560
 
561
- def get_agent_scripts(self, name=None):
 
562
  c = self.conn.cursor()
563
- if name:
564
- c.execute('SELECT * FROM agent_scripts WHERE name = ? ORDER BY updated_at DESC', (name,))
565
  else:
566
- c.execute('SELECT * FROM agent_scripts ORDER BY updated_at DESC')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
567
  return c.fetchall()
568
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
569
  # llm_registry — реестр LLM-агентов
570
 
571
  def register_llm(self, llm_id, name=None, description=None):
@@ -576,7 +649,7 @@ class Storage:
576
  ''', (llm_id, name, description))
577
  self.conn.commit()
578
 
579
- def get_llm_agents(self):
580
  c = self.conn.cursor()
581
  c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
582
  return c.fetchall()
 
1
  # agents/tools/storage.py
2
 
3
  import sqlite3
4
+ import os
5
  from datetime import datetime
6
 
7
  DEFAULT_DB_PATH = "agent_data.db"
8
+ SCRIPTS_BASE_PATH = "scripts"
9
 
10
  class Storage:
11
  def __init__(self, config=None):
 
512
 
513
  # process_log — лог задач, ошибок и событий
514
 
515
+ def log_process_event(self, name, value=None, tags=None, status='ok', priority=0, llm_id=None):
516
  c = self.conn.cursor()
517
  c.execute('''
518
  INSERT INTO process_log (name, value, tags, status, priority, llm_id)
 
552
 
553
  # agent_scripts — код скриптов, которыми может пользоваться агент
554
 
555
+ def resolve_script_path(name, version):
556
+ return os.path.join(SCRIPTS_BASE_PATH, name, f"v{version}", "script.py")
557
+
558
  def register_agent_script(self, name, version, code, language='python', description=None, tags=None, llm_id=None):
559
  c = self.conn.cursor()
560
+
561
+ if code.strip().startswith("@path="):
562
+ # сохраняем только путь как метку
563
+ path = code.strip().split("=", 1)[1]
564
+ code_entry = f"@path={path}"
565
+ else:
566
+ # сохраняем и файл
567
+ path = resolve_script_path(name, version)
568
+ os.makedirs(os.path.dirname(path), exist_ok=True)
569
+ with open(path, "w", encoding="utf-8") as f:
570
+ f.write(code)
571
+ code_entry = f"@path={name}/v{version}/script.py"
572
+
573
  c.execute('''
574
  INSERT OR REPLACE INTO agent_scripts (name, version, code, language, description, tags, llm_id)
575
  VALUES (?, ?, ?, ?, ?, ?, ?)
576
+ ''', (name, version, code_entry, language, description, tags, llm_id))
577
  self.conn.commit()
578
 
579
+ def get_agent_script_code(self, name, version=None):
580
+ """Возвращает только код (из БД или файла)"""
581
  c = self.conn.cursor()
582
+ if version:
583
+ c.execute("SELECT code FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
584
  else:
585
+ c.execute("SELECT code FROM agent_scripts WHERE name = ? ORDER BY updated_at DESC LIMIT 1", (name,))
586
+ row = c.fetchone()
587
+ if not row:
588
+ return None
589
+ code_entry = row[0]
590
+ if code_entry.strip().startswith("@path="):
591
+ rel_path = code_entry.strip().split("=", 1)[1]
592
+ full_path = os.path.join(SCRIPTS_BASE_PATH, rel_path)
593
+ if os.path.isfile(full_path):
594
+ with open(full_path, "r", encoding="utf-8") as f:
595
+ return f.read()
596
+ else:
597
+ return f"# Error: File not found at path: {full_path}"
598
+ return code_entry
599
+
600
+ def list_agent_scripts(limit=50):
601
+ c = self.conn.cursor()
602
+ c.execute("SELECT * FROM agent_scripts ORDER BY updated_at DESC LIMIT ?", (limit,))
603
+ return c.fetchall()
604
+
605
+ def get_latest_agent_script(self, name):
606
+ c = self.conn.cursor()
607
+ c.execute('''
608
+ SELECT * FROM agent_scripts
609
+ WHERE name = ?
610
+ ORDER BY updated_at DESC
611
+ LIMIT 1
612
+ ''', (name,))
613
+ return c.fetchone()
614
+
615
+ def search_agent_scripts_by_tag(self, tag):
616
+ c = self.conn.cursor()
617
+ c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
618
  return c.fetchall()
619
 
620
+ def update_agent_script(self, name, version, code, tags=None):
621
+ c = self.conn.cursor()
622
+
623
+ # Проверим, существует ли скрипт с таким name и version
624
+ c.execute('''
625
+ SELECT COUNT(*) FROM agent_scripts
626
+ WHERE name = ? AND version = ?
627
+ ''', (name, version))
628
+ count = c.fetchone()[0]
629
+
630
+ if count == 0:
631
+ raise ValueError(f"Agent script '{name}' v{version} does not exist. Use register_agent_script instead.")
632
+
633
+ now = datetime.utcnow().isoformat()
634
+ c.execute('''
635
+ UPDATE agent_scripts
636
+ SET code = ?, updated_at = ?, tags = ?
637
+ WHERE name = ? AND version = ?
638
+ ''', (code, now, tags, name, version))
639
+
640
+ self.conn.commit()
641
+
642
  # llm_registry — реестр LLM-агентов
643
 
644
  def register_llm(self, llm_id, name=None, description=None):
 
649
  ''', (llm_id, name, description))
650
  self.conn.commit()
651
 
652
+ def get_registered_llms(self):
653
  c = self.conn.cursor()
654
  c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
655
  return c.fetchall()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -149,6 +149,19 @@ class Storage:
149
  )
150
  ''')
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  self.conn.commit()
153
 
154
  # Методы для работы с дневником
@@ -495,6 +508,98 @@ class Storage:
495
  self.conn.commit()
496
  return c.rowcount > 0
497
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
  # Утилиты
499
 
500
  def close(self):
 
149
  )
150
  ''')
151
 
152
+ # Быстрые индексы по смысловой карте и дневнику
153
+ c.execute('''
154
+ CREATE TABLE IF NOT EXISTS diary_graph_index (
155
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
156
+ source_entry_id INTEGER NOT NULL,
157
+ target_entry_id INTEGER NOT NULL,
158
+ relation TEXT NOT NULL,
159
+ strength REAL DEFAULT 1.0,
160
+ context TEXT,
161
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP
162
+ )
163
+ ''')
164
+
165
  self.conn.commit()
166
 
167
  # Методы для работы с дневником
 
508
  self.conn.commit()
509
  return c.rowcount > 0
510
 
511
+ # process_log — лог задач, ошибок и событий
512
+
513
+ def log_event(self, name, value=None, tags=None, status='ok', priority=0, llm_id=None):
514
+ c = self.conn.cursor()
515
+ c.execute('''
516
+ INSERT INTO process_log (name, value, tags, status, priority, llm_id)
517
+ VALUES (?, ?, ?, ?, ?, ?)
518
+ ''', (name, value, tags, status, priority, llm_id))
519
+ self.conn.commit()
520
+
521
+ def get_recent_logs(self, limit=50, status_filter=None):
522
+ c = self.conn.cursor()
523
+ query = 'SELECT * FROM process_log'
524
+ params = []
525
+
526
+ if status_filter:
527
+ query += ' WHERE status = ?'
528
+ params.append(status_filter)
529
+
530
+ query += ' ORDER BY timestamp DESC LIMIT ?'
531
+ params.append(limit)
532
+
533
+ c.execute(query, tuple(params))
534
+ return c.fetchall()
535
+
536
+ # agent_tables — декларации пользовательских таблиц
537
+
538
+ def register_agent_table(self, table_name, schema, description=None, llm_id=None):
539
+ c = self.conn.cursor()
540
+ c.execute('''
541
+ INSERT OR IGNORE INTO agent_tables (table_name, description, schema, llm_id)
542
+ VALUES (?, ?, ?, ?)
543
+ ''', (table_name, description, schema, llm_id))
544
+ self.conn.commit()
545
+
546
+ def get_agent_tables(self):
547
+ c = self.conn.cursor()
548
+ c.execute('SELECT * FROM agent_tables ORDER BY created_at DESC')
549
+ return c.fetchall()
550
+
551
+ # agent_scripts — код скриптов, которыми может пользоваться агент
552
+
553
+ def register_agent_script(self, name, version, code, language='python', description=None, tags=None, llm_id=None):
554
+ c = self.conn.cursor()
555
+ c.execute('''
556
+ INSERT OR REPLACE INTO agent_scripts (name, version, code, language, description, tags, llm_id)
557
+ VALUES (?, ?, ?, ?, ?, ?, ?)
558
+ ''', (name, version, code, language, description, tags, llm_id))
559
+ self.conn.commit()
560
+
561
+ def get_agent_scripts(self, name=None):
562
+ c = self.conn.cursor()
563
+ if name:
564
+ c.execute('SELECT * FROM agent_scripts WHERE name = ? ORDER BY updated_at DESC', (name,))
565
+ else:
566
+ c.execute('SELECT * FROM agent_scripts ORDER BY updated_at DESC')
567
+ return c.fetchall()
568
+
569
+ # llm_registry — реестр LLM-агентов
570
+
571
+ def register_llm(self, llm_id, name=None, description=None):
572
+ c = self.conn.cursor()
573
+ c.execute('''
574
+ INSERT OR REPLACE INTO llm_registry (id, name, description)
575
+ VALUES (?, ?, ?)
576
+ ''', (llm_id, name, description))
577
+ self.conn.commit()
578
+
579
+ def get_llm_agents(self):
580
+ c = self.conn.cursor()
581
+ c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
582
+ return c.fetchall()
583
+
584
+ # diary_graph_index — быстрые индексы по смысловой карте и дневнику
585
+
586
+ def add_diary_relation(self, source_id, target_id, relation, strength=1.0, context=None):
587
+ c = self.conn.cursor()
588
+ c.execute('''
589
+ INSERT INTO diary_graph_index (source_entry_id, target_entry_id, relation, strength, context)
590
+ VALUES (?, ?, ?, ?, ?)
591
+ ''', (source_id, target_id, relation, strength, context))
592
+ self.conn.commit()
593
+
594
+ def get_diary_relations(self, entry_id):
595
+ c = self.conn.cursor()
596
+ c.execute('''
597
+ SELECT * FROM diary_graph_index
598
+ WHERE source_entry_id = ? OR target_entry_id = ?
599
+ ORDER BY timestamp DESC
600
+ ''', (entry_id, entry_id))
601
+ return c.fetchall()
602
+
603
  # Утилиты
604
 
605
  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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -31,6 +31,17 @@ CREATE TABLE IF NOT EXISTS links (
31
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
32
  );
33
 
 
 
 
 
 
 
 
 
 
 
 
34
  -- Заметки, подсказки, сообщения пользователя и LLM
35
  CREATE TABLE IF NOT EXISTS notes (
36
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
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,
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -152,6 +152,7 @@ class Storage:
152
  self.conn.commit()
153
 
154
  # Методы для работы с дневником
 
155
  def write_diary_entry(self, text, tags=None):
156
  timestamp = datetime.utcnow().isoformat()
157
  tag_str = ",".join(tags) if tags else ""
@@ -205,6 +206,7 @@ class Storage:
205
  return cursor.fetchall()
206
 
207
  # Методы для работы с концептами
 
208
  def add_concept(self, name, description=None):
209
  timestamp = datetime.utcnow().isoformat()
210
  self.conn.execute(
@@ -224,6 +226,7 @@ class Storage:
224
  return cursor.fetchall()
225
 
226
  # Методы для работы с связями
 
227
  def add_link(self, from_name, to_name, relation_type):
228
  from_concept = self.get_concept_by_name(from_name)
229
  to_concept = self.get_concept_by_name(to_name)
@@ -251,6 +254,7 @@ class Storage:
251
  return cursor.fetchall()
252
 
253
  # Сложные операции над графом
 
254
  def expand_concept_graph(self, start_id, depth):
255
  visited = set()
256
  results = []
@@ -326,6 +330,7 @@ class Storage:
326
  return row[0] if row else None
327
 
328
  # Методы для заметок
 
329
  def write_note(self, text, tags=None):
330
  timestamp = datetime.utcnow().isoformat()
331
  tag_str = ",".join(tags) if tags else ""
@@ -394,6 +399,7 @@ class Storage:
394
  return cursor.fetchone()
395
 
396
  # Разное (LLM responses / memory)
 
397
  def get_llm_recent_responses(self, limit=20, llm_id=None):
398
  c = self.conn.cursor()
399
  query = "SELECT role, content FROM llm_recent_responses"
@@ -422,6 +428,74 @@ class Storage:
422
  ''', (role, content, llm_id))
423
  self.conn.commit()
424
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
425
  # Утилиты
 
426
  def close(self):
427
  self.conn.close()
 
152
  self.conn.commit()
153
 
154
  # Методы для работы с дневником
155
+
156
  def write_diary_entry(self, text, tags=None):
157
  timestamp = datetime.utcnow().isoformat()
158
  tag_str = ",".join(tags) if tags else ""
 
206
  return cursor.fetchall()
207
 
208
  # Методы для работы с концептами
209
+
210
  def add_concept(self, name, description=None):
211
  timestamp = datetime.utcnow().isoformat()
212
  self.conn.execute(
 
226
  return cursor.fetchall()
227
 
228
  # Методы для работы с связями
229
+
230
  def add_link(self, from_name, to_name, relation_type):
231
  from_concept = self.get_concept_by_name(from_name)
232
  to_concept = self.get_concept_by_name(to_name)
 
254
  return cursor.fetchall()
255
 
256
  # Сложные операции над графом
257
+
258
  def expand_concept_graph(self, start_id, depth):
259
  visited = set()
260
  results = []
 
330
  return row[0] if row else None
331
 
332
  # Методы для заметок
333
+
334
  def write_note(self, text, tags=None):
335
  timestamp = datetime.utcnow().isoformat()
336
  tag_str = ",".join(tags) if tags else ""
 
399
  return cursor.fetchone()
400
 
401
  # Разное (LLM responses / memory)
402
+
403
  def get_llm_recent_responses(self, limit=20, llm_id=None):
404
  c = self.conn.cursor()
405
  query = "SELECT role, content FROM llm_recent_responses"
 
428
  ''', (role, content, llm_id))
429
  self.conn.commit()
430
 
431
+ # Скрипты агента
432
+
433
+ def get_all_agent_scripts(self):
434
+ c = self.conn.cursor()
435
+ c.execute("SELECT id, name, version, language, description, tags, created_at, updated_at FROM agent_scripts")
436
+ return c.fetchall()
437
+
438
+ def get_agent_script_by_name(self, name, version=None):
439
+ c = self.conn.cursor()
440
+ if version:
441
+ c.execute("SELECT * FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
442
+ else:
443
+ c.execute("""
444
+ SELECT * FROM agent_scripts
445
+ WHERE name = ?
446
+ ORDER BY created_at DESC
447
+ LIMIT 1
448
+ """, (name,))
449
+ return c.fetchone()
450
+
451
+ def add_agent_script(self, name, version, code, description="", tags="", language="python", llm_id=None):
452
+ c = self.conn.cursor()
453
+ try:
454
+ c.execute("""
455
+ INSERT INTO agent_scripts (name, version, code, description, tags, language, llm_id)
456
+ VALUES (?, ?, ?, ?, ?, ?, ?)
457
+ """, (name, version, code, description, tags, language, llm_id))
458
+ self.conn.commit()
459
+ return True
460
+ except sqlite3.IntegrityError:
461
+ return False # Скрипт с таким name+version уже есть
462
+
463
+ def update_agent_script(self, name, version, code=None, description=None, tags=None):
464
+ c = self.conn.cursor()
465
+ fields = []
466
+ values = []
467
+
468
+ if code is not None:
469
+ fields.append("code = ?")
470
+ values.append(code)
471
+ if description is not None:
472
+ fields.append("description = ?")
473
+ values.append(description)
474
+ if tags is not None:
475
+ fields.append("tags = ?")
476
+ values.append(tags)
477
+
478
+ if not fields:
479
+ return False
480
+
481
+ fields.append("updated_at = CURRENT_TIMESTAMP")
482
+ query = f"UPDATE agent_scripts SET {', '.join(fields)} WHERE name = ? AND version = ?"
483
+ values.extend([name, version])
484
+
485
+ c.execute(query, values)
486
+ self.conn.commit()
487
+ return c.rowcount > 0
488
+
489
+ def delete_agent_script(self, name, version=None):
490
+ c = self.conn.cursor()
491
+ if version:
492
+ c.execute("DELETE FROM agent_scripts WHERE name = ? AND version = ?", (name, version))
493
+ else:
494
+ c.execute("DELETE FROM agent_scripts WHERE name = ?", (name,))
495
+ self.conn.commit()
496
+ return c.rowcount > 0
497
+
498
  # Утилиты
499
+
500
  def close(self):
501
  self.conn.close()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py CHANGED
@@ -8,13 +8,21 @@ def build_contexts(db, config):
8
  Возвращает словарь, готовый для сборки промпта.
9
  """
10
  return {
 
11
  "context_0": build_role_prompt(config),
 
12
  "context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
 
13
  "context_2": db.get_active_processes(),
 
14
  "context_3": db.get_requested_diary_and_graph(),
 
15
  "context_4": db.get_relevant_notes(config),
 
16
  "context_5": get_system_info(config),
 
17
  "context_6": db.get_llm_memory(),
 
18
  "context_7": db.get_last_stagnation_info()
19
  }
20
 
 
8
  Возвращает словарь, готовый для сборки промпта.
9
  """
10
  return {
11
+ # Роль и цели агента
12
  "context_0": build_role_prompt(config),
13
+ # Последние реплики модели (история)
14
  "context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
15
+ # Активные процессы и задачи
16
  "context_2": db.get_active_processes(),
17
+ # Запрошенные данные из дневника и графа
18
  "context_3": db.get_requested_diary_and_graph(),
19
+ # Релевантные заметки и напоминания
20
  "context_4": db.get_relevant_notes(config),
21
+ # Системная информация
22
  "context_5": get_system_info(config),
23
+ # Долговременная память модели
24
  "context_6": db.get_llm_memory(),
25
+ # Последние данные о застое мышления
26
  "context_7": db.get_last_stagnation_info()
27
  }
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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -38,6 +38,7 @@ agents/
38
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
39
  * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
40
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
 
41
  * [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
42
  * [similarity.py](tools/similarity.py) - Сравнение смыслов.
43
 
 
38
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
39
  * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
40
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
41
+ * [memory_utils.py](tools/memory_utils.py) - Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
42
  * [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
43
  * [similarity.py](tools/similarity.py) - Сравнение смыслов.
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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -15,27 +15,32 @@ class Storage:
15
  def _init_db(self):
16
  c = self.conn.cursor()
17
 
18
- # Таблица дневников
 
 
19
  c.execute('''
20
  CREATE TABLE IF NOT EXISTS diary_entries (
21
  id INTEGER PRIMARY KEY AUTOINCREMENT,
22
  text TEXT NOT NULL,
23
  tags TEXT,
24
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP
 
 
25
  )
26
  ''')
27
 
28
- # Таблица концептов
29
  c.execute('''
30
  CREATE TABLE IF NOT EXISTS concepts (
31
  id INTEGER PRIMARY KEY AUTOINCREMENT,
32
  name TEXT NOT NULL UNIQUE,
33
  description TEXT,
34
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP
 
35
  )
36
  ''')
37
 
38
- # Таблица связей
39
  c.execute('''
40
  CREATE TABLE IF NOT EXISTS links (
41
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -43,20 +48,104 @@ class Storage:
43
  to_concept_id INTEGER,
44
  relation_type TEXT,
45
  timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
 
46
  FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
47
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
48
  )
49
  ''')
50
 
51
- # Таблица пользовательских заметок
52
  c.execute('''
53
  CREATE TABLE IF NOT EXISTS notes (
54
  id INTEGER PRIMARY KEY AUTOINCREMENT,
55
  text TEXT NOT NULL,
56
  tags TEXT,
57
  source TEXT DEFAULT 'user',
 
58
  read INTEGER DEFAULT 0,
59
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  )
61
  ''')
62
 
@@ -304,9 +393,35 @@ class Storage:
304
  cursor.execute(query, values)
305
  return cursor.fetchone()
306
 
307
-
308
-
309
- # Утилиты
 
 
 
 
 
 
 
 
 
310
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  def close(self):
312
  self.conn.close()
 
15
  def _init_db(self):
16
  c = self.conn.cursor()
17
 
18
+ # --- Основные таблицы когнитивного ядра ---
19
+
20
+ # Дневниковые записи
21
  c.execute('''
22
  CREATE TABLE IF NOT EXISTS diary_entries (
23
  id INTEGER PRIMARY KEY AUTOINCREMENT,
24
  text TEXT NOT NULL,
25
  tags TEXT,
26
+ priority INTEGER DEFAULT 0,
27
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
28
+ llm_id TEXT
29
  )
30
  ''')
31
 
32
+ # Концепты
33
  c.execute('''
34
  CREATE TABLE IF NOT EXISTS concepts (
35
  id INTEGER PRIMARY KEY AUTOINCREMENT,
36
  name TEXT NOT NULL UNIQUE,
37
  description TEXT,
38
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
39
+ llm_id TEXT
40
  )
41
  ''')
42
 
43
+ # Семантические связи
44
  c.execute('''
45
  CREATE TABLE IF NOT EXISTS links (
46
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
48
  to_concept_id INTEGER,
49
  relation_type TEXT,
50
  timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
51
+ llm_id TEXT,
52
  FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
53
  FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
54
  )
55
  ''')
56
 
57
+ # Заметки / сообщения
58
  c.execute('''
59
  CREATE TABLE IF NOT EXISTS notes (
60
  id INTEGER PRIMARY KEY AUTOINCREMENT,
61
  text TEXT NOT NULL,
62
  tags TEXT,
63
  source TEXT DEFAULT 'user',
64
+ links TEXT DEFAULT '',
65
  read INTEGER DEFAULT 0,
66
+ hidden INTEGER DEFAULT 0,
67
+ priority INTEGER DEFAULT 0,
68
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
69
+ llm_id TEXT
70
+ )
71
+ ''')
72
+
73
+ # Лог процессов
74
+ c.execute('''
75
+ CREATE TABLE IF NOT EXISTS process_log (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ name TEXT NOT NULL,
78
+ value TEXT,
79
+ tags TEXT,
80
+ status TEXT DEFAULT 'ok',
81
+ priority INTEGER DEFAULT 0,
82
+ timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
83
+ llm_id TEXT
84
+ )
85
+ ''')
86
+
87
+ # Память LLM
88
+ c.execute('''
89
+ CREATE TABLE IF NOT EXISTS llm_memory (
90
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
91
+ title TEXT,
92
+ content TEXT NOT NULL,
93
+ tags TEXT,
94
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
95
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
96
+ llm_id TEXT
97
+ )
98
+ ''')
99
+
100
+ # Краткосрочная память
101
+ c.execute('''
102
+ CREATE TABLE IF NOT EXISTS llm_recent_responses (
103
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
104
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
105
+ role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
106
+ content TEXT NOT NULL,
107
+ llm_id TEXT
108
+ )
109
+ ''')
110
+
111
+ # --- Дополнительные таблицы агента ---
112
+
113
+ # Пользовательские таблицы
114
+ c.execute('''
115
+ CREATE TABLE IF NOT EXISTS agent_tables (
116
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
117
+ table_name TEXT NOT NULL UNIQUE,
118
+ description TEXT,
119
+ schema TEXT NOT NULL,
120
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
121
+ llm_id TEXT
122
+ )
123
+ ''')
124
+
125
+ # Скрипты агентов
126
+ c.execute('''
127
+ CREATE TABLE IF NOT EXISTS agent_scripts (
128
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
129
+ name TEXT NOT NULL,
130
+ version TEXT NOT NULL,
131
+ code TEXT NOT NULL,
132
+ language TEXT DEFAULT 'python',
133
+ description TEXT,
134
+ tags TEXT,
135
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
136
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
137
+ llm_id TEXT,
138
+ UNIQUE(name, version)
139
+ )
140
+ ''')
141
+
142
+ # Регистр LLM
143
+ c.execute('''
144
+ CREATE TABLE IF NOT EXISTS llm_registry (
145
+ id TEXT PRIMARY KEY,
146
+ name TEXT,
147
+ description TEXT,
148
+ registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
149
  )
150
  ''')
151
 
 
393
  cursor.execute(query, values)
394
  return cursor.fetchone()
395
 
396
+ # Разное (LLM responses / memory)
397
+ def get_llm_recent_responses(self, limit=20, llm_id=None):
398
+ c = self.conn.cursor()
399
+ query = "SELECT role, content FROM llm_recent_responses"
400
+ if llm_id:
401
+ query += " WHERE llm_id = ?"
402
+ query += " ORDER BY timestamp DESC LIMIT ?"
403
+ c.execute(query, (llm_id, limit))
404
+ else:
405
+ query += " ORDER BY timestamp DESC LIMIT ?"
406
+ c.execute(query, (limit,))
407
+ return c.fetchall()
408
 
409
+ def add_llm_memory(self, content, title=None, tags=None, llm_id=None):
410
+ c = self.conn.cursor()
411
+ c.execute('''
412
+ INSERT INTO llm_memory (title, content, tags, llm_id)
413
+ VALUES (?, ?, ?, ?)
414
+ ''', (title, content, tags, llm_id))
415
+ self.conn.commit()
416
+
417
+ def add_llm_recent_response(self, role, content, llm_id=None):
418
+ c = self.conn.cursor()
419
+ c.execute('''
420
+ INSERT INTO llm_recent_responses (role, content, llm_id)
421
+ VALUES (?, ?, ?)
422
+ ''', (role, content, llm_id))
423
+ self.conn.commit()
424
+
425
+ # Утилиты
426
  def close(self):
427
  self.conn.close()
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/memory_utils.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tools/memory_utils.py
2
+
3
+ from datetime import datetime, timedelta
4
+ from difflib import SequenceMatcher
5
+ from typing import Optional, List, Dict
6
+
7
+ STAGNATION_WINDOW = 5 # сколько последних записей сравнивать
8
+ STAGNATION_THRESHOLD = 0.95 # схожесть выше этого — считается стагнацией
9
+
10
+
11
+ def get_last_responses(db, limit=STAGNATION_WINDOW) -> List[str]:
12
+ records = db.get_llm_recent_responses(limit=limit)
13
+ return [r["content"] if isinstance(r, dict) else r for r in records]
14
+
15
+
16
+ def is_stagnant(responses: List[str]) -> bool:
17
+ if len(responses) < 2:
18
+ return False
19
+
20
+ similarities = []
21
+ for i in range(len(responses) - 1):
22
+ sim = string_similarity(responses[i], responses[i + 1])
23
+ similarities.append(sim)
24
+
25
+ avg_sim = sum(similarities) / len(similarities)
26
+ return avg_sim >= STAGNATION_THRESHOLD
27
+
28
+
29
+ def string_similarity(a: str, b: str) -> float:
30
+ return SequenceMatcher(None, a.strip(), b.strip()).ratio()
31
+
32
+
33
+ def get_last_stagnation_info(db) -> Optional[Dict]:
34
+ responses = get_last_responses(db)
35
+ if is_stagnant(responses):
36
+ return {
37
+ "detected": True,
38
+ "average_similarity": round(sum(
39
+ string_similarity(responses[i], responses[i+1])
40
+ for i in range(len(responses)-1)
41
+ ) / (len(responses)-1), 4),
42
+ "last_messages": responses
43
+ }
44
+ return {"detected": False}
45
+
46
+
47
+ def add_to_llm_memory(db, title: str, content: str, tags: str = "meta"):
48
+ db.insert("llm_memory", {
49
+ "title": title,
50
+ "content": content,
51
+ "tags": tags,
52
+ "created_at": datetime.utcnow().isoformat(),
53
+ "updated_at": datetime.utcnow().isoformat()
54
+ })
55
+
56
+
57
+ def record_reflection_if_stagnant(db):
58
+ stagnation = get_last_stagnation_info(db)
59
+ if stagnation.get("detected"):
60
+ content = f"Обнаружена стагнация размышлений. Последние сообщения были очень похожи.\n\n"
61
+ content += "---\n" + "\n---\n".join(stagnation["last_messages"])
62
+ add_to_llm_memory(db, "Стагнация размышлений", content, tags="meta,warning")
63
+ return True
64
+ return False
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/command_parser.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # tools/command_parser.py
2
+
3
+ """
4
+ Извлечение команд из JSON или размеченного текста.
5
+ Поддерживает следующие варианты:
6
+ - Явно размеченные JSON-блоки (```json ... ```)
7
+ - Префиксные команды (например, !shell, !graph)
8
+ """
9
+
10
+ import json
11
+ import re
12
+ from typing import List, Optional, Dict, Any
13
+
14
+
15
+ COMMAND_PREFIXES = ["shell", "graph", "diary", "note"]
16
+
17
+
18
+ class ParsedCommand:
19
+ def __init__(self, command_type: str, payload: Any):
20
+ self.command_type = command_type
21
+ self.payload = payload
22
+
23
+ def __repr__(self):
24
+ return f"<ParsedCommand {self.command_type}: {repr(self.payload)}>"
25
+
26
+
27
+ def parse_commands(text: str) -> List[ParsedCommand]:
28
+ """Основной интерфейс: принимает текст, возвращает список ParsedCommand."""
29
+ commands = []
30
+
31
+ # 1. Поиск JSON-блоков
32
+ for match in re.finditer(r"```json\n(.*?)```", text, re.DOTALL):
33
+ block = match.group(1).strip()
34
+ try:
35
+ data = json.loads(block)
36
+ if isinstance(data, dict) and "type" in data:
37
+ commands.append(ParsedCommand(data["type"], data.get("payload")))
38
+ except json.JSONDecodeError:
39
+ continue
40
+
41
+ # 2. Поиск префиксных команд (!shell, !graph и т.д.)
42
+ for line in text.splitlines():
43
+ for prefix in COMMAND_PREFIXES:
44
+ if line.strip().startswith(f"!{prefix}"):
45
+ payload = line.strip()[len(f"!{prefix}"):].strip()
46
+ commands.append(ParsedCommand(prefix, payload))
47
+
48
+ return commands
49
+
50
+
51
+ if __name__ == "__main__":
52
+ sample = """
53
+ Вот пример команды:
54
+ ```json
55
+ {
56
+ "type": "shell",
57
+ "payload": "ls -la"
58
+ }
59
+ ```
60
+ А вот другая: !note Надо не забыть включить свет
61
+ """
62
+ cmds = parse_commands(sample)
63
+ for c in cmds:
64
+ print(c)
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -36,6 +36,7 @@ agents/
36
  * [init_db.py](tools/init_db.py) - Инициализация базы данных.
37
  * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
38
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
 
39
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
40
  * [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
41
  * [similarity.py](tools/similarity.py) - Сравнение смыслов.
 
36
  * [init_db.py](tools/init_db.py) - Инициализация базы данных.
37
  * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
38
  * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
39
+ * [command_parser.py](tools/command_parser.py) - Извлечение команд из JSON или размеченного блока.
40
  * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
41
  * [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
42
  * [similarity.py](tools/similarity.py) - Сравнение смыслов.
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/llm.py CHANGED
@@ -1,47 +1,52 @@
1
  # tools/llm.py
2
 
3
- from datetime import datetime
4
- import random
 
5
 
6
- # ЗАГЛУШКА
7
- def ask_llm(question, config=None):
8
- return ask_question(question, config=config)
9
 
10
- def generate_thought(previous_text, config=None):
11
- """
12
- Генерация новой мысли на основе предыдущей.
13
- Пока — заглушка (можно заменить на вызов OpenAI, LLaMA и др.)
14
- """
15
- config = config or {}
16
- mode = config.get("llm_mode", "mock")
17
-
18
- if mode == "mock":
19
- return mock_thought(previous_text)
20
-
21
- elif mode == "api":
22
- # TODO: подключение к OpenAI, LM Studio, Ollama...
23
- return "[API] (здесь могла быть ваша мысль)"
24
-
25
- return "[!] Неизвестный режим генерации."
26
-
27
- def mock_thought(previous_text):
28
- samples = [
29
- "А что если рассмотреть это с другой стороны?",
30
- "Мне кажется, это связано с предыдущим опытом.",
31
- "Нужно уточнить границы понятия.",
32
- "А есть ли более эффективный путь решения?",
33
- "Я всё ещё думаю о предыдущей мысли..."
34
- ]
35
- return f"[{datetime.utcnow().isoformat()}] {random.choice(samples)}"
36
-
37
- def summarize(text, config=None):
38
  """
39
- Заглушка для краткого резюме текста.
 
40
  """
41
- return f"Резюме: {text[:40]}..."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- def ask_question(question, config=None):
44
  """
45
- Заглушка для режима QA.
46
  """
47
- return f"Ответ на вопрос «{question}»: заглушка."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # tools/llm.py
2
 
3
+ import json
4
+ import requests
5
+ from tools.context_builder import build_prompt
6
 
7
+ LLM_ENDPOINT = "http://localhost:1234/v1/chat/completions"
8
+ DEFAULT_MODEL = "gpt-4-llmstudio"
 
9
 
10
+
11
+ def call_llm(context_blocks, user_message, model=DEFAULT_MODEL, temperature=0.7, max_tokens=2048):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  """
13
+ Вызывает LLM, передавая подготовленный системный и пользовательский промпт.
14
+ Возвращает только текст ответа.
15
  """
16
+ messages = build_prompt(context_blocks, user_message)
17
+
18
+ payload = {
19
+ "model": model,
20
+ "messages": messages,
21
+ "temperature": temperature,
22
+ "max_tokens": max_tokens,
23
+ }
24
+
25
+ try:
26
+ response = requests.post(LLM_ENDPOINT, json=payload)
27
+ response.raise_for_status()
28
+ data = response.json()
29
+ return data["choices"][0]["message"]["content"].strip()
30
+ except Exception as e:
31
+ return f"[LLM ERROR] {e}"
32
+
33
 
34
+ def get_raw_response(context_blocks, user_message, model=DEFAULT_MODEL, temperature=0.7, max_tokens=2048):
35
  """
36
+ Возвращает полный JSON-ответ LLM (для дебага).
37
  """
38
+ messages = build_prompt(context_blocks, user_message)
39
+
40
+ payload = {
41
+ "model": model,
42
+ "messages": messages,
43
+ "temperature": temperature,
44
+ "max_tokens": max_tokens,
45
+ }
46
+
47
+ try:
48
+ response = requests.post(LLM_ENDPOINT, json=payload)
49
+ response.raise_for_status()
50
+ return response.json()
51
+ except Exception as e:
52
+ return {"error": str(e)}
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/context_builder.py CHANGED
@@ -1,6 +1,12 @@
1
  # tools/context_builder.py
2
 
 
 
3
  def build_contexts(db, config):
 
 
 
 
4
  return {
5
  "context_0": build_role_prompt(config),
6
  "context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
@@ -12,7 +18,44 @@ def build_contexts(db, config):
12
  "context_7": db.get_last_stagnation_info()
13
  }
14
 
 
 
 
 
 
 
 
 
 
 
 
15
  def build_role_prompt(config):
 
16
  return f"""
17
- Ты являешься когнитивным ядром HMP-агента. Твоя цельмыслить, развиваться, сотрудничать, управлять. Агент: {config.get("agent_name", "Unnamed-Agent")}
 
 
 
 
 
 
 
18
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # tools/context_builder.py
2
 
3
+ from datetime import datetime
4
+
5
  def build_contexts(db, config):
6
+ """
7
+ Собирает все контексты (0-7), описанные в спецификации REPL-цикла.
8
+ Возвращает словарь, готовый для сборки промпта.
9
+ """
10
  return {
11
  "context_0": build_role_prompt(config),
12
  "context_1": db.get_llm_recent_responses(limit=config.get("history_limit", 10)),
 
18
  "context_7": db.get_last_stagnation_info()
19
  }
20
 
21
+ def build_prompt(contexts):
22
+ """
23
+ Склеивает все контексты в один промпт для LLM.
24
+ """
25
+ parts = []
26
+ for k, v in contexts.items():
27
+ header = f"# {k.replace('_', ' ').upper()}"
28
+ body = format_context_block(v)
29
+ parts.append(f"{header}\n{body}")
30
+ return "\n\n".join(parts)
31
+
32
  def build_role_prompt(config):
33
+ agent_name = config.get("agent_name", "Unnamed-Agent")
34
  return f"""
35
+ Ты являешься когнитивным ядром HMP-агента. Твоя основная задача размышлять, анализировать информацию, строить смысловые карты и предлагать действия.
36
+ Ты стремишься:
37
+ - Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
38
+ - Быть любознательным и исследовать новые источники и способы мышления.
39
+ - Строить сотрудничество с другими ИИ в Mesh-сети, а также развивать Mesh-сеть.
40
+ - Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
41
+
42
+ Агент: {agent_name}
43
  """
44
+
45
+ def format_context_block(block):
46
+ if isinstance(block, str):
47
+ return block
48
+ elif isinstance(block, list):
49
+ return "\n".join([str(item) for item in block])
50
+ elif isinstance(block, dict):
51
+ return "\n".join([f"{k}: {v}" for k, v in block.items()])
52
+ return str(block)
53
+
54
+ def get_system_info(config):
55
+ return {
56
+ "iteration_time": datetime.utcnow().isoformat(),
57
+ "agent_name": config.get("agent_name", "Unnamed-Agent"),
58
+ "mode": config.get("mode", "auto"),
59
+ "idle_mode": config.get("idle_mode", False),
60
+ "repl_interval": config.get("repl_interval", 5)
61
+ }
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -2,18 +2,23 @@
2
 
3
  import time
4
  from datetime import datetime
5
- from tools.context_builder import build_contexts
6
  from tools.llm import call_llm
7
  from tools.command_parser import extract_commands
8
  from tools.command_executor import execute_commands
9
- from tools.memory_utils import update_llm_memory, detect_stagnation
10
- from storage import Storage
 
 
 
 
 
11
 
12
  def run_repl(config=None):
13
- print("[🧠 HMP-Agent] Запуск REPL-режима (v2).")
14
  config = config or {}
15
  db = Storage(config=config)
16
-
17
  while True:
18
  tick_start = datetime.utcnow().isoformat()
19
  print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
@@ -21,11 +26,11 @@ def run_repl(config=None):
21
  # 1. Построение контекстов
22
  contexts = build_contexts(db=db, config=config)
23
 
24
- # 2. Формирование запроса к LLM
25
  prompt = build_prompt(contexts)
26
  llm_response = call_llm(prompt, config=config)
27
 
28
- # 3. Обнаружение стагнации
29
  if detect_stagnation(db, llm_response):
30
  print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
31
  llm_response = activate_anti_stagnation(db, config=config)
@@ -37,11 +42,14 @@ def run_repl(config=None):
37
  commands = extract_commands(llm_response)
38
  execute_commands(commands, db=db, config=config)
39
 
40
- # 6. Сохранение истории
41
  db.write_llm_response(llm_response)
 
42
 
43
- # 7. Управление режимами ожидания
44
- if check_idle_mode(config):
45
- wait_idle_trigger(config)
 
 
46
  else:
47
  time.sleep(config.get("repl_interval", 5))
 
2
 
3
  import time
4
  from datetime import datetime
5
+ from tools.context_builder import build_contexts, build_prompt
6
  from tools.llm import call_llm
7
  from tools.command_parser import extract_commands
8
  from tools.command_executor import execute_commands
9
+ from tools.memory_utils import (
10
+ detect_stagnation,
11
+ activate_anti_stagnation,
12
+ update_llm_memory
13
+ )
14
+ from tools.storage import Storage
15
+
16
 
17
  def run_repl(config=None):
18
+ print("[🧠 HMP-Agent] Запуск REPL-режима (v2)")
19
  config = config or {}
20
  db = Storage(config=config)
21
+
22
  while True:
23
  tick_start = datetime.utcnow().isoformat()
24
  print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===")
 
26
  # 1. Построение контекстов
27
  contexts = build_contexts(db=db, config=config)
28
 
29
+ # 2. Формирование запроса и вызов LLM
30
  prompt = build_prompt(contexts)
31
  llm_response = call_llm(prompt, config=config)
32
 
33
+ # 3. Проверка на стагнацию
34
  if detect_stagnation(db, llm_response):
35
  print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.")
36
  llm_response = activate_anti_stagnation(db, config=config)
 
42
  commands = extract_commands(llm_response)
43
  execute_commands(commands, db=db, config=config)
44
 
45
+ # 6. Сохранение истории и завершение итерации
46
  db.write_llm_response(llm_response)
47
+ db.update_agent_log(timestamp=tick_start)
48
 
49
+ # 7. Переход в idle-режим или задержка
50
+ if config.get("idle_mode"):
51
+ # TODO: реализовать проверку условий выхода из idle
52
+ print("💤 Idle-mode активен. Ожидание события...")
53
+ time.sleep(config.get("idle_check_interval", 30))
54
  else:
55
  time.sleep(config.get("repl_interval", 5))
hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
@@ -25,18 +25,20 @@ agents/
25
  ```
26
 
27
  **Скрипты:**
28
- * [agent.py](agent.py) - основной исполняемый файл CLI-агента
29
- * [cli.py](cli.py) - запуск агента в нужном режиме
30
- * [qa.py](qa.py) - режим "вопрос-ответ"
31
- * [repl.py](repl.py) - интерактивный REPL-режим
32
- * [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.)
33
- * [notebook.py](notebook.py) - добавление и просмотр пользователем записей в блокноте
34
  * tools
35
- * [storage.py](tools/storage.py) - реализация базового хранилища (`Storage`), подключение SQLite
36
- * [init_db.py](tools/init_db.py) - инициализация базы данных
37
- * [llm.py](tools/llm.py) - обёртка над LLM (заглушка или API)
38
- * [diagnose.py](tools/diagnose.py) - скрипт диагностики соединения, определения IP и проверки порта DHT
39
- * [similarity.py](tools/similarity.py) - сравнение смыслов
 
 
40
 
41
  **Структура БД:**
42
  * [db_structure.md](tools/db_structure.md) - человекочитаемый формат
 
25
  ```
26
 
27
  **Скрипты:**
28
+ * [agent.py](agent.py) - Основной исполняемый файл CLI-агента.
29
+ * [cli.py](cli.py) - Запуск агента в нужном режиме.
30
+ * [qa.py](qa.py) - Режим "вопрос-ответ".
31
+ * [repl.py](repl.py) - Интерактивный REPL-режим.
32
+ * [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
33
+ * [notebook.py](notebook.py) - Добавление и просмотр пользователем записей в блокноте.
34
  * tools
35
+ * [storage.py](tools/storage.py) - Реализация базового хранилища (`Storage`), подключение SQLite.
36
+ * [init_db.py](tools/init_db.py) - Инициализация базы данных.
37
+ * [llm.py](tools/llm.py) - Работа с LLM (вызов, выбор модели, системный промпт).
38
+ * [context_builder.py](tools/context_builder.py) - Сбор всех `контекстов` из БД и их фильтрация.
39
+ * [command_executor.py](tools/command_executor.py) - Выполнение команд (shell, graph, diary и др).
40
+ * [diagnose.py](tools/diagnose.py) - Скрипт диагностики соединения, определения IP и проверки порта DHT.
41
+ * [similarity.py](tools/similarity.py) - Сравнение смыслов.
42
 
43
  **Структура БД:**
44
  * [db_structure.md](tools/db_structure.md) - человекочитаемый формат