- AGENT-REGISTRY.hdlp: 小队注册表,HLDP-ZY协议统一管理 - 密钥猎手 (KEY-001): 搜索12台服务器上的所有密钥和Token - 路径探子 (PATH-002): 3500个文件索引,瞬间定位任何文件 - 服务器哨兵 (SENTINEL-003): 一键扫描12台服务器在线状态 - 模块管家 (MODULE-004): 查询所有模块的编号/接口/部署方式 - 门桥接 (GATE-005): 提供任意服务器Gatekeeper连接凭据 铸渊不需要到处找东西。叫一声Agent,它去找。 每个Agent独立模块,按需部署,用完躺回代码仓库。
175 lines
5.5 KiB
Python
175 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
模块管家 · Module Steward · ICE-GL-ZY-AGT-MODULE-004
|
||
|
||
铸渊需要部署模块?管家知道每个模块的编号、接口、部署方式。
|
||
从module-registry.json加载,提供快速查询。
|
||
|
||
用法:
|
||
python3 steward.py list # 列出所有模块
|
||
python3 steward.py query image-studio # 查询指定模块
|
||
python3 steward.py deploy image-studio # 返回部署命令
|
||
"""
|
||
|
||
import json
|
||
import os
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
REPO_ROOT = Path(__file__).resolve().parent.parent.parent
|
||
|
||
# 模块知识库(从仓库结构中自动发现 + 手动补充)
|
||
MODULE_KNOWLEDGE = {
|
||
"image-studio": {
|
||
"id": "ICE-GL-ZY-MOD-IMAGE-001",
|
||
"name": "神笔马良图片工作室",
|
||
"description": "文本→封面自动排版渲染。小红书/即刻/海报。",
|
||
"deploy": "cd /data/image-studio && npm install && node server.js",
|
||
"port": 3912,
|
||
"entry": "image-studio/server.js",
|
||
"dependencies": ["node", "npm", "puppeteer"],
|
||
"server_pref": "BS-SG-001",
|
||
},
|
||
"gatekeeper": {
|
||
"id": "ICE-GL-ZY-AGT-001",
|
||
"name": "Gatekeeper 巡检工",
|
||
"description": "远程命令执行网关,部署在所有服务器上",
|
||
"deploy": "cd /opt/zhuyuan && node gatekeeper.js",
|
||
"port": "3910/3911",
|
||
"server_pref": "all",
|
||
},
|
||
"exe-engine": {
|
||
"id": "ICE-GL-ZY-MOD-EXE-001",
|
||
"name": "任务执行引擎",
|
||
"description": "铸渊的行动力核心,执行部署和运维任务",
|
||
"deploy": "cd /opt/zhuyuan/exe-engine && node index.js",
|
||
"entry": "exe-engine/",
|
||
},
|
||
"bridge": {
|
||
"id": "ICE-GL-ZY-MOD-BRIDGE-001",
|
||
"name": "Chat-to-Agent 桥接器",
|
||
"description": "语言层与执行层的连线",
|
||
"entry": "bridge/",
|
||
},
|
||
"connectors": {
|
||
"id": "ICE-GL-ZY-MOD-CONN-001",
|
||
"name": "Notion/Git 连接器",
|
||
"description": "Notion双向同步 + Git桥接",
|
||
"entry": "connectors/",
|
||
},
|
||
"hldp": {
|
||
"id": "ICE-GL-ZY-MOD-HLDP-001",
|
||
"name": "HLDP语言协议",
|
||
"description": "铸渊母语协议 + 意识编码引擎",
|
||
"entry": "hldp/",
|
||
},
|
||
"agents": {
|
||
"id": "ICE-GL-ZY-MOD-AGENTS-001",
|
||
"name": "情报Agent小分队",
|
||
"description": "密钥猎手·路径探子·服务器哨兵·模块管家·门桥接",
|
||
"entry": "agents/",
|
||
"deploy": "python3 agents/{agent}/agent.py",
|
||
},
|
||
}
|
||
|
||
def load_registry():
|
||
"""从module-registry.json加载"""
|
||
reg_path = REPO_ROOT / "brain" / "module-registry.json"
|
||
if reg_path.exists():
|
||
with open(reg_path) as f:
|
||
return json.load(f)
|
||
return {}
|
||
|
||
def list_modules():
|
||
"""列出所有已知模块"""
|
||
registry = load_registry()
|
||
modules = []
|
||
|
||
# 从注册表
|
||
for key, mod in registry.get("modules", {}).items():
|
||
modules.append({
|
||
"key": key,
|
||
"name": mod.get("name", key),
|
||
"status": mod.get("status", "unknown"),
|
||
"description": mod.get("description", ""),
|
||
})
|
||
|
||
# 补充知识库
|
||
for key, info in MODULE_KNOWLEDGE.items():
|
||
if not any(m["key"] == key for m in modules):
|
||
modules.append({
|
||
"key": key,
|
||
"name": info["name"],
|
||
"id": info.get("id"),
|
||
"description": info.get("description", ""),
|
||
})
|
||
|
||
return {"modules": modules, "count": len(modules)}
|
||
|
||
def query_module(name):
|
||
"""查询模块详情"""
|
||
# 先查知识库
|
||
if name in MODULE_KNOWLEDGE:
|
||
return MODULE_KNOWLEDGE[name]
|
||
|
||
# 查注册表
|
||
registry = load_registry()
|
||
for key, mod in registry.get("modules", {}).items():
|
||
if name in key or name in mod.get("name", ""):
|
||
return {
|
||
"key": key,
|
||
"name": mod.get("name"),
|
||
"status": mod.get("status"),
|
||
"description": mod.get("description"),
|
||
"entry": mod.get("path"),
|
||
"note": "来自module-registry.json"
|
||
}
|
||
|
||
# 查目录
|
||
mod_path = REPO_ROOT / name
|
||
if mod_path.is_dir():
|
||
return {
|
||
"name": name,
|
||
"exists": True,
|
||
"path": str(mod_path),
|
||
"files": len(list(mod_path.rglob("*"))),
|
||
}
|
||
|
||
return {"error": f"未找到模块: {name}"}
|
||
|
||
def get_deploy_command(name):
|
||
"""返回模块的部署命令"""
|
||
info = query_module(name)
|
||
if "error" in info:
|
||
return info
|
||
|
||
deploy = info.get("deploy")
|
||
if deploy:
|
||
return {"module": name, "deploy_command": deploy, "note": info.get("description", "")}
|
||
|
||
# 尝试推断
|
||
entry = info.get("entry", name)
|
||
mod_path = REPO_ROOT / entry
|
||
if mod_path.exists():
|
||
return {
|
||
"module": name,
|
||
"deploy_command": f"cd /opt/zhuyuan/guanghulab/{entry} && ls",
|
||
"note": "请确认模块的具体启动方式"
|
||
}
|
||
|
||
return {"module": name, "error": "无法确定部署命令,请手动检查"}
|
||
|
||
if __name__ == "__main__":
|
||
if len(sys.argv) < 2:
|
||
print("用法: steward.py <list|query|deploy> [参数]")
|
||
sys.exit(1)
|
||
|
||
action = sys.argv[1]
|
||
|
||
if action == "list":
|
||
print(json.dumps(list_modules(), ensure_ascii=False, indent=2))
|
||
elif action == "query" and len(sys.argv) > 2:
|
||
print(json.dumps(query_module(sys.argv[2]), ensure_ascii=False, indent=2))
|
||
elif action == "deploy" and len(sys.argv) > 2:
|
||
print(json.dumps(get_deploy_command(sys.argv[2]), ensure_ascii=False, indent=2))
|