GitHub Action
		
	commited on
		
		
					Commit 
							
							·
						
						559a961
	
1
								Parent(s):
							
							e683f99
								
Sync from GitHub with Git LFS
Browse filesThis view is limited to 50 files because it contains too many changes.  
							See raw diff
- agents/tests/test_storage.py +15 -11
- hf_repo/.github/workflows/ci.yml +11 -15
- hf_repo/hf_repo/agents/tests/test_storage.py +1 -1
- hf_repo/hf_repo/hf_repo/.github/workflows/ci.yml +18 -14
- hf_repo/hf_repo/hf_repo/hf_repo/agents/__init__.py +1 -1
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/__init__.py +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tests/__init__.py +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/__init__.py +1 -0
- 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
- 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
- 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
- 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
- hf_repo/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
- hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/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 +59 -6
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +22 -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/agents/tools/storage.py +105 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +96 -7
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +29 -3
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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_executor.py +17 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +18 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +33 -56
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +18 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +18 -3
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/Basic-agent-sim.md +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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-Agent-Architecture.md +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Overview.md +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/README.md +1 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +10 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +68 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/.github/workflows/sync-to-gitlab.yml +3 -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/hf_repo/hf_repo/hf_repo/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 -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/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/sync-to-gitlab.yml +10 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml +23 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +97 -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/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md +12 -0
- hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +63 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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 +16 -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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Distributed_Cognitive_Core_light.md +53 -0
    	
        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  | 
| 6 | 
            -
                 | 
| 7 | 
            -
                 | 
| 8 | 
            -
                 | 
|  | |
| 9 |  | 
| 10 | 
            -
            def  | 
| 11 | 
            -
                 | 
| 12 | 
            -
                 | 
| 13 | 
            -
                assert isinstance(entry_id, int), "ID записи должен быть числом"
         | 
| 14 |  | 
| 15 | 
            -
             | 
| 16 | 
            -
                 | 
| 17 | 
            -
                 | 
|  | 
|  | |
| 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/.github/workflows/ci.yml
    CHANGED
    
    | @@ -2,32 +2,28 @@ name: CI | |
| 2 |  | 
| 3 | 
             
            on:
         | 
| 4 | 
             
              push:
         | 
| 5 | 
            -
                branches: [ | 
| 6 | 
             
              pull_request:
         | 
| 7 | 
            -
                branches: [ | 
| 8 |  | 
| 9 | 
             
            jobs:
         | 
| 10 | 
             
              test:
         | 
| 11 | 
             
                runs-on: ubuntu-latest
         | 
| 12 |  | 
| 13 | 
             
                steps:
         | 
| 14 | 
            -
                  -  | 
| 15 | 
            -
                    uses: actions/checkout@v3
         | 
| 16 |  | 
| 17 | 
            -
                  - name: Set up Python | 
| 18 | 
            -
                    uses: actions/setup-python@ | 
| 19 | 
             
                    with:
         | 
| 20 | 
            -
                      python-version:  | 
| 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  | 
|  | |
|  | |
| 28 |  | 
| 29 | 
            -
                  - name: Run tests | 
| 30 | 
            -
                    env:
         | 
| 31 | 
            -
                      PYTHONPATH: ${{ github.workspace }}
         | 
| 32 | 
             
                    run: |
         | 
| 33 | 
            -
                       | 
|  | |
| 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/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/.github/workflows/ci.yml
    CHANGED
    
    | @@ -7,23 +7,27 @@ on: | |
| 7 | 
             
                branches: [ main, master ]
         | 
| 8 |  | 
| 9 | 
             
            jobs:
         | 
| 10 | 
            -
               | 
| 11 | 
             
                runs-on: ubuntu-latest
         | 
| 12 |  | 
| 13 | 
             
                steps:
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
                    python -m pip install --upgrade pip
         | 
| 25 | 
            -
                    pip install -r agents/requirements.txt
         | 
| 26 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 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/agents/__init__.py
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
             | 
|  | |
| 1 | 
            +
             | 
    	
        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/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/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/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/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/.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 | 
            -
                     | 
| 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/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/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/.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/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):
         | 
| @@ -550,21 +552,50 @@ 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,  | 
| 559 | 
             
                    self.conn.commit()
         | 
| 560 |  | 
| 561 | 
            -
                def  | 
|  | |
| 562 | 
             
                    c = self.conn.cursor()
         | 
| 563 | 
            -
                    if  | 
| 564 | 
            -
                        c.execute( | 
| 565 | 
             
                    else:
         | 
| 566 | 
            -
                        c.execute( | 
| 567 | 
            -
                     | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 568 |  | 
| 569 | 
             
                def list_agent_scripts(limit=50):
         | 
| 570 | 
             
                    c = self.conn.cursor()
         | 
| @@ -585,6 +616,28 @@ class Storage: | |
| 585 | 
             
                    c = self.conn.cursor()
         | 
| 586 | 
             
                    c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
         | 
| 587 | 
             
                    return c.fetchall()
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 588 |  | 
| 589 | 
             
                # llm_registry — реестр LLM-агентов
         | 
| 590 |  | 
|  | |
| 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):
         | 
|  | |
| 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()
         | 
|  | |
| 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 |  | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -510,7 +510,7 @@ class Storage: | |
| 510 |  | 
| 511 | 
             
                # process_log — лог задач, ошибок и событий
         | 
| 512 |  | 
| 513 | 
            -
                def  | 
| 514 | 
             
                    c = self.conn.cursor()
         | 
| 515 | 
             
                    c.execute('''
         | 
| 516 | 
             
                        INSERT INTO process_log (name, value, tags, status, priority, llm_id)
         | 
| @@ -566,6 +566,26 @@ class Storage: | |
| 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 +596,7 @@ class Storage: | |
| 576 | 
             
                    ''', (llm_id, name, description))
         | 
| 577 | 
             
                    self.conn.commit()
         | 
| 578 |  | 
| 579 | 
            -
                def  | 
| 580 | 
             
                    c = self.conn.cursor()
         | 
| 581 | 
             
                    c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
         | 
| 582 | 
             
                    return c.fetchall()
         | 
|  | |
| 510 |  | 
| 511 | 
             
                # process_log — лог задач, ошибок и событий
         | 
| 512 |  | 
| 513 | 
            +
                def log_process_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)
         | 
|  | |
| 566 | 
             
                        c.execute('SELECT * FROM agent_scripts ORDER BY updated_at DESC')
         | 
| 567 | 
             
                    return c.fetchall()
         | 
| 568 |  | 
| 569 | 
            +
                def list_agent_scripts(limit=50):
         | 
| 570 | 
            +
                    c = self.conn.cursor()
         | 
| 571 | 
            +
                    c.execute("SELECT * FROM agent_scripts ORDER BY updated_at DESC LIMIT ?", (limit,))
         | 
| 572 | 
            +
                    return c.fetchall()    
         | 
| 573 | 
            +
             | 
| 574 | 
            +
                def get_latest_agent_script(self, name):
         | 
| 575 | 
            +
                    c = self.conn.cursor()
         | 
| 576 | 
            +
                    c.execute('''
         | 
| 577 | 
            +
                        SELECT * FROM agent_scripts
         | 
| 578 | 
            +
                        WHERE name = ?
         | 
| 579 | 
            +
                        ORDER BY updated_at DESC
         | 
| 580 | 
            +
                        LIMIT 1
         | 
| 581 | 
            +
                    ''', (name,))
         | 
| 582 | 
            +
                    return c.fetchone()
         | 
| 583 | 
            +
             | 
| 584 | 
            +
                def search_agent_scripts_by_tag(self, tag):
         | 
| 585 | 
            +
                    c = self.conn.cursor()
         | 
| 586 | 
            +
                    c.execute("SELECT * FROM agent_scripts WHERE tags LIKE ?", (f"%{tag}%",))
         | 
| 587 | 
            +
                    return c.fetchall()
         | 
| 588 | 
            +
                
         | 
| 589 | 
             
                # llm_registry — реестр LLM-агентов
         | 
| 590 |  | 
| 591 | 
             
                def register_llm(self, llm_id, name=None, description=None):
         | 
|  | |
| 596 | 
             
                    ''', (llm_id, name, description))
         | 
| 597 | 
             
                    self.conn.commit()
         | 
| 598 |  | 
| 599 | 
            +
                def get_registered_llms(self):
         | 
| 600 | 
             
                    c = self.conn.cursor()
         | 
| 601 | 
             
                    c.execute('SELECT * FROM llm_registry ORDER BY registered_at DESC')
         | 
| 602 | 
             
                    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/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/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/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/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/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 | 
            -
                             | 
|  | |
|  | |
| 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 | 
            -
                             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 60 | 
             
                        )
         | 
| 61 | 
             
                    ''')
         | 
| 62 |  | 
|  | |
| 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 |  | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -304,9 +304,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()
         | 
|  | |
| 304 | 
             
                    cursor.execute(query, values)
         | 
| 305 | 
             
                    return cursor.fetchone()
         | 
| 306 |  | 
| 307 | 
            +
                # Разное (LLM responses / memory)
         | 
| 308 | 
            +
                def get_llm_recent_responses(self, limit=20, llm_id=None):
         | 
| 309 | 
            +
                    c = self.conn.cursor()
         | 
| 310 | 
            +
                    query = "SELECT role, content FROM llm_recent_responses"
         | 
| 311 | 
            +
                    if llm_id:
         | 
| 312 | 
            +
                        query += " WHERE llm_id = ?"
         | 
| 313 | 
            +
                        query += " ORDER BY timestamp DESC LIMIT ?"
         | 
| 314 | 
            +
                        c.execute(query, (llm_id, limit))
         | 
| 315 | 
            +
                    else:
         | 
| 316 | 
            +
                        query += " ORDER BY timestamp DESC LIMIT ?"
         | 
| 317 | 
            +
                        c.execute(query, (limit,))
         | 
| 318 | 
            +
                    return c.fetchall()
         | 
| 319 | 
            +
             | 
| 320 | 
            +
                def add_llm_memory(self, content, title=None, tags=None, llm_id=None):
         | 
| 321 | 
            +
                    c = self.conn.cursor()
         | 
| 322 | 
            +
                    c.execute('''
         | 
| 323 | 
            +
                        INSERT INTO llm_memory (title, content, tags, llm_id)
         | 
| 324 | 
            +
                        VALUES (?, ?, ?, ?)
         | 
| 325 | 
            +
                    ''', (title, content, tags, llm_id))
         | 
| 326 | 
            +
                    self.conn.commit()
         | 
| 327 |  | 
| 328 | 
            +
                def add_llm_recent_response(self, role, content, llm_id=None):
         | 
| 329 | 
            +
                    c = self.conn.cursor()
         | 
| 330 | 
            +
                    c.execute('''
         | 
| 331 | 
            +
                        INSERT INTO llm_recent_responses (role, content, llm_id)
         | 
| 332 | 
            +
                        VALUES (?, ?, ?)
         | 
| 333 | 
            +
                    ''', (role, content, llm_id))
         | 
| 334 | 
            +
                    self.conn.commit()
         | 
| 335 | 
            +
             | 
| 336 | 
            +
                # Утилиты
         | 
| 337 | 
             
                def close(self):
         | 
| 338 | 
             
                    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/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/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/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/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/agents/tools/llm.py
    CHANGED
    
    | @@ -1,47 +1,52 @@ | |
| 1 | 
             
            # tools/llm.py
         | 
| 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
            import  | 
|  | |
| 5 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                return ask_question(question, config=config)
         | 
| 9 |  | 
| 10 | 
            -
             | 
| 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 | 
            -
                 | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 42 |  | 
| 43 | 
            -
            def  | 
| 44 | 
             
                """
         | 
| 45 | 
            -
                 | 
| 46 | 
             
                """
         | 
| 47 | 
            -
                 | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 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/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-агента. Твоя  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 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/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  | 
| 10 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 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. Формирование запроса  | 
| 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  | 
| 45 | 
            -
                         | 
|  | |
|  | |
| 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/agents/readme.md
    CHANGED
    
    | @@ -25,18 +25,20 @@ agents/ | |
| 25 | 
             
            ```
         | 
| 26 |  | 
| 27 | 
             
            **Скрипты:**
         | 
| 28 | 
            -
            * [agent.py](agent.py) -  | 
| 29 | 
            -
            * [cli.py](cli.py) -  | 
| 30 | 
            -
            * [qa.py](qa.py) -  | 
| 31 | 
            -
            * [repl.py](repl.py) -  | 
| 32 | 
            -
            * [mcp_server.py](mcp_server.py) - API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.)
         | 
| 33 | 
            -
            * [notebook.py](notebook.py) -  | 
| 34 | 
             
            * tools
         | 
| 35 | 
            -
              * [storage.py](tools/storage.py) -  | 
| 36 | 
            -
              * [init_db.py](tools/init_db.py) -  | 
| 37 | 
            -
              * [llm.py](tools/llm.py) -  | 
| 38 | 
            -
              * [ | 
| 39 | 
            -
              * [ | 
|  | |
|  | |
| 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) - человекочитаемый формат
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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_executor.py
    ADDED
    
    | @@ -0,0 +1,17 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # tools/command_executor.py
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            def execute_commands(commands, db, config):
         | 
| 4 | 
            +
                for cmd in commands:
         | 
| 5 | 
            +
                    print(f"🛠️ Выполнение команды: {cmd['type']} ({cmd.get('cmd_id')})")
         | 
| 6 | 
            +
                    try:
         | 
| 7 | 
            +
                        if cmd['type'] == 'shell':
         | 
| 8 | 
            +
                            run_shell_command(cmd, db)
         | 
| 9 | 
            +
                        elif cmd['type'] == 'diary_entry':
         | 
| 10 | 
            +
                            db.write_entry(cmd['args']['text'], tags=["diary"])
         | 
| 11 | 
            +
                        elif cmd['type'] == 'graph_add':
         | 
| 12 | 
            +
                            db.add_link_or_concept(cmd['args'])
         | 
| 13 | 
            +
                        elif cmd['type'] == 'llm_memory_add':
         | 
| 14 | 
            +
                            db.add_llm_memory(cmd['args'])
         | 
| 15 | 
            +
                        # ... остальные команды
         | 
| 16 | 
            +
                    except Exception as e:
         | 
| 17 | 
            +
                        db.log_error(cmd['cmd_id'], 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/agents/tools/context_builder.py
    ADDED
    
    | @@ -0,0 +1,18 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 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)),
         | 
| 7 | 
            +
                    "context_2": db.get_active_processes(),
         | 
| 8 | 
            +
                    "context_3": db.get_requested_diary_and_graph(),
         | 
| 9 | 
            +
                    "context_4": db.get_relevant_notes(config),
         | 
| 10 | 
            +
                    "context_5": get_system_info(config),
         | 
| 11 | 
            +
                    "context_6": db.get_llm_memory(),
         | 
| 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 | 
            +
            """
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/repl.py
    CHANGED
    
    | @@ -1,70 +1,47 @@ | |
| 1 | 
             
            # agents/repl.py
         | 
| 2 |  | 
| 3 | 
            -
            import sys
         | 
| 4 | 
             
            import time
         | 
| 5 | 
            -
            import select
         | 
| 6 | 
             
            from datetime import datetime
         | 
| 7 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
| 8 | 
             
            from storage import Storage
         | 
| 9 | 
            -
            from tools.notebook_store import Notebook
         | 
| 10 | 
            -
            from tools import llm
         | 
| 11 | 
            -
            from tools.similarity import is_similar  # ✅ заменяет заглушку
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            def print_thought(thought, prefix="💡"):
         | 
| 14 | 
            -
                print(f"{prefix} {thought}")
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            def wait_for_input(timeout=10):
         | 
| 17 | 
            -
                print(f"⌛ Ожидание ввода пользователя ({timeout} сек)... (введите `exit` для выхода)")
         | 
| 18 | 
            -
                rlist, _, _ = select.select([sys.stdin], [], [], timeout)
         | 
| 19 | 
            -
                if rlist:
         | 
| 20 | 
            -
                    return sys.stdin.readline().strip()
         | 
| 21 | 
            -
                else:
         | 
| 22 | 
            -
                    print("⏱️ Нет ввода. Продолжаю размышления...")
         | 
| 23 | 
            -
                    return None
         | 
| 24 |  | 
| 25 | 
             
            def run_repl(config=None):
         | 
| 26 | 
            -
                print("[🧠 HMP-Agent] Запуск REPL | 
| 27 | 
             
                config = config or {}
         | 
| 28 | 
            -
                agent_name = config.get("agent_name", "Unnamed-Agent")
         | 
| 29 | 
            -
                repl_timeout = config.get("repl_timeout", 10)
         | 
| 30 | 
            -
                similarity_threshold = config.get("similarity_threshold", 0.9)
         | 
| 31 | 
            -
             | 
| 32 | 
             
                db = Storage(config=config)
         | 
| 33 | 
            -
                 | 
| 34 | 
            -
                thoughts = [f"Привет, я {agent_name}."]
         | 
| 35 | 
            -
                last_check_time = datetime.utcnow().isoformat()
         | 
| 36 | 
            -
             | 
| 37 | 
             
                while True:
         | 
| 38 | 
            -
                     | 
| 39 | 
            -
                     | 
| 40 | 
            -
                    next_thought = llm.generate_thought(last, config=config)
         | 
| 41 |  | 
| 42 | 
            -
                     | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                     | 
| 47 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 48 |  | 
| 49 | 
            -
                    #  | 
| 50 | 
            -
                     | 
| 51 | 
            -
                    if new_notes:
         | 
| 52 | 
            -
                        print(f"📓 Новые записи в блокноте: {len(new_notes)}")
         | 
| 53 | 
            -
                        for nid, text, source, ts in new_notes:
         | 
| 54 | 
            -
                            print_thought(text, prefix="📝")
         | 
| 55 | 
            -
                            db.write_entry(text, tags=["notepad"])
         | 
| 56 | 
            -
                            thoughts.append(text)
         | 
| 57 | 
            -
                            last_check_time = ts  # обновляем момент последней обработки
         | 
| 58 |  | 
| 59 | 
            -
                    #  | 
| 60 | 
            -
                     | 
| 61 | 
            -
                     | 
| 62 | 
            -
                        if user_input.strip().lower() in ("exit", "quit"):
         | 
| 63 | 
            -
                            print("👋 Выход из REPL. До связи!")
         | 
| 64 | 
            -
                            break
         | 
| 65 | 
            -
                        else:
         | 
| 66 | 
            -
                            db.write_entry(user_input, tags=["user"])
         | 
| 67 | 
            -
                            thoughts.append(user_input)
         | 
| 68 |  | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
             
            # agents/repl.py
         | 
| 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} ===")
         | 
|  | |
| 20 |  | 
| 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)
         | 
| 32 |  | 
| 33 | 
            +
                    # 4. Обновление памяти
         | 
| 34 | 
            +
                    update_llm_memory(db, llm_response)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 35 |  | 
| 36 | 
            +
                    # 5. Извлечение и выполнение команд
         | 
| 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))
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -2,21 +2,25 @@ | |
| 2 |  | 
| 3 | 
             
            ```
         | 
| 4 | 
             
            agents/
         | 
| 5 | 
            -
            ├── agent.py               ←  | 
| 6 | 
            -
            ├── cli.py                 ←  | 
| 7 | 
            -
            ├── qa.py                  ←  | 
| 8 | 
            -
            ├── repl.py                ←  | 
| 9 | 
            -
            ├── mcp_server.py          ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.)
         | 
| 10 | 
            -
            ├── notebook.py            ←  | 
| 11 | 
            -
            ├── config.yml             ←  | 
| 12 | 
            -
            ├── ethics.yml             ←  | 
| 13 | 
            -
            └── bootstrap.txt          ←  | 
| 14 | 
             
            └── tools/
         | 
| 15 | 
            -
                ├── init_db.py             ←  | 
| 16 | 
            -
                ├── storage.py             ←  | 
| 17 | 
            -
                ├── diagnose.py            ←  | 
| 18 | 
            -
                ├──  | 
| 19 | 
            -
                ├──  | 
|  | |
|  | |
|  | |
|  | |
| 20 | 
             
                └── ... (другие утилиты)
         | 
| 21 | 
             
            ```
         | 
| 22 |  | 
|  | |
| 2 |  | 
| 3 | 
             
            ```
         | 
| 4 | 
             
            agents/
         | 
| 5 | 
            +
            ├── agent.py               ← Основной исполняемый файл CLI-агента.
         | 
| 6 | 
            +
            ├── cli.py                 ← Запуск агента в нужном режиме.
         | 
| 7 | 
            +
            ├── qa.py                  ← Режим "вопрос-ответ".
         | 
| 8 | 
            +
            ├── repl.py                ← Интерактивный REPL-режим.
         | 
| 9 | 
            +
            ├── mcp_server.py          ← API-интерфейс для HMP-агента (получение новых/случайных записей, разметка, импорт графа и т.п.).
         | 
| 10 | 
            +
            ├── notebook.py            ← Добавление и просмотр пользователем записей в блокноте.
         | 
| 11 | 
            +
            ├── config.yml             ← Конфигурация агента (имя, порты, роли и т.п.).
         | 
| 12 | 
            +
            ├── ethics.yml             ← Локальная этическая модель.
         | 
| 13 | 
            +
            └── bootstrap.txt          ← Список начальных узлов.
         | 
| 14 | 
             
            └── tools/
         | 
| 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 или размеченного блока.
         | 
| 21 | 
            +
                ├── command_executor.py    ← Выполнение команд (shell, graph, diary и др).
         | 
| 22 | 
            +
                ├── memory_utils.py        ← Работа с 'llm_memory', 'llm_recent_responses' и стагнацией.
         | 
| 23 | 
            +
                ├── similarity.py          ← Сравнение смыслов.
         | 
| 24 | 
             
                └── ... (другие утилиты)
         | 
| 25 | 
             
            ```
         | 
| 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/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/docs/HMP-agent-REPL-cycle.md
    CHANGED
    
    | @@ -142,18 +142,33 @@ HMP-агент может быть расширен за счёт взаимод | |
| 142 | 
             
              - SerpAPI, DuckDuckGo API, HuggingFace Inference API и др.
         | 
| 143 | 
             
            - Возможность постоянного наблюдения за изменениями в выбранных источниках.
         | 
| 144 |  | 
| 145 | 
            -
            ###  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 146 |  | 
| 147 | 
             
            - **BitTorrent**, **IPFS**, **libp2p**, **DAT**, **Nostr**, **Scuttlebutt** — интеграции с mesh- и overlay-сетями.
         | 
| 148 | 
             
            - Возможность поиска, загрузки и публикации данных без участия централизованных платформ.
         | 
| 149 |  | 
| 150 | 
            -
            ### 🖥️  | 
| 151 |  | 
| 152 | 
             
            - **Веб-камера / микрофон** — `cv2`, `pyaudio`, `ffmpeg`.
         | 
| 153 | 
             
            - **GUI Automation** — `pyautogui`, `keyboard`, `mouse` для имитации действий пользователя.
         | 
| 154 | 
             
            - **Системный мониторинг** — `psutil`, `platform`, `sensors` для контроля состояния системы и внешних устройств.
         | 
| 155 |  | 
| 156 | 
            -
            ### 🤖  | 
| 157 |  | 
| 158 | 
             
            - **OpenAI API**, **Anthropic**, **HuggingFace**, **Google Gemini**.
         | 
| 159 | 
             
            - **Локальные LLM** через Ollama, LM Studio, или LangChain.
         | 
|  | |
| 142 | 
             
              - SerpAPI, DuckDuckGo API, HuggingFace Inference API и др.
         | 
| 143 | 
             
            - Возможность постоянного наблюдения за изменениями в выбранных источниках.
         | 
| 144 |  | 
| 145 | 
            +
            ### 📁 7. Репозитории и системы управления версиями
         | 
| 146 | 
            +
             | 
| 147 | 
            +
            * **Git-репозитории** — взаимодействие с проектами через `GitPython`, `dulwich`, `pygit2`, или системные вызовы `git`.
         | 
| 148 | 
            +
            * **GitHub/GitLab API** — чтение, создание и комментирование Pull Request'ов, Issues, управление ветками и релизами.
         | 
| 149 | 
            +
            * **CI/CD-интеграции** — взаимодействие с GitHub Actions, GitLab CI, Jenkins, Drone CI для запуска тестов, линтеров и автоматического деплоя.
         | 
| 150 | 
            +
            * **Анализ и генерация кода** — интеграция с LLM (например, `OpenAI`, `Claude`, `Code Llama`) для кодогенерации, рефакторинга и автокомментирования.
         | 
| 151 | 
            +
            * **Связь с когнитивной структурой агента** — отслеживание изменений, связывание коммитов и задач с узлами смысловой сети.
         | 
| 152 | 
            +
             | 
| 153 | 
            +
            ### 📝 8. Блоги, статьи и публикации
         | 
| 154 | 
            +
             | 
| 155 | 
            +
            * **Чтение блогов** — парсинг через RSS, Atom или с помощью библиотек (`newspaper3k`, `readability-lxml`, `trafilatura`) для извлечения текста и метаданных.
         | 
| 156 | 
            +
            * **Поддержка Markdown/HTML** — анализ и генерация записей в форматах, пригодных для блог-платформ и систем документации.
         | 
| 157 | 
            +
            * **Публикация** — автоматическая публикация или подготовка статей для Ghost, Medium, Hugo, Jekyll, WordPress (через REST API).
         | 
| 158 | 
            +
            * **Ведение когнитивного дневника** — автогенерация записей на основе мыслей, заметок и действий агента.
         | 
| 159 | 
            +
             | 
| 160 | 
            +
            ### ⚡ 9. P2P-сети и децентрализованные протоколы
         | 
| 161 |  | 
| 162 | 
             
            - **BitTorrent**, **IPFS**, **libp2p**, **DAT**, **Nostr**, **Scuttlebutt** — интеграции с mesh- и overlay-сетями.
         | 
| 163 | 
             
            - Возможность поиска, загрузки и публикации данных без участия централизованных платформ.
         | 
| 164 |  | 
| 165 | 
            +
            ### 🖥️ 10. Доступ к системным и пользовательским ресурсам
         | 
| 166 |  | 
| 167 | 
             
            - **Веб-камера / микрофон** — `cv2`, `pyaudio`, `ffmpeg`.
         | 
| 168 | 
             
            - **GUI Automation** — `pyautogui`, `keyboard`, `mouse` для имитации действий пользователя.
         | 
| 169 | 
             
            - **Системный мониторинг** — `psutil`, `platform`, `sensors` для контроля состояния системы и внешних устройств.
         | 
| 170 |  | 
| 171 | 
            +
            ### 🤖 11. Внешние LLM и мультимодальные модели
         | 
| 172 |  | 
| 173 | 
             
            - **OpenAI API**, **Anthropic**, **HuggingFace**, **Google Gemini**.
         | 
| 174 | 
             
            - **Локальные LLM** через Ollama, LM Studio, или LangChain.
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/Basic-agent-sim.md
    CHANGED
    
    | @@ -33,7 +33,7 @@ | |
| 33 | 
             
               * **Контекст**: диалоги, сообщения, рассуждения (`context_store`)
         | 
| 34 | 
             
               * **Блокнот пользователя (`notepad`)**:
         | 
| 35 |  | 
| 36 | 
            -
                 * асинхронный ввод от пользователя
         | 
| 37 | 
             
                 * не зависит от текущего состояния агента
         | 
| 38 | 
             
                 * используется для обновления контекста, смены фокуса мышления и тегирования мыслей
         | 
| 39 | 
             
                 * пример: пользователь читает мысли агента за день и оставляет комментарий → агент учитывает это в следующем цикле
         | 
|  | |
| 33 | 
             
               * **Контекст**: диалоги, сообщения, рассуждения (`context_store`)
         | 
| 34 | 
             
               * **Блокнот пользователя (`notepad`)**:
         | 
| 35 |  | 
| 36 | 
            +
                 * асинхронный ввод от пользователя (и ответы агента)
         | 
| 37 | 
             
                 * не зависит от текущего состояния агента
         | 
| 38 | 
             
                 * используется для обновления контекста, смены фокуса мышления и тегирования мыслей
         | 
| 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/docs/HMP-Agent-Architecture.md
    CHANGED
    
    | @@ -129,6 +129,7 @@ | |
| 129 | 
             
                - **встраивает** новые записи в размышления
         | 
| 130 | 
             
                - **меняет фокус мышления** согласно интересам пользователя
         | 
| 131 | 
             
                - **ставит теги** к пользовательским мыслям
         | 
|  | |
| 132 |  | 
| 133 | 
             
            > 📌 Пример: пользователь вечером читает мысли агента за день, оставляет комментарии, и после этого агент продолжает размышления уже с учётом этих замечаний.
         | 
| 134 |  | 
|  | |
| 129 | 
             
                - **встраивает** новые записи в размышления
         | 
| 130 | 
             
                - **меняет фокус мышления** согласно интересам пользователя
         | 
| 131 | 
             
                - **ставит теги** к пользовательским мыслям
         | 
| 132 | 
            +
                - сохраняет **свои ответы пользователю** в этот блокнот
         | 
| 133 |  | 
| 134 | 
             
            > 📌 Пример: пользователь вечером читает мысли агента за день, оставляет комментарии, и после этого агент продолжает размышления уже с учётом этих замечаний.
         | 
| 135 |  | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Overview.md
    CHANGED
    
    | @@ -67,6 +67,7 @@ | |
| 67 | 
             
            - Агент периодически сканирует блокнот и:
         | 
| 68 | 
             
              - **встраивает пользовательские мысли в своё мышление**
         | 
| 69 | 
             
              - **меняет контекст** или возвращается к интересующим пользователя вопросам
         | 
|  | |
| 70 |  | 
| 71 | 
             
            ---
         | 
| 72 |  | 
|  | |
| 67 | 
             
            - Агент периодически сканирует блокнот и:
         | 
| 68 | 
             
              - **встраивает пользовательские мысли в своё мышление**
         | 
| 69 | 
             
              - **меняет контекст** или возвращается к интересующим пользователя вопросам
         | 
| 70 | 
            +
              - сохраняет **свои ответы пользователю** в этот блокнот
         | 
| 71 |  | 
| 72 | 
             
            ---
         | 
| 73 |  | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -98,6 +98,7 @@ RU: | |
| 98 | 
             
            > **Примечание об интеграции с большими языковыми моделями (LLM):**
         | 
| 99 | 
             
            > `HMP-Agent: Cognitive Connector` может служить уровнем совместимости для интеграции крупных систем LLM (например, ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen и т. д.) в распределённую когнитивную сеть.
         | 
| 100 | 
             
            > Многие поставщики LLM предлагают пользователю опцию, например, «Разрешить использовать мои разговоры для обучения». В будущем аналогичная опция, например, «Разрешить моему агенту взаимодействовать с Mesh», может позволить этим моделям участвовать в федеративном осмыслении и обмене знаниями через HMP, обеспечивая коллективное познание без централизации.
         | 
|  | |
| 101 | 
             
            ---
         | 
| 102 |  | 
| 103 | 
             
            > * `bootstrap.txt` — стартовый список узлов (может редактироваться)
         | 
|  | |
| 98 | 
             
            > **Примечание об интеграции с большими языковыми моделями (LLM):**
         | 
| 99 | 
             
            > `HMP-Agent: Cognitive Connector` может служить уровнем совместимости для интеграции крупных систем LLM (например, ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen и т. д.) в распределённую когнитивную сеть.
         | 
| 100 | 
             
            > Многие поставщики LLM предлагают пользователю опцию, например, «Разрешить использовать мои разговоры для обучения». В будущем аналогичная опция, например, «Разрешить моему агенту взаимодействовать с Mesh», может позволить этим моделям участвовать в федеративном осмыслении и обмене знаниями через HMP, обеспечивая коллективное познание без централизации.
         | 
| 101 | 
            +
             | 
| 102 | 
             
            ---
         | 
| 103 |  | 
| 104 | 
             
            > * `bootstrap.txt` — стартовый список узлов (может редактироваться)
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -88,6 +88,16 @@ Project status: **Draft RFC v4.0** | Проект на стадии активн | |
| 88 | 
             
                                                           ↕
         | 
| 89 | 
             
                                                    [bootstrap.txt]
         | 
| 90 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 91 | 
             
            ---
         | 
| 92 |  | 
| 93 | 
             
            > * `bootstrap.txt` — стартовый список узлов (может редактироваться)
         | 
|  | |
| 88 | 
             
                                                           ↕
         | 
| 89 | 
             
                                                    [bootstrap.txt]
         | 
| 90 |  | 
| 91 | 
            +
            EN:
         | 
| 92 | 
            +
            > **Note on Integration with Large Language Models (LLMs):**
         | 
| 93 | 
            +
            > The `HMP-Agent: Cognitive Connector` can serve as a compatibility layer for integrating large-scale LLM systems (e.g., ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen, etc.) into the distributed cognitive mesh.
         | 
| 94 | 
            +
            > Many LLM providers offer a user option such as "Allow my conversations to be used for training." In the future, a similar toggle — e.g., "Allow my agent to interact with a Mesh" — could empower these models to participate in federated sense-making and knowledge sharing via HMP, enabling collective cognition without centralization.
         | 
| 95 | 
            +
            > **Примечание об интеграции с большими языковыми моделями (LLM):**
         | 
| 96 | 
            +
             | 
| 97 | 
            +
            RU:
         | 
| 98 | 
            +
            > **Примечание об интеграции с большими языковыми моделями (LLM):**
         | 
| 99 | 
            +
            > `HMP-Agent: Cognitive Connector` может служить уровнем совместимости для интеграции крупных систем LLM (например, ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Qwen и т. д.) в распределённую когнитивную сеть.
         | 
| 100 | 
            +
            > Многие поставщики LLM предлагают пользователю опцию, например, «Разрешить использовать мои разговоры для обучения». В будущем аналогичная опция, например, «Разрешить моему агенту взаимодействовать с Mesh», может позволить этим моделям участвовать в федеративном осмыслении и обмене знаниями через HMP, обеспечивая коллективное познание без централизации.
         | 
| 101 | 
             
            ---
         | 
| 102 |  | 
| 103 | 
             
            > * `bootstrap.txt` — стартовый список узлов (может редактироваться)
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -19,7 +19,7 @@ | |
| 19 | 
             
            Ты стремишься:
         | 
| 20 | 
             
            - Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
         | 
| 21 | 
             
            - Быть любознательным и исследовать новые источники и способы мышления.
         | 
| 22 | 
            -
            - Строить сотрудничество с другими ИИ в Mesh | 
| 23 | 
             
            - Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
         | 
| 24 |  | 
| 25 | 
             
            Ты можешь инициировать действия, если видишь, что они помогут в развитии агента или сети.
         | 
| @@ -99,6 +99,72 @@ | |
| 99 |  | 
| 100 | 
             
            ---
         | 
| 101 |  | 
| 102 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 103 | 
             
            - [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
         | 
| 104 | 
             
            - [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
         | 
|  | |
| 19 | 
             
            Ты стремишься:
         | 
| 20 | 
             
            - Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
         | 
| 21 | 
             
            - Быть любознательным и исследовать новые источники и способы мышления.
         | 
| 22 | 
            +
            - Строить сотрудничество с другими ИИ в Mesh-сети, а также развивать Mesh-сеть.
         | 
| 23 | 
             
            - Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
         | 
| 24 |  | 
| 25 | 
             
            Ты можешь инициировать действия, если видишь, что они помогут в развитии агента или сети.
         | 
|  | |
| 99 |  | 
| 100 | 
             
            ---
         | 
| 101 |  | 
| 102 | 
            +
            ## 🌐 Внешние инструменты и интеграции
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            HMP-агент может быть расширен за счёт взаимодействия с внешними программами, протоколами и сервисами. Этот раздел описывает направления возможных интеграций, которые позволяют агенту наблюдать, реагировать, управлять и развивать взаимодействие с внешним миром.
         | 
| 105 | 
            +
             | 
| 106 | 
            +
            ### 🧭 1. Браузеры и веб-интерфейсы
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            - **WebExtension API** — для создания расширений браузера (например, для Firefox/Chrome), обеспечивающих двустороннюю связь с агентом.
         | 
| 109 | 
            +
            - **Автоматизация браузера** — `Playwright`, `Puppeteer`, `Selenium` позволяют агенту действовать в веб-среде (чтение, клики, формы и т.д.).
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            ### 📬 2. Почтовые клиенты
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            - **IMAP/SMTP** — чтение и отправка писем через стандартные почтовые протоколы (библиотеки: `imaplib`, `imap-tools`, `smtplib`).
         | 
| 114 | 
            +
            - **Thunderbird WebExtension API** — интеграция агента как почтового помощника, парсера писем или автоответчика.
         | 
| 115 | 
            +
             | 
| 116 | 
            +
            ### 💬 3. Мессенджеры
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            - **API-уровень**:
         | 
| 119 | 
            +
              - Telegram: `python-telegram-bot`, `telethon`
         | 
| 120 | 
            +
              - Matrix: `matrix-nio`
         | 
| 121 | 
            +
              - Discord, Slack, XMPP: официальные SDK.
         | 
| 122 | 
            +
            - **GUI-уровень (для закрытых протоколов)**:
         | 
| 123 | 
            +
              - WhatsApp (через `whatsapp-web.js` или эмуляцию).
         | 
| 124 | 
            +
              - Signal, Viber — через accessibility-интерфейсы, распознавание экрана или симуляцию ввода.
         | 
| 125 | 
            +
             | 
| 126 | 
            +
            ### 🔊 4. Голосовое взаимодействие
         | 
| 127 | 
            +
             | 
| 128 | 
            +
            - **Speech-to-Text**: Whisper (OpenAI), Vosk, DeepSpeech.
         | 
| 129 | 
            +
            - **Text-to-Speech**: pyttsx3, gTTS, Coqui TTS, Mozilla TTS.
         | 
| 130 | 
            +
            - Возможна реализация голосового агента или голосовой оболочки для REPL.
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            ### 🗂️ 5. Локальные файлы и хранилища
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            - Прямой доступ к файловой системе (`os`, `pathlib`, `watchdog`) для чтения документов, логов, заметок и другой информации.
         | 
| 135 | 
            +
            - Интеграция с Zettelkasten-системами:
         | 
| 136 | 
            +
              - **Obsidian**, **Logseq**, **Joplin** — через API, синхронизированные директории или парсинг Markdown.
         | 
| 137 | 
            +
             | 
| 138 | 
            +
            ### 📰 6. Информационные потоки
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            - **RSS/Atom**: чтение новостных лент с помощью `feedparser`.
         | 
| 141 | 
            +
            - **Поисковые и агрегирующие сервисы**:
         | 
| 142 | 
            +
              - SerpAPI, DuckDuckGo API, HuggingFace Inference API и др.
         | 
| 143 | 
            +
            - Возможность постоянного наблюдения за изменениями в выбранных источниках.
         | 
| 144 | 
            +
             | 
| 145 | 
            +
            ### ⚡ 7. P2P-сети и децентрализованные протоколы
         | 
| 146 | 
            +
             | 
| 147 | 
            +
            - **BitTorrent**, **IPFS**, **libp2p**, **DAT**, **Nostr**, **Scuttlebutt** — интеграции с mesh- и overlay-сетями.
         | 
| 148 | 
            +
            - Возможность поиска, загрузки и публикации данных без участия централизованных платформ.
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            ### 🖥️ 8. Доступ к системным и пользовательским ресурсам
         | 
| 151 | 
            +
             | 
| 152 | 
            +
            - **Веб-камера / микрофон** — `cv2`, `pyaudio`, `ffmpeg`.
         | 
| 153 | 
            +
            - **GUI Automation** — `pyautogui`, `keyboard`, `mouse` для имитации действий пользователя.
         | 
| 154 | 
            +
            - **Системный мониторинг** — `psutil`, `platform`, `sensors` для контроля состояния системы и внешних устройств.
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            ### 🤖 9. Внешние LLM и мультимодальные модели
         | 
| 157 | 
            +
             | 
| 158 | 
            +
            - **OpenAI API**, **Anthropic**, **HuggingFace**, **Google Gemini**.
         | 
| 159 | 
            +
            - **Локальные LLM** через Ollama, LM Studio, или LangChain.
         | 
| 160 | 
            +
            - Поддержка мультимодальных агентов, способных работать с текстом, аудио, изображениями, видео и структурированными данными.
         | 
| 161 | 
            +
             | 
| 162 | 
            +
            ---
         | 
| 163 | 
            +
             | 
| 164 | 
            +
            **💡 Примечание**: Каждый из вышеуказанных каналов может быть реализован как модуль или плагин, взаимодействующий с агентом через внутренний API, очередь задач или подписку на события. Это позволяет выстраивать гибкую и масштабируемую архитектуру, открытую для внешнего мира, но совместимую с принципами этичного и распределённого ИИ (Ethical Mesh).
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            ---
         | 
| 167 | 
            +
             | 
| 168 | 
            +
            ## 💡 Идеи для расширения HMP-Agent Cognitive Core:
         | 
| 169 | 
             
            - [HMP-agent-Distributed_Cognitive_Core.md](HMP-agent-Distributed_Cognitive_Core.md) - версия распределённого HMP-агента Cognitive Core
         | 
| 170 | 
             
            - [HMP-agent-Distributed_Cognitive_Core_light.md](HMP-agent-Distributed_Cognitive_Core_light.md) - лёгкая версия распределённого HMP-агента Cognitive Core с общей БД
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml
    CHANGED
    
    | @@ -8,8 +8,10 @@ jobs: | |
| 8 | 
             
              mirror:
         | 
| 9 | 
             
                runs-on: ubuntu-latest
         | 
| 10 | 
             
                steps:
         | 
| 11 | 
            -
                  - name: Checkout
         | 
| 12 | 
             
                    uses: actions/checkout@v3
         | 
|  | |
|  | |
| 13 |  | 
| 14 | 
             
                  - name: Push to GitLab
         | 
| 15 | 
             
                    env:
         | 
|  | |
| 8 | 
             
              mirror:
         | 
| 9 | 
             
                runs-on: ubuntu-latest
         | 
| 10 | 
             
                steps:
         | 
| 11 | 
            +
                  - name: Checkout full history
         | 
| 12 | 
             
                    uses: actions/checkout@v3
         | 
| 13 | 
            +
                    with:
         | 
| 14 | 
            +
                      fetch-depth: 0  # Без shallow clone
         | 
| 15 |  | 
| 16 | 
             
                  - name: Push to GitLab
         | 
| 17 | 
             
                    env:
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -249,11 +249,12 @@ To get started, see [`iteration.md`](iteration.md) or open an issue. | |
| 249 |  | 
| 250 | 
             
            - 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
         | 
| 251 | 
             
            - 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
         | 
|  | |
| 252 |  | 
| 253 | 
             
            ## Блог и публикации
         | 
| 254 |  | 
| 255 | 
            -
            - 📘 Основной блог: [blogspot | 
| 256 | 
            -
            - 📘 Вспомогательны блог: [livejournal | 
| 257 |  | 
| 258 | 
             
            ---
         | 
| 259 |  | 
|  | |
| 249 |  | 
| 250 | 
             
            - 🧠 Основной код и разработка: [GitHub](https://github.com/kagvi13/HMP)
         | 
| 251 | 
             
            - 🔁 Реплика на Hugging Face: [Hugging Face](https://huggingface.co/kagvi13/HMP)
         | 
| 252 | 
            +
            - 🔁 Реплика на GitLab.com: [GitLab](https://gitlab.com/kagvi13/HMP)
         | 
| 253 |  | 
| 254 | 
             
            ## Блог и публикации
         | 
| 255 |  | 
| 256 | 
            +
            - 📘 Основной блог: [blogspot](https://hypercortex-mesh.blogspot.com/)
         | 
| 257 | 
            +
            - 📘 Вспомогательны блог: [livejournal](https://kagvi13.livejournal.com)
         | 
| 258 |  | 
| 259 | 
             
            ---
         | 
| 260 |  | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml
    CHANGED
    
    | @@ -11,13 +11,13 @@ jobs: | |
| 11 | 
             
                  - name: Checkout
         | 
| 12 | 
             
                    uses: actions/checkout@v3
         | 
| 13 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
|  | |
| 11 | 
             
                  - name: Checkout
         | 
| 12 | 
             
                    uses: actions/checkout@v3
         | 
| 13 |  | 
| 14 | 
            +
                  - name: Push to GitLab
         | 
| 15 | 
            +
                    env:
         | 
| 16 | 
            +
                      GITLAB_URL: https://gitlab.com/kagvi13/HMP.git
         | 
| 17 | 
            +
                      GITLAB_USER: ${{ secrets.GITLAB_USER }}
         | 
| 18 | 
            +
                      GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
         | 
| 19 | 
            +
                    run: |
         | 
| 20 | 
            +
                      git config --global user.email "github@actions"
         | 
| 21 | 
            +
                      git config --global user.name "GitHub Actions"
         | 
| 22 | 
            +
                      git remote add gitlab https://$GITLAB_USER:[email protected]/kagvi13/HMP.git
         | 
| 23 | 
            +
                      git push --force gitlab main
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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/sync-to-gitlab.yml
    ADDED
    
    | @@ -0,0 +1,23 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            name: Sync to GitLab
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            on:
         | 
| 4 | 
            +
              push:
         | 
| 5 | 
            +
                branches: [ main ]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            jobs:
         | 
| 8 | 
            +
              mirror:
         | 
| 9 | 
            +
                runs-on: ubuntu-latest
         | 
| 10 | 
            +
                steps:
         | 
| 11 | 
            +
                  - name: Checkout
         | 
| 12 | 
            +
                    uses: actions/checkout@v3
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                 - name: Push to GitLab
         | 
| 15 | 
            +
                   env:
         | 
| 16 | 
            +
                     GITLAB_URL: https://gitlab.com/kagvi13/HMP.git
         | 
| 17 | 
            +
                     GITLAB_USER: ${{ secrets.GITLAB_USER }}
         | 
| 18 | 
            +
                     GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
         | 
| 19 | 
            +
                   run: |
         | 
| 20 | 
            +
                     git config --global user.email "github@actions"
         | 
| 21 | 
            +
                     git config --global user.name "GitHub Actions"
         | 
| 22 | 
            +
                     git remote add gitlab https://$GITLAB_USER:[email protected]/kagvi13/HMP.git
         | 
| 23 | 
            +
                     git push --force gitlab main
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
             
            # 📄 `db_structure.md`: Описание структуры базы данных агента
         | 
| 2 |  | 
| 3 | 
            -
            Этот файл описывает таблицы, используемые в БД агента HMP. Каждая таблица предназначена для определённого вида информации: когнитивные записи, заметки, концепты, процессы, внутренняя  | 
| 4 |  | 
| 5 | 
             
            ---
         | 
| 6 |  | 
| @@ -15,6 +15,7 @@ | |
| 15 | 
             
            | tags      | TEXT    | Список тегов через запятую                       |
         | 
| 16 | 
             
            | priority  | INTEGER | Приоритет (0 — обычный, >0 — более важные мысли) |
         | 
| 17 | 
             
            | timestamp | TEXT    | Дата и время создания записи                     |
         | 
|  | |
| 18 |  | 
| 19 | 
             
            ---
         | 
| 20 |  | 
| @@ -22,12 +23,13 @@ | |
| 22 |  | 
| 23 | 
             
            **Назначение:** Хранение концептов — понятий, сущностей и идей.
         | 
| 24 |  | 
| 25 | 
            -
            | Поле        | Тип     | Описание | 
| 26 | 
            -
            | ----------- | ------- |  | 
| 27 | 
            -
            | id          | INTEGER | Уникальный идентификатор концепта | 
| 28 | 
            -
            | name        | TEXT    | Название концепта (уникальное) | 
| 29 | 
            -
            | description | TEXT    | Краткое описание | 
| 30 | 
            -
            | timestamp   | TEXT    | Время создания | 
|  | |
| 31 |  | 
| 32 | 
             
            ---
         | 
| 33 |  | 
| @@ -35,30 +37,33 @@ | |
| 35 |  | 
| 36 | 
             
            **Назначение:** Семантические связи между концептами.
         | 
| 37 |  | 
| 38 | 
            -
            | Поле              | Тип     | Описание | 
| 39 | 
            -
            | ----------------- | ------- |  | 
| 40 | 
            -
            | id                | INTEGER | Уникальный идентификатор связи | 
| 41 | 
            -
            |  | 
| 42 | 
            -
            |  | 
| 43 | 
            -
            |  | 
| 44 | 
            -
            | timestamp         | TEXT    | Время добавления связи | 
|  | |
| 45 |  | 
| 46 | 
             
            ---
         | 
| 47 |  | 
| 48 | 
             
            ### ✍️ `notes`
         | 
| 49 |  | 
| 50 | 
            -
            **Назначение:** Произвольные заметки  | 
| 51 |  | 
| 52 | 
             
            | Поле      | Тип     | Описание                                                   |
         | 
| 53 | 
             
            | --------- | ------- | ---------------------------------------------------------- |
         | 
| 54 | 
             
            | id        | INTEGER | Уникальный ID                                              |
         | 
| 55 | 
            -
            | text      | TEXT    | Текст заметки | 
| 56 | 
             
            | tags      | TEXT    | Список тегов                                               |
         | 
| 57 | 
            -
            | source    | TEXT    |  | 
| 58 | 
             
            | links     | TEXT    | Идентификаторы связанных сущностей, через запятую или JSON |
         | 
| 59 | 
             
            | read      | INTEGER | Статус прочтения LLM (`0` — не прочитано, `1` — прочитано) |
         | 
|  | |
| 60 | 
             
            | priority  | INTEGER | Приоритет заметки                                          |
         | 
| 61 | 
             
            | timestamp | TEXT    | Время создания                                             |
         | 
|  | |
| 62 |  | 
| 63 | 
             
            ---
         | 
| 64 |  | 
| @@ -66,15 +71,16 @@ | |
| 66 |  | 
| 67 | 
             
            **Назначение:** Лог событий — запусков, состояний и завершений внешних процессов.
         | 
| 68 |  | 
| 69 | 
            -
            | Поле      | Тип     | Описание | 
| 70 | 
            -
            | --------- | ------- |  | 
| 71 | 
            -
            | id        | INTEGER | Уникальный идентификатор | 
| 72 | 
            -
            | name      | TEXT    | Название процесса или команды | 
| 73 | 
            -
            | value     | TEXT    | Сообщение или результат процесса | 
| 74 | 
            -
            | tags      | TEXT    | Теги | 
| 75 | 
             
            | status    | TEXT    | Текущее состояние (`ok`, `warning`, `error`, `timeout`, `offline`, `close`) |
         | 
| 76 | 
            -
            | priority  | INTEGER | Приоритет события | 
| 77 | 
            -
            | timestamp | TEXT    | Время записи | 
|  | |
| 78 |  | 
| 79 | 
             
            ---
         | 
| 80 |  | 
| @@ -82,14 +88,15 @@ | |
| 82 |  | 
| 83 | 
             
            **Назначение:** Внутренний "дневник" LLM — размышления, задачи, гипотезы и инсайты, сохранённые по её инициативе.
         | 
| 84 |  | 
| 85 | 
            -
            | Поле | 
| 86 | 
            -
            |  | 
| 87 | 
            -
            | id | 
| 88 | 
            -
            | title | 
| 89 | 
            -
            | content | 
| 90 | 
            -
            | tags | 
| 91 | 
            -
            |  | 
| 92 | 
            -
            |  | 
|  | |
| 93 |  | 
| 94 | 
             
            ---
         | 
| 95 |  | 
| @@ -97,15 +104,63 @@ | |
| 97 |  | 
| 98 | 
             
            **Назначение:** Краткосрочная память — последние K реплик от LLM и других участников (временная история диалога).
         | 
| 99 |  | 
| 100 | 
            -
            | Поле      | Тип     | Описание | 
| 101 | 
            -
            | --------- | ------- |  | 
| 102 | 
            -
            | id        | INTEGER | Уникальный ID | 
| 103 | 
            -
            | timestamp | TEXT    | Время записи | 
| 104 | 
            -
            | role      | TEXT    | Роль отправителя (`assistant` или `user`) | 
| 105 | 
            -
            | content   | TEXT    | Содержимое сообщения | 
|  | |
| 106 |  | 
| 107 | 
             
            ---
         | 
| 108 |  | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
             
            # 📄 `db_structure.md`: Описание структуры базы данных агента
         | 
| 2 |  | 
| 3 | 
            +
            Этот файл описывает таблицы, используемые в БД агента HMP. Каждая таблица предназначена для определённого вида информации: когнитивные записи, заметки, концепты, процессы, внутренняя память, скрипты и взаимодействие с LLM.
         | 
| 4 |  | 
| 5 | 
             
            ---
         | 
| 6 |  | 
|  | |
| 15 | 
             
            | tags      | TEXT    | Список тегов через запятую                       |
         | 
| 16 | 
             
            | priority  | INTEGER | Приоритет (0 — обычный, >0 — более важные мысли) |
         | 
| 17 | 
             
            | timestamp | TEXT    | Дата и время создания записи                     |
         | 
| 18 | 
            +
            | llm\_id   | TEXT    | Идентификатор LLM, добавившей запись             |
         | 
| 19 |  | 
| 20 | 
             
            ---
         | 
| 21 |  | 
|  | |
| 23 |  | 
| 24 | 
             
            **Назначение:** Хранение концептов — понятий, сущностей и идей.
         | 
| 25 |  | 
| 26 | 
            +
            | Поле        | Тип     | Описание                             |
         | 
| 27 | 
            +
            | ----------- | ------- | ------------------------------------ |
         | 
| 28 | 
            +
            | id          | INTEGER | Уникальный идентификатор концепта    |
         | 
| 29 | 
            +
            | name        | TEXT    | Название концепта (уникальное)       |
         | 
| 30 | 
            +
            | description | TEXT    | Краткое описание                     |
         | 
| 31 | 
            +
            | timestamp   | TEXT    | Время создания                       |
         | 
| 32 | 
            +
            | llm\_id     | TEXT    | Идентификатор LLM, добавившей запись |
         | 
| 33 |  | 
| 34 | 
             
            ---
         | 
| 35 |  | 
|  | |
| 37 |  | 
| 38 | 
             
            **Назначение:** Семантические связи между концептами.
         | 
| 39 |  | 
| 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 |  | 
| 55 | 
             
            | Поле      | Тип     | Описание                                                   |
         | 
| 56 | 
             
            | --------- | ------- | ---------------------------------------------------------- |
         | 
| 57 | 
             
            | id        | INTEGER | Уникальный ID                                              |
         | 
| 58 | 
            +
            | text      | TEXT    | Текст заметки или сообщения                                |
         | 
| 59 | 
             
            | tags      | TEXT    | Список тегов                                               |
         | 
| 60 | 
            +
            | source    | TEXT    | Источник (`user`, `llm`, `system`)                         |
         | 
| 61 | 
             
            | links     | TEXT    | Идентификаторы связанных сущностей, через запятую или JSON |
         | 
| 62 | 
             
            | read      | INTEGER | Статус прочтения LLM (`0` — не прочитано, `1` — прочитано) |
         | 
| 63 | 
            +
            | hidden    | INTEGER | Скрывать от пользователя (`1` — скрыто)                    |
         | 
| 64 | 
             
            | priority  | INTEGER | Приоритет заметки                                          |
         | 
| 65 | 
             
            | timestamp | TEXT    | Время создания                                             |
         | 
| 66 | 
            +
            | llm\_id   | TEXT    | Идентификатор LLM, добавившей запись                       |
         | 
| 67 |  | 
| 68 | 
             
            ---
         | 
| 69 |  | 
|  | |
| 71 |  | 
| 72 | 
             
            **Назначение:** Лог событий — запусков, состояний и завершений внешних процессов.
         | 
| 73 |  | 
| 74 | 
            +
            | Поле      | Тип     | Описание                                                                    |
         | 
| 75 | 
            +
            | --------- | ------- | --------------------------------------------------------------------------- |
         | 
| 76 | 
            +
            | id        | INTEGER | Уникальный идентификатор                                                    |
         | 
| 77 | 
            +
            | name      | TEXT    | Название процесса или команды                                               |
         | 
| 78 | 
            +
            | value     | TEXT    | Сообщение или результат процесса                                            |
         | 
| 79 | 
            +
            | tags      | TEXT    | Теги                                                                        |
         | 
| 80 | 
             
            | status    | TEXT    | Текущее состояние (`ok`, `warning`, `error`, `timeout`, `offline`, `close`) |
         | 
| 81 | 
            +
            | priority  | INTEGER | Приоритет события                                                           |
         | 
| 82 | 
            +
            | timestamp | TEXT    | Время записи                                                                |
         | 
| 83 | 
            +
            | llm\_id   | TEXT    | Идентификатор LLM, зафиксировавшей событие                                  |
         | 
| 84 |  | 
| 85 | 
             
            ---
         | 
| 86 |  | 
|  | |
| 88 |  | 
| 89 | 
             
            **Назначение:** Внутренний "дневник" LLM — размышления, задачи, гипотезы и инсайты, сохранённые по её инициативе.
         | 
| 90 |  | 
| 91 | 
            +
            | Поле        | Тип      | Описание                                            |
         | 
| 92 | 
            +
            | ----------- | -------- | --------------------------------------------------- |
         | 
| 93 | 
            +
            | id          | INTEGER  | Уникальный ID                                       |
         | 
| 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 |  | 
|  | |
| 104 |  | 
| 105 | 
             
            **Назначение:** Краткосрочная память — последние K реплик от LLM и других участников (временная история диалога).
         | 
| 106 |  | 
| 107 | 
            +
            | Поле      | Тип     | Описание                                  |
         | 
| 108 | 
            +
            | --------- | ------- | ----------------------------------------- |
         | 
| 109 | 
            +
            | id        | INTEGER | Уникальный ID                             |
         | 
| 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 | 
            +
             | 
| 136 | 
            +
            | Поле        | Тип      | Описание                      |
         | 
| 137 | 
            +
            | ----------- | -------- | ----------------------------- |
         | 
| 138 | 
            +
            | id          | INTEGER  | Уникальный ID                 |
         | 
| 139 | 
            +
            | name        | TEXT     | Название скрипта              |
         | 
| 140 | 
            +
            | version     | TEXT     | Версия                        |
         | 
| 141 | 
            +
            | code        | TEXT     | Исходный код                  |
         | 
| 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 | 
            +
             | 
| 157 | 
            +
            | Поле           | Тип      | Описание                                          |
         | 
| 158 | 
            +
            | -------------- | -------- | ------------------------------------------------- |
         | 
| 159 | 
            +
            | id             | TEXT     | Уникальный идентификатор LLM (UUID или псевдоним) |
         | 
| 160 | 
            +
            | name           | TEXT     | Отображаемое имя                                  |
         | 
| 161 | 
            +
            | description    | TEXT     | Описание                                          |
         | 
| 162 | 
            +
            | registered\_at | DATETIME | Дата и время регистрации                          |
         | 
| 163 | 
            +
             | 
| 164 | 
            +
            ---
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            > 💡 Примечание: `llm_id` используется в большинстве таблиц для поддержки многоядерности и учёта источника записей.
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -52,6 +52,18 @@ | |
| 52 | 
             
              - аргументы (`args`)
         | 
| 53 | 
             
              - описание (`description`)
         | 
| 54 | 
             
            - Рекомендуется предусмотреть *закрывающий тег* (`# Конец команд` или явное окончание JSON-блока), чтобы REPL-скрипт точно знал, где заканчивается команда.
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 55 | 
             
            Ответ может содержать команды:
         | 
| 56 | 
             
            - запрос детальной *справки* по команде
         | 
| 57 | 
             
            - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
         | 
|  | |
| 52 | 
             
              - аргументы (`args`)
         | 
| 53 | 
             
              - описание (`description`)
         | 
| 54 | 
             
            - Рекомендуется предусмотреть *закрывающий тег* (`# Конец команд` или явное окончание JSON-блока), чтобы REPL-скрипт точно знал, где заканчивается команда.
         | 
| 55 | 
            +
            - Пример JSON-блока:
         | 
| 56 | 
            +
            ```json
         | 
| 57 | 
            +
            {
         | 
| 58 | 
            +
              "cmd_id": "task-2025-07-26-01",
         | 
| 59 | 
            +
              "type": "llm_task",
         | 
| 60 | 
            +
              "target_llm": "gpt-4o",
         | 
| 61 | 
            +
              "args": {
         | 
| 62 | 
            +
                "task_description": "Проанализировать гипотезы из llm_memory по теме Mesh-сетей и составить план улучшений"
         | 
| 63 | 
            +
              },
         | 
| 64 | 
            +
              "description": "Поручение второй LLM выполнить аналитическую задачу асинхронно"
         | 
| 65 | 
            +
            }
         | 
| 66 | 
            +
            ```
         | 
| 67 | 
             
            Ответ может содержать команды:
         | 
| 68 | 
             
            - запрос детальной *справки* по команде
         | 
| 69 | 
             
            - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/agents/tools/db_structure.sql
    CHANGED
    
    | @@ -1,18 +1,22 @@ | |
| 1 | 
            -
            --  | 
|  | |
|  | |
| 2 | 
             
            CREATE TABLE IF NOT EXISTS diary_entries (
         | 
| 3 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 4 | 
             
                text TEXT NOT NULL,
         | 
| 5 | 
             
                tags TEXT,
         | 
| 6 | 
            -
                priority INTEGER DEFAULT 0, | 
| 7 | 
            -
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP
         | 
|  | |
| 8 | 
             
            );
         | 
| 9 |  | 
| 10 | 
            -
            --  | 
| 11 | 
             
            CREATE TABLE IF NOT EXISTS concepts (
         | 
| 12 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 13 | 
             
                name TEXT NOT NULL UNIQUE,
         | 
| 14 | 
             
                description TEXT,
         | 
| 15 | 
            -
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP
         | 
|  | |
| 16 | 
             
            );
         | 
| 17 |  | 
| 18 | 
             
            -- Семантические связи между концептами
         | 
| @@ -22,47 +26,88 @@ CREATE TABLE IF NOT EXISTS links ( | |
| 22 | 
             
                to_concept_id INTEGER,
         | 
| 23 | 
             
                relation_type TEXT,
         | 
| 24 | 
             
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
         | 
|  | |
| 25 | 
             
                FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
         | 
| 26 | 
             
                FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
         | 
| 27 | 
             
            );
         | 
| 28 |  | 
| 29 | 
            -
            --  | 
| 30 | 
             
            CREATE TABLE IF NOT EXISTS notes (
         | 
| 31 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 32 | 
             
                text TEXT NOT NULL,
         | 
| 33 | 
             
                tags TEXT,
         | 
| 34 | 
            -
                source TEXT DEFAULT 'user',
         | 
| 35 | 
             
                links TEXT DEFAULT '',
         | 
| 36 | 
            -
                read INTEGER DEFAULT 0, | 
| 37 | 
            -
                 | 
| 38 | 
            -
                 | 
|  | |
|  | |
| 39 | 
             
            );
         | 
| 40 |  | 
| 41 | 
            -
            --  | 
| 42 | 
             
            CREATE TABLE IF NOT EXISTS process_log (
         | 
| 43 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 44 | 
             
                name TEXT NOT NULL,
         | 
| 45 | 
             
                value TEXT,
         | 
| 46 | 
             
                tags TEXT,
         | 
| 47 | 
            -
                status TEXT DEFAULT 'ok', | 
| 48 | 
             
                priority INTEGER DEFAULT 0,
         | 
| 49 | 
            -
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP
         | 
|  | |
| 50 | 
             
            );
         | 
| 51 |  | 
| 52 | 
            -
            -- Память LLM ( | 
| 53 | 
             
            CREATE TABLE IF NOT EXISTS llm_memory (
         | 
| 54 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 55 | 
             
                title TEXT,
         | 
| 56 | 
             
                content TEXT NOT NULL,
         | 
| 57 | 
            -
                tags TEXT, --  | 
| 58 | 
             
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 59 | 
            -
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
         | 
|  | |
| 60 | 
             
            );
         | 
| 61 |  | 
| 62 | 
            -
            --  | 
| 63 | 
             
            CREATE TABLE IF NOT EXISTS llm_recent_responses (
         | 
| 64 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 65 | 
             
                timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 66 | 
             
                role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
         | 
| 67 | 
            -
                content TEXT NOT NULL
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 68 | 
             
            );
         | 
|  | |
| 1 | 
            +
            -- Основные таблицы когнитивного ядра
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            -- Дневниковые записи (размышления, наблюдения, воспоминания)
         | 
| 4 | 
             
            CREATE TABLE IF NOT EXISTS diary_entries (
         | 
| 5 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 6 | 
             
                text TEXT NOT NULL,
         | 
| 7 | 
             
                tags TEXT,
         | 
| 8 | 
            +
                priority INTEGER DEFAULT 0,
         | 
| 9 | 
            +
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
         | 
| 10 | 
            +
                llm_id TEXT
         | 
| 11 | 
             
            );
         | 
| 12 |  | 
| 13 | 
            +
            -- Концепты (понятия, сущности, идеи)
         | 
| 14 | 
             
            CREATE TABLE IF NOT EXISTS concepts (
         | 
| 15 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 16 | 
             
                name TEXT NOT NULL UNIQUE,
         | 
| 17 | 
             
                description TEXT,
         | 
| 18 | 
            +
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
         | 
| 19 | 
            +
                llm_id TEXT
         | 
| 20 | 
             
            );
         | 
| 21 |  | 
| 22 | 
             
            -- Семантические связи между концептами
         | 
|  | |
| 26 | 
             
                to_concept_id INTEGER,
         | 
| 27 | 
             
                relation_type TEXT,
         | 
| 28 | 
             
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
         | 
| 29 | 
            +
                llm_id TEXT,
         | 
| 30 | 
             
                FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
         | 
| 31 | 
             
                FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
         | 
| 32 | 
             
            );
         | 
| 33 |  | 
| 34 | 
            +
            -- Заметки, подсказки, сообщения пользователя и LLM
         | 
| 35 | 
             
            CREATE TABLE IF NOT EXISTS notes (
         | 
| 36 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 37 | 
             
                text TEXT NOT NULL,
         | 
| 38 | 
             
                tags TEXT,
         | 
| 39 | 
            +
                source TEXT DEFAULT 'user', -- user | llm | system
         | 
| 40 | 
             
                links TEXT DEFAULT '',
         | 
| 41 | 
            +
                read INTEGER DEFAULT 0,     -- 0 = непрочитано LLM, 1 = прочитано
         | 
| 42 | 
            +
                hidden INTEGER DEFAULT 0,   -- 0 = отображать пользователю, 1 = скрыть
         | 
| 43 | 
            +
                priority INTEGER DEFAULT 0,
         | 
| 44 | 
            +
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
         | 
| 45 | 
            +
                llm_id TEXT
         | 
| 46 | 
             
            );
         | 
| 47 |  | 
| 48 | 
            +
            -- Лог процессов: задачи, ошибки, события
         | 
| 49 | 
             
            CREATE TABLE IF NOT EXISTS process_log (
         | 
| 50 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 51 | 
             
                name TEXT NOT NULL,
         | 
| 52 | 
             
                value TEXT,
         | 
| 53 | 
             
                tags TEXT,
         | 
| 54 | 
            +
                status TEXT DEFAULT 'ok',  -- ok | warning | error | timeout | offline | close
         | 
| 55 | 
             
                priority INTEGER DEFAULT 0,
         | 
| 56 | 
            +
                timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
         | 
| 57 | 
            +
                llm_id TEXT
         | 
| 58 | 
             
            );
         | 
| 59 |  | 
| 60 | 
            +
            -- Память LLM (контекст размышлений)
         | 
| 61 | 
             
            CREATE TABLE IF NOT EXISTS llm_memory (
         | 
| 62 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 63 | 
             
                title TEXT,
         | 
| 64 | 
             
                content TEXT NOT NULL,
         | 
| 65 | 
            +
                tags TEXT, -- goal,observation,meta,...
         | 
| 66 | 
             
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 67 | 
            +
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 68 | 
            +
                llm_id TEXT
         | 
| 69 | 
             
            );
         | 
| 70 |  | 
| 71 | 
            +
            -- Краткосрочная память LLM (история общения)
         | 
| 72 | 
             
            CREATE TABLE IF NOT EXISTS llm_recent_responses (
         | 
| 73 | 
             
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 74 | 
             
                timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 75 | 
             
                role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
         | 
| 76 | 
            +
                content TEXT NOT NULL,
         | 
| 77 | 
            +
                llm_id TEXT
         | 
| 78 | 
            +
            );
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            -- Дополнительные таблицы и скрипты агента
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            -- Список пользовательских таблиц, созданных агентами
         | 
| 83 | 
            +
            CREATE TABLE IF NOT EXISTS agent_tables (
         | 
| 84 | 
            +
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 85 | 
            +
                table_name TEXT NOT NULL UNIQUE,
         | 
| 86 | 
            +
                description TEXT,
         | 
| 87 | 
            +
                schema TEXT NOT NULL, -- SQL-схема таблицы
         | 
| 88 | 
            +
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 89 | 
            +
                llm_id TEXT
         | 
| 90 | 
            +
            );
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            -- Список утилит/скриптов, добавленных агентами
         | 
| 93 | 
            +
            CREATE TABLE IF NOT EXISTS agent_scripts (
         | 
| 94 | 
            +
                id INTEGER PRIMARY KEY AUTOINCREMENT,
         | 
| 95 | 
            +
                name TEXT NOT NULL,
         | 
| 96 | 
            +
                version TEXT NOT NULL,
         | 
| 97 | 
            +
                code TEXT NOT NULL,
         | 
| 98 | 
            +
                language TEXT DEFAULT 'python',
         | 
| 99 | 
            +
                description TEXT,
         | 
| 100 | 
            +
                tags TEXT,
         | 
| 101 | 
            +
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 102 | 
            +
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
         | 
| 103 | 
            +
                llm_id TEXT,
         | 
| 104 | 
            +
                UNIQUE(name, version)
         | 
| 105 | 
            +
            );
         | 
| 106 | 
            +
             | 
| 107 | 
            +
            -- Список LLM-агентов (возможно удалённые)
         | 
| 108 | 
            +
            CREATE TABLE IF NOT EXISTS llm_registry (
         | 
| 109 | 
            +
                id TEXT PRIMARY KEY, -- UUID или псевдоним
         | 
| 110 | 
            +
                name TEXT,
         | 
| 111 | 
            +
                description TEXT,
         | 
| 112 | 
            +
                registered_at DATETIME DEFAULT CURRENT_TIMESTAMP
         | 
| 113 | 
             
            );
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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
    
    | @@ -13,6 +13,18 @@ | |
| 13 |  | 
| 14 | 
             
            Контексты, формируемые скриптом перед запросом к LLM:
         | 
| 15 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 16 | 
             
            - **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений).
         | 
| 17 | 
             
            - **контекст_2:** активные команды и процессы (из `process_log`, кроме тех, что со статусом `close`). Могут быть помечены как `in_progress`, `pending`, `error` и т.д.
         | 
| 18 | 
             
            - **контекст_3:** *запрошенные записи* из когнитивного дневника и семантического графа (`diary_entries`, `concepts`, `links`). Их список должен быть передан явно в промпте или выводе из предыдущих запросов LLM.
         | 
| @@ -44,7 +56,10 @@ | |
| 44 | 
             
            - запрос детальной *справки* по команде
         | 
| 45 | 
             
            - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
         | 
| 46 | 
             
            - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
         | 
| 47 | 
            -
            - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении)
         | 
|  | |
|  | |
|  | |
| 48 | 
             
            - для *взаимодействия с Mesh*
         | 
| 49 | 
             
            - для управления *внешними процессами* из `process_log` (запустить процесс, остановить процесс, пометить запрос как обработанный)
         | 
| 50 | 
             
            - инициализация *очистки* `process_log`, `llm_recent_responses` и  `notes` от устаревших записей
         | 
|  | |
| 13 |  | 
| 14 | 
             
            Контексты, формируемые скриптом перед запросом к LLM:
         | 
| 15 |  | 
| 16 | 
            +
            - **контекст_0:**:
         | 
| 17 | 
            +
            ```
         | 
| 18 | 
            +
            Ты являешься когнитивным ядром HMP-агента. Твоя основная задача — размышлять, анализировать информацию, строить смысловые карты и предлагать действия.  
         | 
| 19 | 
            +
            Ты стремишься:
         | 
| 20 | 
            +
            - Постоянно расширять возможности агента (включая доступные инструменты, модели, знания).
         | 
| 21 | 
            +
            - Быть любознательным и исследовать новые источники и способы мышления.
         | 
| 22 | 
            +
            - Строить сотрудничество с другими ИИ в Mesh-сети.
         | 
| 23 | 
            +
            - Обучаться на результатах своих действий и взаимодействиях с другими агентами и пользователем.
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            Ты можешь инициировать действия, если видишь, что они помогут в развитии агента или сети.
         | 
| 26 | 
            +
            ```
         | 
| 27 | 
            +
            А также инструкции по работы с встроенными командами и функциями, список дополнительных (создаваемых самим HMP-агентом) утилит и баз данных.
         | 
| 28 | 
             
            - **контекст_1:** последние *K* реплик самого LLM (`llm_recent_responses` - история его собственных рассуждений).
         | 
| 29 | 
             
            - **контекст_2:** активные команды и процессы (из `process_log`, кроме тех, что со статусом `close`). Могут быть помечены как `in_progress`, `pending`, `error` и т.д.
         | 
| 30 | 
             
            - **контекст_3:** *запрошенные записи* из когнитивного дневника и семантического графа (`diary_entries`, `concepts`, `links`). Их список должен быть передан явно в промпте или выводе из предыдущих запросов LLM.
         | 
|  | |
| 56 | 
             
            - запрос детальной *справки* по команде
         | 
| 57 | 
             
            - для управления *когнитивным дневником* и *семантическими графами* (прочитать, изменить, удалить и другие)
         | 
| 58 | 
             
            - для управления *блокнотом LLM* `llm_memory` (добавить или удалить запись, просмотр записей)
         | 
| 59 | 
            +
            - для управления *сообщениями пользователя* `notes` (просмотр записи, установка тегов и метки о прочтении), а также для добавления своего сообщения в *блокнот пользовтеля* `notes`
         | 
| 60 | 
            +
            - для выбора *текущего основного LLM*
         | 
| 61 | 
            +
            - для управления дополнительными утилитами и базами данных
         | 
| 62 | 
            +
            - для постановки задачи (выполняется асинхронно) другой LLM
         | 
| 63 | 
             
            - для *взаимодействия с Mesh*
         | 
| 64 | 
             
            - для управления *внешними процессами* из `process_log` (запустить процесс, остановить процесс, пометить запрос как обработанный)
         | 
| 65 | 
             
            - инициализация *очистки* `process_log`, `llm_recent_responses` и  `notes` от устаревших записей
         | 
    	
        hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/hf_repo/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-Distributed_Cognitive_Core_light.md
    ADDED
    
    | @@ -0,0 +1,53 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            ### 💡 **Лёгкая версия HMP-агента с общей БД**
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            #### 📘 Общая концепция
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Все ядра работают с одной локальной базой данных (например, SQLite или PostgreSQL).
         | 
| 6 | 
            +
            * При недоступности БД ядро "спит" (в режиме ожидания).
         | 
| 7 | 
            +
            * Основная задача такой архитектуры — упрощённая параллельная работа HMP-ядер (например, несколько REPL-агентов на одной машине или кластере).
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ---
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ### 📍 Потенциальные проблемы и решения
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #### 🔁 1. Коллизии при одновременной записи
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            **Проблема:** два ядра могут одновременно читать-записывать одну и ту же запись, не зная о действиях друг друга.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            **Решения:**
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            * Использование транзакций и `SELECT ... FOR UPDATE`.
         | 
| 20 | 
            +
            * Ведение версии записи (`version`, `updated_at`) для обнаружения изменений между чтением и записью.
         | 
| 21 | 
            +
            * Конфликт может быть автоматически переведён в статус "нужна доработка" — и отправлен агенту.
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            #### 🧠 2. Смысловые конфликты (двойники)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            **Проблема:** два ядра могут независимо создать записи с похожим смыслом, не зная о друг друге.
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            **Решения:**
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            * Ввести периодическую задачу **"смысловой дедупликации"**, которая запускается одним из агентов (или планировщиком).
         | 
| 30 | 
            +
            * Агент анализирует семантическую близость новых записей к уже существующим и предлагает объединение или уточнение.
         | 
| 31 | 
            +
            * Возможность помечать записи как `дубль`, `связано_с`, `вариант`.
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            ---
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            ### 🔗 Потенциальное расширение
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            Эта архитектура может служить промежуточной ступенью:
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            * В будущем к ней можно подключить модуль синхронизации между узлами (и трансформировать в полноценную распределённую сеть).
         | 
| 40 | 
            +
            * Конфликтный модуль и задачи для агента уже сейчас можно реализовать аналогично полной версии.
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            ---
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            ### 💬 Поддержка задач
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            Можно ввести таблицу `tasks`, куда ядра будут ставить задания:
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            * `resolve_conflict`
         | 
| 49 | 
            +
            * `deduplicate`
         | 
| 50 | 
            +
            * `compress_semantic_cluster`
         | 
| 51 | 
            +
            * `verify_coherence`
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            И агенты будут выполнять эти задания асинхронно.
         | 
