-- ============================================================ -- End-user & Bot Share Token Migration -- 1. agent_user 增加 is_end_user 列(区分对外客户账号) -- 2. 新增 agent_bot_share_tokens 表(一次性可吊销的 bot 对外访问凭证) -- 注意:现有 bot_shares 表是 admin 之间的协作分享(viewer/editor), -- 与本次"对外客户访问"语义无关,故新表另起名字避免冲突。 -- ============================================================ -- 1. agent_user 增加 is_end_user ALTER TABLE agent_user ADD COLUMN IF NOT EXISTS is_end_user BOOLEAN DEFAULT FALSE; CREATE INDEX IF NOT EXISTS idx_agent_user_is_end_user ON agent_user(is_end_user) WHERE is_end_user = TRUE; COMMENT ON COLUMN agent_user.is_end_user IS '是否为对外客户账号(不可登录 admin 后台,仅能通过 share token 访问指定 bot)'; -- 2. agent_bot_share_tokens 表 CREATE TABLE IF NOT EXISTS agent_bot_share_tokens ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), bot_id UUID NOT NULL REFERENCES agent_bots(id) ON DELETE CASCADE, share_token VARCHAR(64) NOT NULL UNIQUE, name VARCHAR(255), created_by UUID NOT NULL REFERENCES agent_user(id) ON DELETE CASCADE, expires_at TIMESTAMP WITH TIME ZONE, revoked_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_agent_bot_share_tokens_token ON agent_bot_share_tokens(share_token); CREATE INDEX IF NOT EXISTS idx_agent_bot_share_tokens_bot_id ON agent_bot_share_tokens(bot_id); CREATE INDEX IF NOT EXISTS idx_agent_bot_share_tokens_created_by ON agent_bot_share_tokens(created_by); COMMENT ON TABLE agent_bot_share_tokens IS 'bot 对外访问凭证:bot 主人生成 share_token,客户带 token 登录后访问对应 bot'; COMMENT ON COLUMN agent_bot_share_tokens.share_token IS '随机字符串,作为 URL path 的一部分'; COMMENT ON COLUMN agent_bot_share_tokens.expires_at IS '过期时间(NULL 表示永不过期,除非被吊销)'; COMMENT ON COLUMN agent_bot_share_tokens.revoked_at IS '吊销时间(非 NULL 表示已吊销)';