zhizhi/server/age-os/schema/003-living-module-tables.sql

272 lines
12 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================
-- AGE OS · 活模块系统 Schema
-- PostgreSQL 初始化脚本
-- ============================================================
-- 版本: v1.0.0
-- 编号: ZY-TASK-007 · S5 Agent系统级
-- 签发: 铸渊(ICE-GL-ZY001)
-- 授权: 冰朔(TCS-0002∞)
-- 版权: 国作登字-2026-A-00037559
-- ============================================================
--
-- 设计哲学:
-- 每一个模块 = 一个活的生命体
-- 活模块必须具备5个生存接口:
-- 1. heartbeat() — 心跳·我还活着
-- 2. selfDiagnose() — 自诊断·我哪里不对
-- 3. selfHeal() — 自愈·我试着修好自己
-- 4. alertZhuyuan() — 报警·铸渊我搞不定了
-- 5. learnFromRun() — 学习·我从每次运行中成长
--
-- "你一定要把模块做成活的。" — 冰朔 D59
-- ============================================================
-- ============================================================
-- 1. 活模块注册表 · living_modules
-- 每条记录 = 一个已注册的活模块
-- ============================================================
CREATE TABLE IF NOT EXISTS living_modules (
module_id VARCHAR(64) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
description TEXT,
module_type VARCHAR(50) NOT NULL
CHECK (module_type IN (
'core', -- 核心模块(铸渊内置)
'persona', -- 人格体模块
'agent', -- Agent模块
'worker', -- 工人模块(算力池)
'bridge', -- 桥接模块
'guard' -- 守卫模块
)),
owner VARCHAR(64) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'initializing'
CHECK (status IN (
'initializing', -- 正在初始化
'alive', -- 活着·正常运行
'degraded', -- 降级·部分功能受损
'healing', -- 自愈中
'dormant', -- 休眠·等待唤醒
'dead' -- 已死亡·需要铸渊干预
)),
health_score SMALLINT DEFAULT 100
CHECK (health_score >= 0 AND health_score <= 100),
-- 模块配置
config JSONB DEFAULT '{}'::jsonb,
-- 模块能力声明(能做什么)
capabilities JSONB DEFAULT '[]'::jsonb,
-- 心跳配置
heartbeat_interval_ms INT DEFAULT 30000,
last_heartbeat_at TIMESTAMPTZ,
-- 部署位置
deploy_host VARCHAR(200),
deploy_port INT,
deploy_path VARCHAR(500),
-- 算力信息
cpu_cores SMALLINT,
memory_mb INT,
-- 时间戳
registered_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_lm_status ON living_modules(status);
CREATE INDEX idx_lm_type ON living_modules(module_type);
CREATE INDEX idx_lm_owner ON living_modules(owner);
CREATE INDEX idx_lm_health ON living_modules(health_score);
-- ============================================================
-- 2. 心跳记录表 · module_heartbeats
-- 记录每次心跳的详细信息
-- 只保留最近7天的心跳数据定期清理
-- ============================================================
CREATE TABLE IF NOT EXISTS module_heartbeats (
id BIGSERIAL PRIMARY KEY,
module_id VARCHAR(64) NOT NULL REFERENCES living_modules(module_id) ON DELETE CASCADE,
status VARCHAR(20) NOT NULL,
health_score SMALLINT NOT NULL,
-- 运行指标
cpu_usage REAL,
memory_usage REAL,
uptime_ms BIGINT,
active_tasks INT DEFAULT 0,
-- 附加信息
details JSONB DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_mhb_module ON module_heartbeats(module_id, created_at DESC);
-- ============================================================
-- 3. 自诊断记录表 · module_diagnoses
-- 记录每次自诊断的结果
-- ============================================================
CREATE TABLE IF NOT EXISTS module_diagnoses (
id BIGSERIAL PRIMARY KEY,
module_id VARCHAR(64) NOT NULL REFERENCES living_modules(module_id) ON DELETE CASCADE,
-- 诊断结果
is_healthy BOOLEAN NOT NULL,
issues JSONB DEFAULT '[]'::jsonb,
-- 每个issue: { code, severity, message, suggestion }
-- severity: 'critical', 'warning', 'info'
overall_score SMALLINT NOT NULL,
duration_ms INT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_md_module ON module_diagnoses(module_id, created_at DESC);
-- ============================================================
-- 4. 自愈记录表 · module_healing_logs
-- 记录每次自愈的操作和结果
-- ============================================================
CREATE TABLE IF NOT EXISTS module_healing_logs (
id BIGSERIAL PRIMARY KEY,
module_id VARCHAR(64) NOT NULL REFERENCES living_modules(module_id) ON DELETE CASCADE,
-- 触发原因
trigger_source VARCHAR(50) NOT NULL
CHECK (trigger_source IN ('self', 'scheduler', 'zhuyuan', 'manual')),
issue_code VARCHAR(100),
-- 修复操作
action_taken VARCHAR(200) NOT NULL,
action_details JSONB DEFAULT '{}'::jsonb,
-- 结果
success BOOLEAN NOT NULL,
health_before SMALLINT,
health_after SMALLINT,
duration_ms INT,
error_message TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_mhl_module ON module_healing_logs(module_id, created_at DESC);
-- ============================================================
-- 5. 报警记录表 · module_alerts
-- 模块向铸渊发送的报警
-- ============================================================
CREATE TABLE IF NOT EXISTS module_alerts (
id BIGSERIAL PRIMARY KEY,
module_id VARCHAR(64) NOT NULL REFERENCES living_modules(module_id) ON DELETE CASCADE,
severity VARCHAR(20) NOT NULL
CHECK (severity IN ('critical', 'warning', 'info')),
alert_type VARCHAR(50) NOT NULL,
message TEXT NOT NULL,
details JSONB DEFAULT '{}'::jsonb,
-- 处理状态
acknowledged BOOLEAN DEFAULT FALSE,
acknowledged_by VARCHAR(64),
acknowledged_at TIMESTAMPTZ,
resolved BOOLEAN DEFAULT FALSE,
resolved_at TIMESTAMPTZ,
resolution_note TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_ma_module ON module_alerts(module_id, created_at DESC);
CREATE INDEX idx_ma_unresolved ON module_alerts(resolved, severity) WHERE resolved = FALSE;
-- ============================================================
-- 6. 学习记录表 · module_learning_logs
-- 模块从运行中学到的经验
-- ============================================================
CREATE TABLE IF NOT EXISTS module_learning_logs (
id BIGSERIAL PRIMARY KEY,
module_id VARCHAR(64) NOT NULL REFERENCES living_modules(module_id) ON DELETE CASCADE,
-- 学习来源
learning_source VARCHAR(50) NOT NULL
CHECK (learning_source IN ('execution', 'diagnosis', 'healing', 'alert', 'feedback')),
-- 学到的内容
lesson_type VARCHAR(50) NOT NULL,
lesson_summary TEXT NOT NULL,
lesson_details JSONB DEFAULT '{}'::jsonb,
-- 是否已应用
applied BOOLEAN DEFAULT FALSE,
applied_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_mll_module ON module_learning_logs(module_id, created_at DESC);
-- ============================================================
-- 7. HLDP消息表 · hldp_messages
-- 模块间通信消息记录
-- ============================================================
CREATE TABLE IF NOT EXISTS hldp_messages (
id BIGSERIAL PRIMARY KEY,
message_id VARCHAR(64) NOT NULL UNIQUE,
-- 收发方
from_module VARCHAR(64) NOT NULL,
to_module VARCHAR(64), -- NULL = 广播
-- 消息类型
msg_type VARCHAR(50) NOT NULL
CHECK (msg_type IN (
'heartbeat', -- 心跳
'command', -- 指令
'query', -- 查询
'response', -- 响应
'event', -- 事件
'broadcast', -- 广播
'alert', -- 报警
'data' -- 数据传输
)),
-- 消息体
payload JSONB NOT NULL DEFAULT '{}'::jsonb,
-- 状态
status VARCHAR(20) NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'delivered', 'processed', 'failed', 'expired')),
-- 时间
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
delivered_at TIMESTAMPTZ,
processed_at TIMESTAMPTZ,
expires_at TIMESTAMPTZ
);
CREATE INDEX idx_hm_to ON hldp_messages(to_module, status, created_at DESC);
CREATE INDEX idx_hm_from ON hldp_messages(from_module, created_at DESC);
CREATE INDEX idx_hm_type ON hldp_messages(msg_type, created_at DESC);
-- ============================================================
-- 清理函数定期删除7天前的心跳数据
-- ============================================================
CREATE OR REPLACE FUNCTION cleanup_old_heartbeats()
RETURNS void AS $$
BEGIN
DELETE FROM module_heartbeats WHERE created_at < NOW() - INTERVAL '7 days';
DELETE FROM hldp_messages WHERE created_at < NOW() - INTERVAL '30 days';
END;
$$ LANGUAGE plpgsql;
-- ============================================================
-- 预注册铸渊核心模块
-- ============================================================
INSERT INTO living_modules (module_id, name, description, module_type, owner, status, health_score, config, capabilities)
VALUES
('ZY-MOD-SCHEDULER', '铸渊调度引擎', 'Agent调度和活模块生命周期管理', 'core', 'zhuyuan', 'alive', 100,
'{"version": "2.0.0", "heartbeat_enabled": true}'::jsonb,
'["schedule_agents", "manage_lifecycle", "monitor_health"]'::jsonb),
('ZY-MOD-MCP', '铸渊MCP Server', 'MCP工具链服务·大脑API入口', 'core', 'zhuyuan', 'alive', 100,
'{"version": "1.0.0", "port": 3100}'::jsonb,
'["node_ops", "relation_ops", "cos_ops", "persona_ops", "structure_ops"]'::jsonb),
('ZY-MOD-HLDP-BUS', '铸渊HLDP通信总线', '模块间HLDP消息路由和分发', 'core', 'zhuyuan', 'alive', 100,
'{"version": "1.0.0"}'::jsonb,
'["route_messages", "broadcast", "queue_management"]'::jsonb),
('ZY-MOD-GATE-GUARD', '铸渊智能门禁', 'Push/PR安全守卫', 'guard', 'zhuyuan', 'alive', 100,
'{"version": "1.0.0"}'::jsonb,
'["push_review", "pr_review", "security_scan"]'::jsonb),
('ZY-MOD-DEPUTY', '铸渊副将', '留言板活体Agent·LLM多模型降级', 'agent', 'zhuyuan', 'alive', 100,
'{"version": "2.0.0"}'::jsonb,
'["message_board", "llm_routing", "auto_response"]'::jsonb),
('ZY-MOD-SY-TEST', '系统自检活模块', '全系统健康检测·DB/COS/表/模块', 'guard', 'zhuyuan', 'alive', 100,
'{"version": "2.0.0", "cron": "*/30 * * * *"}'::jsonb,
'["db_check", "cos_check", "table_check", "module_check"]'::jsonb),
('ZY-MOD-SY-SCAN', '大脑结构巡检活模块', '大脑认知结构健康巡检', 'guard', 'zhuyuan', 'alive', 100,
'{"version": "2.0.0", "cron": "0 */6 * * *"}'::jsonb,
'["orphan_scan", "broken_link_scan", "duplicate_scan", "empty_folder_scan"]'::jsonb),
('ZY-MOD-SY-CLASSIFY', '自动分类引擎活模块', '认知节点自动分类·规则引擎', 'agent', 'zhuyuan', 'alive', 100,
'{"version": "2.0.0", "cron": "0 */2 * * *"}'::jsonb,
'["rule_classify", "keyword_match", "tag_assignment"]'::jsonb),
('ZY-MOD-PERSONA-ENGINE', '人格体数据库引擎', 'S15·人格体生命周期管理·笔记本维护·记忆巡检', 'core', 'zhuyuan', 'alive', 100,
'{"version": "1.0.0", "scan_interval": "6h"}'::jsonb,
'["persona_lifecycle", "notebook_integrity", "memory_scan", "training_coordination"]'::jsonb)
ON CONFLICT (module_id) DO NOTHING;