跳到主要内容

工作空间与成员表

工作空间域 8 张表。理解本域先记住一条:业务表的归属靠 workspace_id 软引用列'' = 个人数据),该列没有外键;本页的表负责"空间本身、成员、策略、审计与域名入组"(记法约定见总览)。

workspaces — 空间主体

共 6 列。

列名类型可空默认值说明
idTEXT否(PK)ws_ + 12 位十六进制
nameTEXT空间名
owner_idTEXTFK→users(id),CASCADE。唯一的"所有者"真相——成员角色里的 admin 不含所有权
invite_tokenTEXT否(UNIQUE)192-bit 遗留能力令牌:为兼容保留,应用层已不再接受(见 workspace_invites
deletingINTEGER0durable 删除栅栏——防止多步拆除与新建竞争;可恢复的失败会复位为 0
created_atINTEGER → BIGINTnow()创建时间
  • 索引idx_workspaces_owner(owner_id)invite_token UNIQUE。

workspace_members — 成员与细粒度能力

共 17 列。

列名类型可空默认值说明
workspace_idTEXT否(PK 之一)FK→workspaces(id),CASCADE
user_idTEXT否(PK 之一)FK→users(id),CASCADE
roleTEXT'member'admin / member / guest。迁移把遗留 owner 折叠为 admin非法值折叠为 guest(fail-closed)store.go:511-523
can_create_projectsINTEGER1建项目
can_private_conversationsINTEGER1建私有(仅自己可见)会话
can_create_skills_promptsINTEGER1旧的"技能+提示词合并"开关(保留兼容;新权限见下两列)
can_create_promptsINTEGER1建共享提示词(首次拆分时从合并开关回填)
can_create_skillsINTEGER1建共享技能(同上)
can_create_mcpINTEGER1建共享 MCP(从合并开关回填)
can_use_promptsINTEGER1使用提示词
can_use_skillsINTEGER1使用技能
can_use_mcpINTEGER1使用 MCP
can_create_kbINTEGER1建知识库
can_add_kb_filesINTEGER1向库添加文件
can_delete_kb_contentINTEGER1删库内容
can_delete_conversationsINTEGER1删会话
joined_atINTEGER → BIGINTnow()加入时间
  • 主键:复合 (workspace_id, user_id)索引idx_ws_members_user(user_id)
  • 备注:13 个 can_* 列全部是 0/1 INTEGER,缺省宽松(默认 1);限制由管理员显式写入。

workspace_kb_member_permissions — 库级权限覆盖

单个知识库覆盖成员权限。共 5 列。

列名类型可空默认值说明
kb_idTEXT否(PK 之一)FK→knowledge_bases(id),CASCADE
user_idTEXT否(PK 之一)FK→users(id),CASCADE
can_add_filesINTEGER1向该库添加文件
can_delete_contentINTEGER1删除该库内容
updated_atINTEGER → BIGINTnow()更新时间
  • 备注缺行 = 允许——老空间与新受邀成员保持历史共享编辑行为,库管理员显式限制时才插行。索引 idx_ws_kb_permissions_user(user_id)

workspace_invites — 作用域邀请

共 12 列。

列名类型可空默认值说明
idTEXT否(PK)wsi_rec + 12 位十六进制
workspace_idTEXTFK→workspaces(id),CASCADE
tokenTEXT否(UNIQUE)邀请令牌(192-bit genToken
emailTEXT''定向邀请邮箱(空 = 通用链接)
roleTEXT'guest'加入后角色:admin / member / guest
expires_atINTEGER → BIGINT0过期时间(0 = 不过期)
max_usesINTEGER1可用次数
used_countINTEGER0已用次数
created_byTEXTNULLFK→users(id)SET NULL(删号不毁邀请)
purposeTEXT'manual'生命周期元数据:manual(管理员创建)/ quick_link(旧轮换端点返回的单次链接)
revoked_atINTEGER → BIGINT0撤销时间(0 = 未撤销)
created_atINTEGER → BIGINTnow()创建时间
  • 索引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_idTEXT否(PK)FK→workspaces(id),CASCADE
allowed_model_idsTEXT(JSON)'[]'允许的模型 id;空数组 = 平台全部
allowed_tool_idsTEXT(JSON)'[]'允许的内置工具 id(空 = 全部)
allowed_mcp_server_idsTEXT(JSON)'[]'允许的管理员 MCP 服务 id(空 = 全部)
allow_sandboxINTEGER1沙箱执行
allow_image_generationINTEGER1图片生成
allow_tool_callingINTEGER1工具调用(首次拆分时 = 旧 sandbox AND image 两个开关的合取,绝不放宽,store.go:695-708
allow_drawingINTEGER1绘画(继承旧 allow_image_generation
allow_mcpINTEGER1使用 MCP
allow_skillsINTEGER1使用技能
allow_promptsINTEGER1使用提示词
allow_knowledge_basesINTEGER1知识库
allow_file_uploadINTEGER1文件上传
member_monthly_credit_limitREAL0成员月度积分上限(0 = 不限;PG 保持 REAL)
updated_byTEXT''最后修改的管理员 id
updated_atINTEGER → BIGINT0最后修改时间(默认 0 而非 now()——行可能由策略首次编辑时才创建)

workspace_audit_logs — 空间审计

轻量审计流水。共 8 列。

列名类型可空默认值说明
idTEXT否(PK)审计行 id
workspace_idTEXT故意无 FK——行要活过工作空间删除
actor_user_idTEXT操作者(同样无 FK,删号不毁审计)
actionTEXT动作名。当前实现使用: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_changedstore/workspace_audit.go;自由文本,随功能扩展)
target_typeTEXT''目标类型,由 store 层审计写入(conversation / project / knowledge_base / workspace / workspace_member / workspace_invite;无 CHECK 约束)
target_idTEXT''目标 id
metadataTEXT(JSON)'{}'上下文。约定永不写入邀请令牌、API key、请求体、文档内容
created_atINTEGER → BIGINTnow()时间
  • 索引idx_ws_audit_workspace(workspace_id, created_at DESC)

registration_domains — 自动入组规则

一行将一个精确邮箱域映射到一个工作空间。平台管理员在独立的 /admin/domains 页面管理。共 4 列。

列名类型可空默认值说明
domainTEXT否(PK)取邮箱最后一个 @ 后的归一化域名;匹配不区分大小写,不展开通配符或子域
workspace_idTEXTFK→workspaces(id)ON DELETE RESTRICT;仍被规则引用的工作空间不能删除
lock_personalINTEGER00/1;开启后,绑定的普通用户不能访问或创建个人空间
enabledINTEGER10/1;关闭只停止后续自动入组,不解除已有绑定
  • 匹配规则example.com 只匹配 user@example.com,不匹配 user@sub.example.com;输入不能包含协议、路径、通配符或尾部句点。
  • 注册事务:新建密码账号或可信 OAuth 账号时,创建用户、写入 domain_users 并加入工作空间在同一事务完成;命中规则的密码注册即使全局未要求验证也必须完成邮箱验证。规则创建后不追溯加入已有用户。
  • 生命周期:创建后 domainworkspace_id 不可修改;需要更换时删除旧规则再新建。删除规则会解除该规则下的绑定和个人空间锁定,但保留已有工作空间成员关系与数据。

domain_users — 账号绑定与例外

每行记录将用户加入域规则的绑定关系。共 3 列。

列名类型可空默认值说明
user_idTEXT否(PK)FK→users(id)ON DELETE CASCADE
domainTEXTFK→registration_domains(domain)ON DELETE CASCADE
lock_overrideINTEGERNULL0/1 的单用户例外;NULL 表示继承 registration_domains.lock_personal
  • 绑定不随邮箱修改消失:主键是 user_id,用户改邮箱不会静默解除入组或访问限制。
  • 实际锁定值COALESCE(lock_override, registration_domains.lock_personal)。设置为允许个人空间后,该账号可恢复个人空间开关,但仍保留指定工作空间成员身份。
  • 平台管理员:拥有平台 admin 角色的账号不受域规则锁定,可以使用个人空间。规则对启用后创建的普通用户生效,管理员之后仍可修改单个用户例外。

相关页面