feat: 拆分 worker 架构并增强 assistant 安全保护

- 新增 daemon/channel/assistant/function/scheduler/logging worker 架构和 JetStream 消息协议

- 修复邮件通知误入 assistant、迁移 checksum、日志 subject 和工具调用无限循环风险

- 新增 assistant 工具轮次熔断、工具结果截断和提示词软收敛规则

- 补充邮件推送关键字、可信发件人配置、升级日志和验证测试
This commit is contained in:
2026-07-10 00:41:36 +08:00
parent 7deae286ca
commit af6cfdaa83
70 changed files with 5953 additions and 1608 deletions
@@ -0,0 +1,57 @@
CREATE TABLE IF NOT EXISTS ias_schedules (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
schedule_type VARCHAR(32) NOT NULL,
expression TEXT NOT NULL,
target_topic TEXT NOT NULL,
payload JSONB NOT NULL DEFAULT '{}',
enabled BOOLEAN NOT NULL DEFAULT TRUE,
last_fired_at TIMESTAMPTZ,
next_fire_at TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT ias_schedules_type_check CHECK (schedule_type IN ('cron', 'interval'))
);
CREATE INDEX IF NOT EXISTS idx_ias_schedules_due
ON ias_schedules(next_fire_at)
WHERE enabled = TRUE;
CREATE UNIQUE INDEX IF NOT EXISTS idx_ias_schedules_name_unique
ON ias_schedules(name);
CREATE TABLE IF NOT EXISTS ias_schedule_fires (
fire_id TEXT PRIMARY KEY,
schedule_id BIGINT NOT NULL REFERENCES ias_schedules(id) ON DELETE CASCADE,
fire_time TIMESTAMPTZ NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'publishing',
attempt_count INTEGER NOT NULL DEFAULT 0,
published_at TIMESTAMPTZ,
error TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_ias_schedule_fires_schedule_time
ON ias_schedule_fires(schedule_id, fire_time DESC);
CREATE INDEX IF NOT EXISTS idx_ias_schedule_fires_reclaim
ON ias_schedule_fires(status, updated_at)
WHERE status IN ('failed', 'publishing');
CREATE TABLE IF NOT EXISTS ias_assistant_turns (
operation_key TEXT PRIMARY KEY,
channel TEXT NOT NULL,
account_id TEXT NOT NULL,
from_user_id TEXT NOT NULL,
turn_id TEXT NOT NULL,
trace_id TEXT NOT NULL DEFAULT '',
status VARCHAR(32) NOT NULL DEFAULT 'active',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT ias_assistant_turns_status_check
CHECK (status IN ('active', 'completed', 'cancelled'))
);
CREATE INDEX IF NOT EXISTS idx_ias_assistant_turns_status_updated
ON ias_assistant_turns(status, updated_at DESC);