工作空间与成员表
工作空间域 8 张表。理解本域先记住一条:业务表的归属靠 workspace_id 软引用列('' = 个人数据),该列没有外键;本页的表负责"空间本身、成员、策略、审计与域名入组"(记法约定见总览)。
workspaces — 空间主体
共 6 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
id | TEXT | 否(PK) | — | ws_ + 12 位十六进制 |
name | TEXT | 否 | — | 空间名 |
owner_id | TEXT | 否 | — | FK→users(id),CASCADE。唯一的"所有者"真相——成员角色里的 admin 不含所有权 |
invite_token | TEXT | 否(UNIQUE) | — | 192-bit 遗留能力令牌:为兼容保留,应用层已不再接受(见 workspace_invites) |
deleting | INTEGER | 否 | 0 | durable 删除栅栏——防止多步拆除与新建竞争;可恢复的失败会复位为 0 |
created_at | INTEGER → BIGINT | 否 | now() | 创建时间 |
- 索引:
idx_workspaces_owner(owner_id);invite_tokenUNIQUE。
workspace_members — 成员与细粒度能力
共 17 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
workspace_id | TEXT | 否(PK 之一) | — | FK→workspaces(id),CASCADE |
user_id | TEXT | 否(PK 之一) | — | FK→users(id),CASCADE |
role | TEXT | 否 | 'member' | admin / member / guest。迁移把遗留 owner 折叠为 admin、非法值折叠为 guest(fail-closed)(store.go:511-523) |
can_create_projects | INTEGER | 否 | 1 | 建项目 |
can_private_conversations | INTEGER | 否 | 1 | 建私有(仅自己可见)会话 |
can_create_skills_prompts | INTEGER | 否 | 1 | 旧的"技能+提示词合并"开关(保留兼容;新权限见下两列) |
can_create_prompts | INTEGER | 否 | 1 | 建共享提示词(首次拆分时从合并开关回填) |
can_create_skills | INTEGER | 否 | 1 | 建共享技能(同上) |
can_create_mcp | INTEGER | 否 | 1 | 建共享 MCP(从合并开关回填) |
can_use_prompts | INTEGER | 否 | 1 | 使用提示词 |
can_use_skills | INTEGER | 否 | 1 | 使用技能 |
can_use_mcp | INTEGER | 否 | 1 | 使用 MCP |
can_create_kb | INTEGER | 否 | 1 | 建知识库 |
can_add_kb_files | INTEGER | 否 | 1 | 向库添加文件 |
can_delete_kb_content | INTEGER | 否 | 1 | 删库内容 |
can_delete_conversations | INTEGER | 否 | 1 | 删会话 |
joined_at | INTEGER → BIGINT | 否 | now() | 加入时间 |
- 主键:复合
(workspace_id, user_id)。索引:idx_ws_members_user(user_id)。 - 备注:13 个
can_*列全部是 0/1 INTEGER,缺省宽松(默认 1);限制由管理员显式写入。
workspace_kb_member_permissions — 库级权限覆盖
对单个知识库覆盖成员权限。共 5 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
kb_id | TEXT | 否(PK 之一) | — | FK→knowledge_bases(id),CASCADE |
user_id | TEXT | 否(PK 之一) | — | FK→users(id),CASCADE |
can_add_files | INTEGER | 否 | 1 | 向该库添加文件 |
can_delete_content | INTEGER | 否 | 1 | 删除该库内容 |
updated_at | INTEGER → BIGINT | 否 | now() | 更新时间 |
- 备注:缺行 = 允许——老空间与新受邀成员保持历史共享编辑行为,库管理员显式限制时才插行。索引
idx_ws_kb_permissions_user(user_id)。
workspace_invites — 作用域邀请
共 12 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
id | TEXT | 否(PK) | — | wsi_rec + 12 位十六进制 |
workspace_id | TEXT | 否 | — | FK→workspaces(id),CASCADE |
token | TEXT | 否(UNIQUE) | — | 邀请令牌(192-bit genToken) |
email | TEXT | 否 | '' | 定向邀请邮箱(空 = 通用链接) |
role | TEXT | 否 | 'guest' | 加入后角色:admin / member / guest |
expires_at | INTEGER → BIGINT | 否 | 0 | 过期时间(0 = 不过期) |
max_uses | INTEGER | 否 | 1 | 可用次数 |
used_count | INTEGER | 否 | 0 | 已用次数 |
created_by | TEXT | 是 | NULL | FK→users(id),SET NULL(删号不毁邀请) |
purpose | TEXT | 否 | 'manual' | 生命周期元数据:manual(管理员创建)/ quick_link(旧轮换端点返回的单次链接) |
revoked_at | INTEGER → BIGINT | 否 | 0 | 撤销时间(0 = 未撤销) |
created_at | INTEGER → BIGINT | 否 | now() | 创建时间 |
- 索引:
idx_ws_invites_workspace(workspace_id, created_at DESC)。 - 备注:
created_by的 NOT NULL 解除在迁移里做(PG 走重建,store/workspace_invites.go:487-562);max_uses/used_count在 PG 是 BIGINT、SQLite 是 INTEGER(workspace_invites.go:535重建表)。
workspace_policies — 空间能力策略
一空间一行,只能收窄、不能放大平台能力。共 16 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
workspace_id | TEXT | 否(PK) | — | FK→workspaces(id),CASCADE |
allowed_model_ids | TEXT(JSON) | 否 | '[]' | 允许的模型 id;空数组 = 平台全部 |
allowed_tool_ids | TEXT(JSON) | 否 | '[]' | 允许的内置工具 id(空 = 全部) |
allowed_mcp_server_ids | TEXT(JSON) | 否 | '[]' | 允许的管理员 MCP 服务 id(空 = 全部) |
allow_sandbox | INTEGER | 否 | 1 | 沙箱执行 |
allow_image_generation | INTEGER | 否 | 1 | 图片生成 |
allow_tool_calling | INTEGER | 否 | 1 | 工具调用(首次拆分时 = 旧 sandbox AND image 两个开关的合取,绝不放宽,store.go:695-708) |
allow_drawing | INTEGER | 否 | 1 | 绘画(继承旧 allow_image_generation) |
allow_mcp | INTEGER | 否 | 1 | 使用 MCP |
allow_skills | INTEGER | 否 | 1 | 使用技能 |
allow_prompts | INTEGER | 否 | 1 | 使用提示词 |
allow_knowledge_bases | INTEGER | 否 | 1 | 知识库 |
allow_file_upload | INTEGER | 否 | 1 | 文件上传 |
member_monthly_credit_limit | REAL | 否 | 0 | 成员月度积分上限(0 = 不限;PG 保持 REAL) |
updated_by | TEXT | 否 | '' | 最后修改的管理员 id |
updated_at | INTEGER → BIGINT | 否 | 0 | 最后修改时间(默认 0 而非 now()——行可能由策略首次编辑时才创建) |
workspace_audit_logs — 空间审计
轻量审计流水。共 8 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
id | TEXT | 否(PK) | — | 审计行 id |
workspace_id | TEXT | 否 | — | 故意无 FK——行要活过工作空间删除 |
actor_user_id | TEXT | 否 | — | 操作者(同样无 FK,删号不毁审计) |
action | TEXT | 否 | — | 动作名。当前实现使用:workspace.created / workspace.deleted / member.joined / member.left / member.removed / member.role_updated / member.permissions_updated / invite.created / invite.used / invite.revoked / invite.rotated / policy.updated / resource.visibility_changed(store/workspace_audit.go;自由文本,随功能扩展) |
target_type | TEXT | 否 | '' | 目标类型,由 store 层审计写入(conversation / project / knowledge_base / workspace / workspace_member / workspace_invite;无 CHECK 约束) |
target_id | TEXT | 否 | '' | 目标 id |
metadata | TEXT(JSON) | 否 | '{}' | 上下文。约定永不写入邀请令牌、API key、请求体、文档内容 |
created_at | INTEGER → BIGINT | 否 | now() | 时间 |
- 索引:
idx_ws_audit_workspace(workspace_id, created_at DESC)。
registration_domains — 自动入组规则
一行将一个精确邮箱域映射到一个工作空间。平台管理员在独立的 /admin/domains 页面管理。共 4 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
domain | TEXT | 否(PK) | — | 取邮箱最后一个 @ 后的归一化域名;匹配不区分大小写,不展开通配符或子域 |
workspace_id | TEXT | 否 | — | FK→workspaces(id),ON DELETE RESTRICT;仍被规则引用的工作空间不能删除 |
lock_personal | INTEGER | 否 | 0 | 0/1;开启后,绑定的普通用户不能访问或创建个人空间 |
enabled | INTEGER | 否 | 1 | 0/1;关闭只停止后续自动入组,不解除已有绑定 |
- 匹配规则:
example.com只匹配user@example.com,不匹配user@sub.example.com;输入不能包含协议、路径、通配符或尾部句点。 - 注册事务:新建密码账号或可信 OAuth 账号时,创建用户、写入
domain_users并加入工作空间在同一事务完成;命中规则的密码注册即使全局未要求验证也必须完成邮箱验证。规则创建后不追溯加入已有用户。 - 生命周期:创建后
domain与workspace_id不可修改;需要更换时删除旧规则再新建。删除规则会解除该规则下的绑定和个人空间锁定,但保留已有工作空间成员关系与数据。
domain_users — 账号绑定与例外
每行记录将用户加入域规则的绑定关系。共 3 列。
| 列名 | 类型 | 可空 | 默认值 | 说明 |
|---|---|---|---|---|
user_id | TEXT | 否(PK) | — | FK→users(id),ON DELETE CASCADE |
domain | TEXT | 否 | — | FK→registration_domains(domain),ON DELETE CASCADE |
lock_override | INTEGER | 是 | NULL | 0/1 的单用户例外;NULL 表示继承 registration_domains.lock_personal |
- 绑定不随邮箱修改消失:主键是
user_id,用户改邮箱不会静默解除入组或访问限制。 - 实际锁定值:
COALESCE(lock_override, registration_domains.lock_personal)。设置为允许个人空间后,该账号可恢复个人空间开关,但仍保留指定工作空间成员身份。 - 平台管理员:拥有平台
admin角色的账号不受域规则锁定,可以使用个人空间。规则对启用后创建的普通用户生效,管理员之后仍可修改单个用户例外。
相关页面
- 访问与权限管理 — 用户/工作空间的管理界面
- 对话与消息表 — 业务侧
workspace_id软引用列的宿主 - 能力与集成表 —
user_skills/user_prompts/user_mcp_servers的空间作用域 - 域名入组与工作空间访问 — 管理员操作流程与锁定行为