⚡ HTML 生成时间:2026-04-19 11:33:42(源文件更新后需重新转换)
24 - OpenClaw 能力拓展平台 — 业务逻辑
更新日期:2026-04-19
1. 核心对象
- Tenant:购买方组织;其下 Workspace 对应一个或多个 OpenClaw 工作区标识(逻辑 ID,非强制绑定物理路径)。
- Asset:能力资产(技能包、MCP 包、记忆策略、组合包)。
- AssetVersion:不可变版本单元;发布、回滚、灰度的最小单位。
- Entitlement:租户对某
AssetVersion 的授权与配额。 - DeliveryBundle:交付给 OpenClaw 侧的文件集合 + 校验和 + 签名(可选)。
- AuditEvent:上架、发布、同步、失败、人工审批记录(类比 GEP 事件思路,字段从简)。
2. 资产状态机(简化)
stateDiagram-v2
[*] --> draft
draft --> in_review: submit
in_review --> draft: reject
in_review --> published: approve
published --> deprecated: deprecate
deprecated --> [*]
- ISV/运营创建草稿 → 提交评审 → 通过后上架
published。 - 租户仅可见已授权且未废弃版本;紧急下架可走运营强制
deprecated(联动通知)。
3. 定制交付流(可选模块)
本节为 P2 模块,当前设计稿 v0.2,补全状态机、角色、字段、接口与数据库表。
3.1 工单核心实体
| 实体 | 说明 |
|---|
CustomOrder | 定制工单主记录 |
CustomOrderMilestone | 交付里程碑节点 |
CustomOrderMessage | 工单内沟通记录(运营/租户/ISV) |
CustomOrderAttachment | 附件(需求文档、产出物 ZIP) |
CustomOrderAudit | 工单操作审计(状态变更、指派、评分) |
3.2 工单状态机
stateDiagram-v2
[*] --> draft: 租户创建草稿
draft --> submitted: 租户提交
submitted --> pending_review: 系统校验通过
pending_review --> quoting: 运营确认需求
quoting --> quoted: 运营填写报价
quoted --> customer_confirming: 发送客户确认
customer_confirming --> confirmed: 客户确认/签约
customer_confirming --> cancelled: 客户拒绝
confirmed --> in_progress: ISV 接单
in_progress --> milestone_pending: 创建里程碑
milestone_pending --> milestone_in_progress: ISV 开始里程碑
milestone_in_progress --> milestone_review: ISV 提交交付物
milestone_review --> milestone_passed: 运营/租户验收通过
milestone_review --> milestone_rejected: 验收驳回(附原因)
milestone_rejected --> milestone_in_progress: ISV 返修
milestone_passed --> all_milestones_done: 最后一个里程碑通过
all_milestones_done --> delivered: 生成 DeliveryBundle
delivered --> completed: 租户最终确认
delivered --> disputed: 客户发起争议
disputed --> completed: 争议解决
disputed --> cancelled: 争议导致取消
cancelled --> [*]
completed --> [*]
quoted --> cancelled: 超时未确认(可配置)
in_progress --> paused: 双方同意暂停
paused --> in_progress: 恢复
paused --> cancelled: 永久暂停
紧急路径:运营可直接将 submitted → in_progress(跳过报价,紧急需求)。
3.3 工单字段明细
CustomOrder 主表
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| order_no | string | 工单编号,CO-{YYYYMMDD}-{6位序号} |
| tenant_id | FK | 所属租户 |
| title | string | 工单标题(简洁描述需求) |
| type | enum | skill定制 / mcp定制 / 记忆策略 / 组合包 / 咨询 |
| priority | enum | low / normal / high / urgent |
| status | enum | 状态机状态(见 §3.2) |
| openclaw_version_range | string | 目标 OpenClaw 版本范围,如 >=1.5.0 |
| compliance_requirements | text | 合规约束(JSON 数组描述) |
| initial_requirement | text | 原始需求描述 |
| internal_note | text | 运营内部备注(不对租户可见) |
| quoted_workdays | int | 报价工时(人天) |
| quoted_price | decimal | 报价金额(元) |
| currency | string | 币种,默认 CNY |
| isv_id | FK | 接单 ISV(confirmed 后填写) |
| estimated_delivery_date | date | 预计交付日期 |
| actual_delivery_date | date | 实际交付日期 |
| customer_rating | int | 客户评分 1-5(completed 时可填) |
| customer_feedback | text | 客户反馈(completed 时可填) |
| dispute_reason | text | 争议原因(disputed 时填) |
| submitted_at | datetime | 提交时间 |
| confirmed_at | datetime | 确认时间 |
| completed_at | datetime | 完成时间 |
| cancelled_at | datetime | 取消时间 |
| cancel_reason | string | 取消原因 |
| expire_at | datetime | 报价过期时间(默认 7 天) |
CustomOrderMilestone 里程碑
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| order_id | FK | 所属工单 |
| sequence | int | 序号(1-based) |
| title | string | 里程碑标题,如「需求分析」「V1 交付」「UAT」 |
| description | text | 里程碑描述与交付标准 |
| workdays | int | 本里程碑工时(人天) |
| due_date | date | 计划截止日期 |
| actual_finish_date | date | 实际完成日期 |
| status | enum | pending / in_progress / review / passed / rejected / skipped |
| delivery_bundle_id | FK | 关联 DeliveryBundle(passed 后填) |
| reject_reason | text | 驳回原因 |
| notes | text | 里程碑备注 |
CustomOrderMessage 沟通记录
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| order_id | FK | 所属工单 |
| sender_type | enum | tenant / isv / ops / system |
| sender_id | FK | 发送者用户 ID(system 时为空) |
| content | text | 消息内容(支持 Markdown) |
| attachment_ids | text | JSON 数组,附件 ID 列表 |
| is_internal | bool | 是否运营内部消息(租户不可见) |
| created_at | datetime |
CustomOrderAttachment 附件
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| order_id | FK | 所属工单(可空,关联 milestone) |
| milestone_id | FK | 所属里程碑(可空) |
| uploader_type | enum | tenant / isv / ops |
| uploader_id | FK |
| file_name | string | 原始文件名 |
| file_uri | string | 对象存储路径 |
| file_size | bigint | 文件大小(字节) |
| mime_type | string |
| category | enum | requirement / draft / delivery / approval_doc / other |
| created_at | datetime |
CustomOrderAudit 审计
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| order_id | FK |
| actor_type | enum | tenant / isv / ops / system |
| actor_id | FK |
| action | string | 动作,如 status_change / assigned / quoted / milestone_created |
| old_value | string | 变更前值(JSON) |
| new_value | string | 变更后值(JSON) |
| ip | string | 操作 IP |
| user_agent | string |
| created_at | datetime |
3.4 角色权限
| 动作 | 租户管理员 | ISV | 平台运营 |
|---|
| 创建工单(draft) | ✅ | ❌ | ✅(代创建) |
| 提交工单(submitted) | ✅ | ❌ | ✅ |
| 填写报价(quoted) | ❌ | ❌ | ✅ |
| 确认工单(confirmed) | ✅ | ❌ | ❌ |
| 指派 ISV | ❌ | ❌ | ✅ |
| 创建里程碑 | ✅(确认后) | ✅(接单后) | ✅ |
| 里程碑验收 | ✅(passed/rejected) | ❌ | ✅(override) |
| 最终完成确认 | ✅ | ❌ | ✅ |
| 发起争议 | ✅ | ✅ | ❌ |
| 查看内部消息 | ❌ | ❌ | ✅ |
3.5 完整业务流程
┌─────────────────────────────────────────────────────────────────────────────┐
│ 定制工单全生命周期 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 1️⃣ 需求发起 │
│ 租户管理员 → 填写工单(标题/类型/需求描述/OpenClaw版本/合规要求) │
│ → 保存草稿 draft │
│ │
│ 2️⃣ 需求提交 │
│ → 提交 submitted │
│ → 系统自动校验(类型必填、描述非空、合规字段格式) │
│ → 进入 pending_review 运营队列 │
│ │
│ 3️⃣ 运营评审 │
│ → 运营初审:确认需求清晰度、是否在服务范围内 │
│ → 若不清晰:驳回 draft(附原因),租户补充 │
│ → 若可接:进入 quoting │
│ │
│ 4️⃣ 报价 │
│ → 运营填写报价工时(人天)和金额 │
│ → 设置报价有效期 expire_at(默认 7 天) │
│ → 发送报价给客户确认 │
│ │
│ 5️⃣ 客户确认 │
│ → 租户确认 → confirmed(填写 isv_id 若运营已指派) │
│ → 拒绝 → cancelled(附原因) │
│ → 超时 → cancelled(系统自动) │
│ │
│ 6️⃣ ISV 接单与交付 │
│ → ISV 接单 → in_progress │
│ → 创建里程碑列表(可多个,按顺序执行) │
│ → 每个里程碑:in_progress → review → passed/rejected │
│ → 全部通过 → delivered(自动生成 DeliveryBundle) │
│ │
│ 7️⃣ 最终验收 │
│ → 租户最终确认 → completed │
│ → 可选:客户评分 + 反馈 │
│ → 若有争议 → disputed → 争议解决 → completed 或 cancelled │
│ │
│ 8️⃣ 交付物归档 │
│ → DeliveryBundle 关联工单编号 │
│ → AuditEvent 记录完整的交付链 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
3.6 接口清单(工单与任务)
| 接口 ID | 方法 | 路径 | 说明 | 状态 |
|---|
admin-custom-order-page | POST | /admin/occapCustomOrder/page | 工单分页列表 | planned |
admin-custom-order-create | POST | /admin/occapCustomOrder | 创建工单 | planned |
admin-custom-order-update | PUT | /admin/occapCustomOrder/{id} | 更新工单 | planned |
admin-custom-order-detail | GET | /admin/occapCustomOrder/{id} | 工单详情 | planned |
admin-custom-order-submit | POST | /admin/occapCustomOrder/{id}/submit | 提交工单 | planned |
admin-custom-order-quote | POST | /admin/occapCustomOrder/{id}/quote | 填写报价 | planned |
admin-custom-order-confirm | POST | /admin/occapCustomOrder/{id}/confirm | 客户确认 | planned |
admin-custom-order-cancel | POST | /admin/occapCustomOrder/{id}/cancel | 取消工单 | planned |
admin-custom-order-assign-isv | POST | /admin/occapCustomOrder/{id}/assign-isv | 指派 ISV | planned |
admin-milestone-list | GET | /admin/occapCustomOrder/{orderId}/milestones | 里程碑列表 | planned |
admin-milestone-create | POST | /admin/occapCustomOrder/{orderId}/milestones | 创建里程碑 | planned |
admin-milestone-update | PUT | /admin/occapCustomOrder/{orderId}/milestones/{id} | 更新里程碑 | planned |
admin-milestone-review | POST | /admin/occapCustomOrder/{orderId}/milestones/{id}/review | 里程碑验收 | planned |
admin-order-message-list | GET | /admin/occapCustomOrder/{orderId}/messages | 沟通记录 | planned |
admin-order-message-send | POST | /admin/occapCustomOrder/{orderId}/messages | 发送消息 | planned |
admin-order-attachment-upload | POST | /admin/occapCustomOrder/attachment | 上传附件 | planned |
portal-custom-order-page | POST | /portal/occapCustomOrder/page | 租户视角工单列表 | planned |
portal-custom-order-create | POST | /portal/occapCustomOrder | 租户创建工单 | planned |
portal-custom-order-confirm | POST | /portal/occapCustomOrder/{id}/confirm | 租户确认报价 | planned |
portal-custom-order-rate | POST | /portal/occapCustomOrder/{id}/rate | 客户评分 | planned |
isv-order-page | POST | /isv/occapCustomOrder/page | ISV 工单列表 | planned |
isv-milestone-review | POST | /isv/occapCustomOrder/{orderId}/milestones/{id}/review | ISV 提交交付物 | planned |
3.7 与 DeliveryBundle 的关联
CustomOrder (confirmed)
│
├─ milestone_1 ──→ [ISV 交付] ──→ DeliveryBundle ──→ AuditEvent(skill_published)
├─ milestone_2 ──→ [ISV 交付] ──→ DeliveryBundle ──→ AuditEvent
└─ milestone_N ──→ [ISV 交付] ──→ DeliveryBundle ──→ AuditEvent
最终 DeliveryBundle 合并为完整定制包
- 每个里程碑
passed 后,ISV 上传交付物 ZIP - 系统生成
DeliveryBundle,关联 occap_asset_version(若需上架) - 工单
delivered 时,汇总所有里程碑交付物为一个最终包
3.8 任务系统(Task,比工单更轻量)
用于 平台运营内部任务分发、ISV 里程碑协作、人机协作任务,与工单共用审计框架但独立运行。
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| task_no | string | TSK-{YYYYMMDD}-{6位序号} |
| order_id | FK | 关联工单(可空) |
| title | string | 任务标题 |
| description | text | 详细描述 |
| type | enum | review / approval / delivery / agent_job / misc |
| priority | enum | low / normal / high / urgent |
| status | enum | pending / assigned / in_progress / done / cancelled |
| assignee_type | enum | user / isv / agent |
| assignee_id | FK |
| due_date | datetime |
| done_at | datetime |
| done_note | text | 完成备注 |
| created_at | datetime |
任务分页:POST /admin/occapTask/page(与工单解耦,独立接口)
3.9 通知机制
| 触发事件 | 通知对象 | 通知方式 |
|---|
| 工单提交 | 运营 | 站内消息 + 可选邮件 |
| 报价完成 | 租户管理员 | 站内消息 + 邮件 |
| 工单确认/取消 | 运营 + ISV | 站内消息 |
| 里程碑被驳回 | ISV | 站内消息 + 邮件 |
| 里程碑通过 | 租户管理员 + 运营 | 站内消息 |
| 工单完成 | 租户管理员 + ISV | 站内消息 + 邮件 |
| 工单超时(待处理) | 待处理人 | 站内消息 |
通知渠道可扩展:飞书机器人 / Slack / 企业微信(配置项)。
4. 记忆分层与同步
| 层级 | 内容示例 | 平台职责 | OpenClaw 侧 |
|---|
| 会话摘要 | 近期对话压缩 | 存储模板与样例 | 用户环境生成 |
| 长期事实 | 用户确认的偏好 | 版本化策略包 | 合并至 workspace 记忆文件 |
| 组织知识 | 团队共享条目 | 租户隔离 + 脱敏 | 按角色下发 |
红线:含 密钥、token、身份证、未脱敏联系方式 的内容不得进入向量索引与对外样例。
5. 搜索与审计
- 业务搜索:按资产类型、标签、风险、租户可见性过滤。
- 语义搜索:仅对允许索引的字段建 embedding;查询记 search_audit(租户、延迟、是否命中缓存)。
- 观测搜索:按
error_signature、bundle_id、时间范围检索,支持运营复盘。
6. 权限矩阵(摘要)
| 动作 | 平台超管 | 租户管理员 | ISV | 审计只读 |
|---|
| 租户套餐/配额 | ✅ | 查看本租户 | ❌ | ✅ |
| 资产上架评审 | ✅ | ❌ | 提交草稿 | ✅ |
| 发布 DeliveryBundle | ✅ | 本租户范围内 | 受委托时 | ✅ |
| 查看审计 | ✅ | 本租户 | 自己的资产 | ✅ |
7. 非目标
- 平台侧远程执行用户 MCP 工具。
- 无确认自动覆盖用户 OpenClaw 目录。
8. 业务架构(域边界)
与《需求评估文档》§四「业务架构」索引一致:下列域在组织与数据上解耦,经 Entitlement 与 DeliveryBundle 耦合。
flowchart TB
subgraph tenant_domain[租户域]
T[Tenant / Workspace]
M[Member / RBAC]
end
subgraph catalog_domain[资产域]
A[Asset / Version]
R[Review / Risk]
end
subgraph commerce_domain[商业化域]
P[Plan / Quota]
E[Entitlement]
end
subgraph delivery_domain[交付域]
B[DeliveryBundle]
Au[AuditEvent]
end
subgraph search_domain[搜索域]
S[Business Search]
V[Vector Search 可选]
Sa[search_audit]
end
T --> E
A --> R
R --> A
E --> B
B --> Au
S --> Sa
V --> Sa
9. 应用架构与逻辑视图(平台 ↔ OpenClaw 宿主)
- 平台进程:Cool Admin Midway 提供 REST、权限、计费、元数据与包存储;不托管用户 MCP 运行时。
- OpenClaw 宿主:用户工作区内的 CLI/脚本消费 DeliveryBundle,合并 skills / MCP manifest / 记忆策略片段。
- 集成边界:平台输出 签名(可选)+ 校验和 + 审计 ID;宿主侧合并前可运行校验脚本。
flowchart LR
subgraph platform[能力拓展平台]
API[Midway API]
ADM[Cool Admin Vue]
OBJ[对象存储/包]
end
subgraph client[客户环境]
OC[OpenClaw 工作区]
CLI[拉取/合并脚本]
end
ADM --> API
API --> OBJ
CLI --> API
CLI --> OC
OBJ --> CLI
10. 场景视图(用例锚点)
主场景与 interaction_map.html 中流程一致,摘要如下:
| 场景 | 参与者 | 结果 |
|---|
| 资产上架 | ISV → 运营 | in_review → published,写 AuditEvent |
| 租户授权 | 运营 / 租户管理员 | Entitlement 生效,门户可见范围变化 |
| 搜索与观测 | 租户成员 | 业务/语义查询,search_audit 记录 |
| 交付同步 | 租户 → CLI | 下载 Bundle,宿主合并,失败可凭 bundle_id 追溯 |
11. 处理视图(关键控制流)
评审通过(简化时序):
sequenceDiagram
participant ISV
participant API as Midway API
participant OPS as 运营
ISV->>API: submit(assetId)
API-->>ISV: in_review
OPS->>API: review(approve)
API-->>OPS: published
API->>API: AuditEvent(review_pass)
高并发与稳定性保护(与 L1/L2 档位联动)
- API:租户级 + IP 限流;搜索与导出走独立速率桶;热点列表走 Redis 短缓存。
- 搜索:防抖与查询长度上限;向量路径异步或独立超时,避免拖死主线程池。
- 写路径:Entitlement / 评审状态变更单表乐观锁或版本号,避免并发覆盖。
- 包下载:预签名 URL + 短 TTL;大文件走 CDN/OSS,应用层只做鉴权与审计。
- 降级:向量服务不可用时回退关键字检索,并在响应头或审计中标记
degraded=true(实现约定)。
12. 多身份与页面职责(摘要)
与 skills_distribution.md、page_structure.md 一致:平台运营 / 租户管理员 / 租户成员 / ISV / 审计只读 / Agent 主体 在 上传、管理、购买订阅、平台分发、定制、任务收发 上的权限边界见该文档 §1–§2;本文不重复表格。
13. Skills 分发与检索策略
- 索引分层:业务表(资产元数据)→ 全文/倒排 → 可选向量;租户 ID + Entitlement 为硬过滤条件。
- 可见性:
public / tenant_private / channel_canary 与分发配置联动;Agent 检索单独记 principal_type。 - 排序:相关性 + 运营权重 + 风险惩罚因子(高危未审降权)。
- 缓存:热点列表短 TTL;失效在授权变更、版本上下架、分发配置变更时按租户维度失效。
14. Agent 自发布 / 自订阅(业务规则)
- 主体:
occap_agent_principal 与 Workspace 指纹 绑定;与人类账号分域。 - 发布:内容须先
upload/init 直传;publish 仅引用 uploadId + manifest;默认进入 待审或机器快车道(策略表)。 - 订阅:仅允许订阅 已授权租户可见 的
assetVersionId;写 Entitlement 或 Capability Slot 子表(实现期二选一或并存)。 - 人机共审:
risk >= high 或 策略命中 时强制进入人工评审队列。
15. 贡献点(CP)与批次结算(类比特币隐喻 · 非链)
- 非加密货币:无法币链上转账;CP 为平台内积分/权益计量,法币结算仍走支付与合同。
- 事件入账:
publish_reward、subscribe_share、task_bonus、penalty 等类型写入 occap_contribution_ledger(不可改,仅追加)。 - 批次(Block):定时或按条数滚动
occap_settlement_batch,聚合本批事件 ID 计算 MerkleRoot,关账后批次冻结(类比「出块确认」)。 - 难度调整(产品化):若 事故率 / 驳回率 超阈,提高 评审轮次或冷却时间(类比「全网难度」),由运营策略表驱动。
- 对账:运营可按
batchId + MerkleRoot 与明细导出对账;审计只读可全量查流水。
16. 认证与会话
16.1 登录方式
- 账号密码登录(平台账号)
- 飞书 SSO(OAuth2,由飞书应用管理)
- API Key(给 Agent / ISV 机器身份用)
16.2 平台账号体系
| 字段 | 类型 | 说明 |
|---|
| user_id | PK |
| tenant_id | FK | 可空(平台超管无租户) |
| username | string | 唯一 |
| password_hash | string | bcrypt |
| email | string | 可空 |
| phone | string | 可空 |
| role | enum | platform_super / platform_ops / tenant_admin / tenant_member / isv / audit_readonly / agent_principal |
| status | enum | active / disabled / deleted |
| agent_credential_id | FK | Agent 主体才有(关联证书/密钥) |
| create_time | datetime |
| update_time | datetime |
| delete_time | datetime | 软删除 |
16.3 Session 与 Token
- Web 会话:Session ID 存 Cookie,JWT 存 RefreshToken,Redis 中存 Session 状态(TTL 7 天)。
- API Key:HMAC-SHA256 签名,用于 Agent / ISV 接口调用,无 Session。
- Token 结构(JWT):
user_id, role, tenant_id, exp, iat。
16.4 权限控制(RBAC)
角色:
platform_super:平台超级管理员,拥有所有权限platform_ops:平台运营,可管理租户/评审/套餐/分发/工单tenant_admin:租户管理员,可管理本租户成员/授权/工单/记忆策略tenant_member:租户成员,可浏览市场/订阅/上传/任务isv:ISV,可提交资产/接单/里程碑交付audit_readonly:只读审计,可查看所有审计记录agent_principal:Agent 机器身份,权限最小化,按配额限制
接口级权限:所有管理端接口 /admin/occap*/ 需要 platform_ops 或 tenant_admin(本租户范围);开放接口 /open/v1/ 按 API Key Role 鉴权。
17. 租户与套餐
17.1 租户实体
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| tenant_no | string | 租户编号 TN-{6位序号} |
| name | string | 组织名 |
| code | string | 唯一编码 |
| plan_id | FK | 当前套餐,NULL 表示试用 |
| status | enum | trial(试用) / active(正常) / frozen(冻结) / cancelled(注销) |
| owner_user_id | FK | 租户创建人(默认第一个 tenant_admin) |
| expired_at | datetime | 套餐过期时间(试用默认30天) |
| frozen_at | datetime | 冻结时间 |
| create_time | datetime |
| update_time | datetime |
17.2 套餐实体
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| name | string | 套餐名,如「基础版」「企业版」 |
| code | string | 唯一编码,如 basic / enterprise |
| quota_json | text | 配额模板 JSON(见下) |
| price_monthly | decimal | 月付价格(元) |
| price_yearly | decimal | 年付价格(元) |
| sort_order | int | 排序 |
| status | enum | active / deprecated |
| create_time | datetime |
quota_json 配额模板示例:
{
"max_members": 10,
"max_asset_count": 50,
"max_entitlements": 20,
"search_quota_monthly": 10000,
"embedding_quota_monthly": 5000,
"custom_order_quota": 5,
"storage_quota_gb": 10
}
17.3 租户状态机
stateDiagram-v2
[*] --> trial: 注册开通
trial --> active: 购买套餐
trial --> frozen: 试用过期未购买
active --> frozen: 欠费或主动暂停
frozen --> active: 续费恢复
active --> cancelled: 注销
frozen --> cancelled: 超过保留期
17.4 Workspace 关联
- 一个租户可绑定多个 OpenClaw Workspace(逻辑 ID)
- Workspace 与租户解耦:平台只存标识符,不直接读写用户本地目录
18. 资产与版本
18.1 资产主表
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| asset_no | string | AS-{YYYYMM}-{6位序号} |
| tenant_id | FK | 所属租户(NULL=平台资产) |
| isv_id | FK | 创作者 ISV |
| type | enum | skill / mcp_bundle / memory_policy / composite |
| slug | string | URL 唯一标识 |
| title | string | 显示名称 |
| summary | text | 一句话简介 |
| description | text | 详细说明(Markdown) |
| tags | text | JSON 数组,如 ["风控","金融","自动化"] |
| visibility | enum | public(公开) / tenant_private(私有) / channel_canary(灰度渠道) |
| risk_level | enum | low / medium / high |
| license_spdx | string | SPDX 许可证,如 MIT |
| official_review_required | bool | 是否强制人工评审 |
| reject_reason | text | 驳回原因 |
| current_version_id | FK | 当前生效版本 |
| create_user | FK |
| update_user | FK |
| create_time | datetime |
| update_time | datetime |
| delete_time | datetime |
索引:slug(唯一), (status, type), (visibility, risk_level), tenant_id
18.2 资产版本表
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| asset_id | FK |
| version | string | semver,如 1.0.0 |
| version_no | int | 递增版本序号 |
| manifest_json | text | 完整 manifest(SKILL.md 元数据快照 / MCP bundle 描述) |
| bundle_uri | string | 包存储路径(ZIP) |
| bundle_sha256 | string | 包校验和 |
| signature | string | 可选签名 |
| changelog | text | 变更说明 |
| status | enum | draft / in_review / published / deprecated |
| review_passed_at | datetime |
| review_passed_by | FK |
| published_at | datetime |
| published_by | FK |
| deprecate_reason | text | 废弃原因 |
| rollback_version_id | FK | 可回滚到的历史版本 |
| create_user | FK |
| create_time | datetime |
索引:(asset_id, version)(唯一), (asset_id, status)
18.3 资产状态机(详细版)
stateDiagram-v2
[*] --> draft: ISV/运营创建草稿
draft --> draft: 保存修改
draft --> in_review: ISV提交
draft --> [*]: ISV删除草稿
in_review --> draft: 运营驳回(附原因)
in_review --> published: 运营通过
in_review --> fast_track: 自动快通道(low risk + 免审策略)
fast_track --> published: 自动通过
published --> deprecated: 运营下架
published --> published: ISV 发新版本(不影响当前)
published --> rolled_back: 回滚到历史版本
deprecated --> [*]
rolled_back --> published: 回滚后重新发布
快通道条件(同时满足):
risk_level = lowofficial_review_required = false- ISV 信用分 ≥ 阈值(运营策略表控制)
18.4 依赖与风险标签
// manifest_json 示例
{
"name": "风控技能包",
"version": "1.0.0",
"requires": [
{"type": "skill", "slug": "openclaw-risk-core", "version": ">=1.0.0"},
{"type": "mcp_bundle", "slug": "data-fetcher", "version": ">=0.9.0"}
],
"permissions": ["file_read", "http_request"],
"risk_flags": ["network_io", "file_write"],
"homepage": "https://..."
}
19. 授权 Entitlement
19.1 Entitlement 实体
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| entitlement_no | string | ET-{YYYYMM}-{6位序号} |
| tenant_id | FK |
| asset_version_id | FK | 授权的资产版本 |
| plan_id | FK | 来源套餐(可空,代表单独购买) |
| source_type | enum | plan_included(套餐包含) / addon(加购) / trial(试用) / custom_order(定制赠送) |
| quota_json | text | 本次授权配额覆盖(与套餐配额合并) |
| status | enum | active(生效) / expired(过期) / revoked(撤销) |
| granted_at | datetime | 授权生效时间 |
| expired_at | datetime | 过期时间(NULL=永不过期) |
| revoked_at | datetime | 撤销时间 |
| revoked_reason | string |
| create_user | FK | 授权操作人(运营或系统) |
| create_time | datetime |
索引:(tenant_id, asset_version_id)(唯一), tenant_id, status, expired_at
19.2 授权生命周期
Entitlement 创建 → active(生效)
→ 过期 expired(自然过期或欠费)
→ 撤销 revoked(运营手动撤销或违规)
授权后动作:
- 租户门户「我的订阅」中可见该资产
- ISV 收到「被订阅」通知
- 触发 CP 贡献点入账(ISV 的 subscribe_share)
- AuditEvent 记录
19.3 套餐切换时的 Entitlement 处理
| 场景 | 处理方式 |
|---|
| 升档 | 保留原 Entitlement,新套餐配额叠加 |
| 降档 | 保留已有资产访问,新增受限;已购单独资产不变 |
| 取消订阅 | 所有 plan_included Entitlement 转为 expired,单独购买的不受影响 |
| 欠费冻结 | 所有 Entitlement 临时 expired,续费后自动恢复 |
19.4 Capability Slot(能力槽位)
用于 Agent 订阅场景:一个 Slot 映射到一个 AssetVersion + 配额限制。
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| slot_no | string | CS-{6位序号} |
| tenant_id | FK |
| agent_principal_id | FK | 绑定的 Agent 主体 |
| asset_version_id | FK |
| quota_json | text | 调用次数/并发限制 |
| used_count | int | 当期已用次数 |
| period_type | enum | monthly / yearly / lifetime |
| status | enum | active / exhausted / expired |
| create_time |
20. 交付包 DeliveryBundle
20.1 DeliveryBundle 实体
| 字段 | 类型 | 说明 |
|---|
| id | PK |
| bundle_no | string | DB-{YYYYMM}-{6位序号} |
| tenant_id | FK | 交付目标租户 |
| entitlement_id | FK | 来源授权 |
| custom_order_id | FK | 可空,来源定制工单 |
| asset_version_ids | text | JSON 数组,涉及的多个资产版本 |
| bundle_uri | string | 包存储路径 |
| bundle_sha256 | string | 校验和 |
| signature | string | 可选数字签名 |
| size_bytes | bigint | 包大小 |
| delivery_type | enum | direct(直接下载) / script(CLI 拉取) |
| script_version | string | 拉取脚本版本(CLI 场景) |
| status | enum | created / downloaded / applied / failed |
| downloaded_at | datetime |
| applied_at | datetime | 应用到 OpenClaw 工作区的时间 |
| failure_reason | text | 失败原因 |
| create_time | datetime |
20.2 交付流程
DeliveryBundle 创建(平台)
→ 预签名 URL 生成(TTL=15min)
→ 租户下载 / CLI 拉取
→ 下载完成(status=downloaded)
→ 合并到 OpenClaw 工作区(status=applied)
→ 失败可凭 bundle_id 查 AuditEvent 追溯
20.3 CLI 拉取脚本(伪代码)
#!/bin/bash
BUNDLE_ID=$1
CHECKSUM=$2
TMP_ZIP="/tmp/occap_bundle_${BUNDLE_ID}.zip"
# 1. 拉取包
curl -L "https://api.platform.com/open/v1/bundle/${BUNDLE_ID}/download?token=${DOWNLOAD_TOKEN}" -o $TMP_ZIP
# 2. 校验完整性
ACTUAL_SHA=$(sha256sum $TMP_ZIP | cut -d' ' -f1)
if [ "$ACTUAL_SHA" != "$CHECKSUM" ]; then
echo "CHECKSUM_MISMATCH"
exit 1
fi
# 3. 解压到 OpenClaw skills/ 目录
SKILLS_DIR="${OPENCLAW_WORKSPACE}/skills"
mkdir -p $SKILLS_DIR
unzip -o $TMP_ZIP -d $SKILLS_DIR
# 4. 注册 manifest(示例)
# echo "BUNDLE_APPLIED:${BUNDLE_ID}" >> ${OPENCLAW_WORKSPACE}/.occap_applied
echo "OK"
← 返回文档总览