
chenchenandClaude Opus 4.8
a0616eaebf
feat(swarm): 按订阅套餐控制蜂群使用权(管理员可配)
需求:管理员在 HM 控制台按订阅套餐控制谁能用蜂群。照搬现有 MaxAgents(#8)模式
(per-plan、管理员设、不硬编码 tier)。
后端:
- model SubscriptionPlan 加 SwarmEnabled bool(default false;AutoMigrate 加列,跨三库)。
- model GetUserSwarmEnabled(userId):用户任一活跃套餐 SwarmEnabled=true 即放行(镜像
GetUserMaxAgents);无套餐/DB 不可用 => false(opt-in)。
- controller AgentCreateUserSwarm gate:普通用户须有开通套餐,管理员(role>=admin)绕过(测试/运维)。
- controller 套餐 admin upsert 字段映射加 swarm_enabled(create 整结构已自动带)。
前端(web/default 套餐编辑):
- plan-form schema/defaults/映射 + types 加 swarm_enabled。
- 套餐编辑抽屉加「蜂群使用权」Switch(镜像 enabled)。
- zh.json 加 "Swarm Access" → 蜂群使用权(en 用 key 兜底)。
默认关闭(opt-in)、管理员逐套餐勾选;gate 在 swarm 创建入口,与 swarm 运行时是否启用无关。
测试 TestGetUserSwarmEnabled(无套餐/开通/未开通/过期/多套餐/非法 user)。build+vet+model 测试全绿。
影响面:HM 订阅模型(加字段)+ swarm 创建鉴权 + admin UI;不涉计费扣费/密钥/swarm 契约。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:55:55 +08:00
..
2026-06-04 00:05:08 +08:00
2026-06-01 23:45:10 +08:00
2026-06-01 23:45:10 +08:00
2026-06-08 17:17:40 +08:00
2026-06-10 18:01:32 +08:00
2026-06-08 17:49:35 +08:00
2026-06-11 17:55:55 +08:00
2026-06-10 15:37:28 +08:00
2026-06-10 15:28:07 +08:00
2026-06-10 15:28:07 +08:00
2026-06-01 23:45:10 +08:00
2026-06-01 23:45:10 +08:00
2026-06-02 17:45:00 +08:00
2026-06-10 21:43:00 +08:00
2026-06-10 21:43:00 +08:00
2026-06-01 23:45:10 +08:00
2026-06-04 15:30:33 +08:00
2026-06-10 16:27:34 +08:00
2026-06-05 11:06:49 +08:00
2026-06-05 11:06:49 +08:00
2026-06-10 00:33:47 +08:00
2026-06-10 20:38:17 +08:00
2026-06-10 20:38:17 +08:00
2026-05-25 17:41:43 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-10 20:38:17 +08:00
2026-06-10 14:29:57 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-22 14:24:20 +08:00
2026-06-04 16:15:47 +08:00
2026-05-20 14:07:30 +08:00
2026-06-10 14:29:57 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-01 23:45:10 +08:00
2026-05-20 14:07:30 +08:00
2026-06-09 15:51:21 +08:00
2026-06-09 15:51:21 +08:00
2026-06-01 23:45:10 +08:00
2026-06-09 22:16:29 +08:00
2026-06-10 00:40:23 +08:00
2026-05-20 14:07:30 +08:00
2026-06-08 17:34:03 +08:00
2026-06-08 17:34:03 +08:00
2026-06-10 00:40:23 +08:00
2026-06-10 00:40:23 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-01 23:45:10 +08:00
2026-06-09 00:55:09 +08:00
2026-06-10 00:33:47 +08:00
2026-06-10 00:33:47 +08:00
2026-06-08 15:26:47 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 16:43:36 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-11 17:55:55 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-10 00:40:23 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-06-09 00:55:09 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00
2026-05-20 14:07:30 +08:00