提交全维度文档review后的22项架构决策落地
基于产品/架构/流程/前端/后端五维度并行review,澄清并落地22项关键决策: 架构层:Governance按消费者归属拆散、MetaSchema独立模块、 Source传播改为事件驱动自治、去掉Candidate Decision Envelope 和needs_recheck中间状态、Neo4j决策为依赖RAGFlow GraphRAG 后端层:Entitlement统一为可变表+审计日志、API版本策略采用 X-API-Version Header、知识实体唯一键加scope字段 前端层:SSE实时通信(AI stream独立+事件统一)、正文持久化 IndexedDB安全网、Block粒度为场景/小节级 产品层:范围不变UX解决复杂度、知识确认默认自动+冲突时人工
This commit is contained in:
parent
9eacebb630
commit
33aad93bef
@ -31,7 +31,7 @@
|
||||
3. Market 只负责市场资产、授权、安装记录、来源侧 handoff、授权摘要和跳转审计。目标 owner 自己创建和消费 target precheck/session,Market 不写目标事实。
|
||||
4. Import task/context 归 Work/Content;Parse Job、Chapter Parse Result、Chapter Review 归 AI Orchestration;Knowledge 只在章节审阅确认后创建或更新 Knowledge Draft。
|
||||
5. 动态字段没有跨 owner 的通用写接口。`/dynamic-fields/validate` 只做校验和路由建议,正式写入必须回到 Content、Planning、Knowledge、Agent 等 owner action。
|
||||
6. Accept / Merge 写 Canonical 前必须消费或重算 Candidate Decision Envelope。硬闸门必须覆盖输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、`expectedRevision` 和幂等结果。
|
||||
6. Accept / Merge 写 Canonical 前必须消费或重算 Candidate Decision Envelope。硬闸门必须覆盖输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、`expectedRevision` 和幂等结果。(ADR-018 已决策去掉独立 Candidate Decision Envelope 概念封装,改为接受时实时对比来源状态;Agent Runtime Permission Envelope 仍保留,两者是不同概念。专题文档已同步更新。)
|
||||
7. 作品资产当前只允许阅读、收藏和授权记录。模板化、参考来源写入、AI 上下文绑定必须等待后续 feature gate、作品 owner 入口、使用检查、来源谱系、API/Schema 和失败回退闭合。
|
||||
8. SourceStatus、SourceEventType、SourceActionPolicy 必须分层表达。SourceStatus 包含 `delisted`;SourceActionPolicy 包含 `read_only`,不能把 `allowed/blocked/needs_recheck` 当成来源事实状态。
|
||||
9. 来源撤权、召回、下架、阻断、owner 缺失和授权失效会影响候选接受、Local KB 来源型确认、生成上下文、绑定、导出任务和已签发下载凭证,但不能自动回滚已确认 Canonical。
|
||||
@ -44,7 +44,7 @@
|
||||
1. `design-docs/临时-产品形态阶段化重设计计划.md` 中 D-045 和 C-006。
|
||||
2. `产品-02C/02F/03` 中作品资产是否仍保持只读/收藏/授权记录的默认 gate。
|
||||
3. `后端-05` 中动态字段是否仍没有跨 owner 泛写接口。
|
||||
4. `专题-01`、`流程-02B` 和 `前端-02` 是否仍要求 Candidate Decision Envelope 硬闸门。
|
||||
4. `专题-01`、`流程-02B` 和 `前端-02` 是否仍要求 Candidate Decision Envelope 硬闸门。(ADR-018 已决策去掉独立 Candidate Decision Envelope,改为实时对比;Agent Runtime Permission Envelope 仍保留。)
|
||||
5. `架构-01/02/04`、`后端-03/04/05`、`专题-03` 是否仍统一 SourceStatus / SourceEventType / SourceActionPolicy。
|
||||
6. 阶段 8 已在 D-046 开始补 `00-文档大纲.md` 和 `内容映射表.md` 的四仓工程架构索引;后续仍需继续复核其他过期引用和 owner 映射。
|
||||
|
||||
|
||||
@ -115,7 +115,7 @@ Accept 命令必须携带以下语义:
|
||||
| acceptMode | `accept_as_is` 或 `merge_after_edit` |
|
||||
| finalContent | 仅 `merge_after_edit` 需要,表示用户确认写入正文的最终内容 |
|
||||
| decisionContext | UI 决策来源、候选版本、质量结果版本和必要审计摘要 |
|
||||
| candidateDecisionEnvelope | 候选决策快照或重算请求,必须覆盖输出合规、静态检查、质量结果版本、来源状态、来源事件影响、Action Policy、授权快照、作品资产 feature gate、`expectedRevision` 和幂等结果 |
|
||||
| acceptPreconditionContext | 接受前置校验上下文,必须覆盖输出合规、静态检查、质量结果版本、来源状态、来源事件影响、Action Policy、授权快照、作品资产 feature gate、`expectedRevision` 和幂等结果;系统在接受时实时校验,不封装为独立对象 |
|
||||
|
||||
命令结果至少返回以下语义:
|
||||
|
||||
@ -143,21 +143,21 @@ Reject 不得修改正文,不得触发新的提取。
|
||||
- 已成功接受的命令必须返回同一 Block revision、Archive 结果和 followupTask 摘要。
|
||||
- 已失败且可重试的命令必须说明失败原因和当前可恢复动作。
|
||||
- 已失败且不可重试的命令不得创建新的正文 revision。
|
||||
- 同一幂等键携带不同 actor、work、targetBlock、suggestion、`expectedRevision`、授权快照或候选决策输入时,必须返回幂等冲突,不得复用旧结果。
|
||||
- 同一幂等键携带不同 actor、work、targetBlock、suggestion、`expectedRevision`、授权快照或接受前置校验输入时,必须返回幂等冲突,不得复用旧结果。
|
||||
- Archive、change log、audit log 和 outbox 必须能通过命令幂等语义去重。
|
||||
|
||||
## 6. 接受前置条件
|
||||
|
||||
Accept 在任何写正文动作前必须完成前置校验。前置校验失败时,候选不能被接受,正文不能写入。
|
||||
|
||||
服务端必须消费 Candidate Decision Envelope;如果 Envelope 缺失、过期、质量结果版本不匹配、`expectedRevision` 不匹配、授权快照变化、来源状态变化、作品资产 feature gate 变化或幂等结果不可复用,必须在写正文前重算。重算结果不是提示文案,而是写 Canonical 的硬闸门。
|
||||
服务端必须在接受时实时校验候选来源版本和授权状态;如果校验缺失、过期、质量结果版本不匹配、`expectedRevision` 不匹配、授权快照变化、来源状态变化、作品资产 feature gate 变化或幂等结果不可复用,必须在写正文前重算。重算结果不是提示文案,而是写 Canonical 的硬闸门。
|
||||
|
||||
| 校验 | 失败结果 |
|
||||
|---|---|
|
||||
| actor 对作品、Block、Suggestion 有操作权限 | `PERMISSION_DENIED`,不写正文 |
|
||||
| Suggestion 仍处于 Active / Shadow,未过期、未失效 | `SUGGESTION_NOT_ACCEPTABLE`,不写正文 |
|
||||
| expectedRevision 匹配目标 Block 当前 revision | `REVISION_CONFLICT`,进入显式冲突处理 |
|
||||
| Candidate Decision Envelope 允许接受,且包含输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、expectedRevision 和幂等结果 | 按决策结果阻断、需重验或要求显式确认 |
|
||||
| 接受前置校验通过(实时校验来源版本和授权状态),且覆盖输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、expectedRevision 和幂等结果 | 按校验结果阻断、需重验或要求显式确认 |
|
||||
| 输出合规、语义安全围栏和静态检查通过 | `OUTPUT_COMPLIANCE_BLOCKED` 或 `STATIC_CHECK_FAILED`,不写正文 |
|
||||
| 候选正文 lineage 中所有来源有有效 Authorization Snapshot | `SOURCE_AUTH_INVALID`,候选 invalidated / blocked |
|
||||
| 候选正文 lineage 不含 revoked / recalled / delisted / blocked / owner_missing / unauthorized 来源 | `SOURCE_BLOCKED`,候选 invalidated / blocked |
|
||||
@ -173,7 +173,7 @@ Accept 在任何写正文动作前必须完成前置校验。前置校验失败
|
||||
|
||||
1. 加载 Active Suggestion 并校验归属、状态与过期时间。
|
||||
2. 加载目标 Block,并用 `expectedRevision` 做并发保护。
|
||||
3. 消费或重算 Candidate Decision Envelope,校验候选来源、授权快照、市场作品资产 feature gate、质量门控、输出合规、静态检查、质量结果版本、幂等结果和当前 Block revision。
|
||||
3. 实时校验候选来源版本和授权状态(校验清单:候选来源、授权快照、市场作品资产 feature gate、质量门控、输出合规、静态检查、质量结果版本、幂等结果和当前 Block revision)。
|
||||
4. 更新 Block 内容与 revision。
|
||||
5. 如果候选包含 AI、市场、外部知识或授权知识来源,写 Block Source Attribution。
|
||||
6. 将 Suggestion 迁入候选归档(disposition=accepted)。
|
||||
@ -189,7 +189,7 @@ Accept 在任何写正文动作前必须完成前置校验。前置校验失败
|
||||
|
||||
1. 加载 Active Suggestion 并校验归属、状态与过期时间。
|
||||
2. 加载目标 Block,并用 `expectedRevision` 做并发保护。
|
||||
3. 消费或重算 Candidate Decision Envelope,校验候选来源、授权快照、市场作品资产 feature gate、质量门控、输出合规、静态检查、质量结果版本、幂等结果和最终正文内容。
|
||||
3. 实时校验候选来源版本和授权状态(校验清单:候选来源、授权快照、市场作品资产 feature gate、质量门控、输出合规、静态检查、质量结果版本、幂等结果和最终正文内容)。
|
||||
4. 用 `contentOverride` 更新 Block 内容与 revision。
|
||||
5. 默认继承上游候选的 lineage、授权快照、许可限制、召回状态和风险标记,并写 Block Source Attribution。
|
||||
6. 将 Suggestion 迁入候选归档(disposition=accepted),必要时记录 `final_content`。
|
||||
@ -305,7 +305,7 @@ Reject 不得更新 Block,不得创建重新提取链路。
|
||||
10. 候选正文 lineage 中存在 revoked、recalled、delisted、blocked、owner_missing、unauthorized 或无效授权快照时,Accept 必须失败。
|
||||
11. 候选使用市场作品资产时,必须经过作品资产使用预检和 feature gate;否则不能接受。
|
||||
12. 修改后合并默认继承上游 lineage 和许可限制,不能用 `contentOverride` 洗白来源。
|
||||
13. Accept / Merge 写 Canonical 前必须消费或重算 Candidate Decision Envelope,且 Envelope 必须包含输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、expectedRevision 和幂等结果。
|
||||
13. Accept / Merge 写 Canonical 前必须实时校验来源版本和授权状态,校验清单必须覆盖输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、expectedRevision 和幂等结果。
|
||||
|
||||
### Should-Have(P1)
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ Muse 的 AI 能力不是“前端按钮直接调某个智能体”,而是系
|
||||
-> 静态检查和来源状态校验
|
||||
-> 质量门控与有限重写
|
||||
-> 输出合规
|
||||
-> Candidate Decision Envelope
|
||||
-> 候选可接受性实时校验
|
||||
-> 可展示的 Shadow 对象
|
||||
-> 用户决策
|
||||
```
|
||||
@ -329,11 +329,11 @@ Parse Job -> Chapter Parse Result -> Chapter Review -> Knowledge Draft
|
||||
|
||||
风险标记属于 Shadow 解释,不是 Canonical 事实。风险、来源证据和用户决策必须进入 Archive 或审计摘要。
|
||||
|
||||
### 7.1 Candidate Decision Envelope
|
||||
### 7.1 候选可接受性实时校验
|
||||
|
||||
候选是否可展示、可接受、需重验或阻断,必须由 Candidate Decision Envelope 合并判断。它不是新的事实 owner,而是 AI Orchestration 对来源、权限、合规、质量和风险路由结果的决策快照。
|
||||
候选是否可展示、可接受、需重验或阻断,必须由系统在接受时实时校验来源版本和授权状态来合并判断。校验逻辑不封装为独立对象,而是作为接受链路的内联前置条件执行。
|
||||
|
||||
最小输入:
|
||||
最小校验输入:
|
||||
|
||||
- Source Status / Authorization Snapshot / Work Asset feature gate。
|
||||
- 输入合规、输出合规、语义安全围栏和静态检查结果。
|
||||
@ -341,7 +341,7 @@ Parse Job -> Chapter Parse Result -> Chapter Review -> Knowledge Draft
|
||||
- Risk Marker。
|
||||
- 目标 Block `expectedRevision`、候选版本和命令幂等上下文。
|
||||
|
||||
最小输出:
|
||||
校验输出:
|
||||
|
||||
| 语义 | 要求 |
|
||||
|---|---|
|
||||
@ -349,11 +349,11 @@ Parse Job -> Chapter Parse Result -> Chapter Review -> Knowledge Draft
|
||||
| acceptability | 可接受、只能修改后合并、需重验、不可接受 |
|
||||
| blockingReasons | 阻断原因和来源摘要 |
|
||||
| userActions | 接受、修改后合并、丢弃、重生成、重验来源等可用动作 |
|
||||
| auditSummary | 决策输入版本、质量结果版本、授权快照、来源状态、expectedRevision 和幂等摘要 |
|
||||
| auditSummary | 校验输入版本、质量结果版本、授权快照、来源状态、expectedRevision 和幂等摘要 |
|
||||
|
||||
### 7.2 决策优先级
|
||||
|
||||
Candidate Decision Envelope 按以下优先级合并,前面的硬阻断不能被后面的质量评分放开:
|
||||
候选可接受性实时校验按以下优先级合并,前面的硬阻断不能被后面的质量评分放开:
|
||||
|
||||
1. 合规、安全、语义围栏、静态检查硬阻断。
|
||||
2. 来源 revoked、recalled、delisted、blocked、owner_missing、unauthorized 或授权快照无效。
|
||||
@ -494,7 +494,7 @@ Source Status Event 必须幂等处理,传播失败时要可重试;在传播
|
||||
5. 任何含 AI、市场、外部知识或授权知识来源的正文写入,都能落到 Block Source Attribution。
|
||||
6. New-API 只作为外部网关,不成为 Muse 本地模型路由和成本 authority。
|
||||
7. 质量评测结果能被 `专题-04` 的质量门控和创作健康度直接消费。
|
||||
8. Candidate Decision Envelope 能统一合并来源、权限、合规、质量和风险路由结果。
|
||||
8. 候选可接受性实时校验能统一合并来源、权限、合规、质量和风险路由结果。
|
||||
|
||||
## 12. 关联阅读
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
|
||||
| 对象 | Owner BC | 说明 |
|
||||
|---|---|---|
|
||||
| Quality Policy | Admin/Governance BC | 管理员配置质量维度、阈值、重写次数、展示规则和评估集 |
|
||||
| Quality Policy | AI BC (grant 包) | 管理员配置质量维度、阈值、重写次数、展示规则和评估集 |
|
||||
| Candidate Quality Result | AI Orchestration BC | 单次候选的质量评分、风险、重写和展示摘要 |
|
||||
| AI Suggestion | AI Orchestration BC | 质量门控作用对象,仍属于 Shadow |
|
||||
| Block / Block Source Attribution | Work/Content BC | 候选被用户接受后才写正文和来源归因 |
|
||||
@ -95,7 +95,7 @@ AI Suggestion 生成
|
||||
-> 必要时 Shadow 内有限重写
|
||||
-> 非关键维度评分
|
||||
-> Candidate Quality Result
|
||||
-> Candidate Decision Envelope
|
||||
-> 候选可接受性实时校验
|
||||
-> 创作健康度展示
|
||||
-> 用户决策
|
||||
```
|
||||
@ -109,7 +109,7 @@ AI Suggestion 生成
|
||||
5. 重写只能在 Shadow 内替换候选版本,并保留 rewrite trail。
|
||||
6. 输出合规、来源安全、静态结构和授权状态的阻断优先级高于叙事质量评分。
|
||||
7. 用户最终看到的是候选和解释,不是内部评测 prompt、完整上下文或供应商响应。
|
||||
8. Candidate Quality Result 只给出质量和风险事实;候选最终是否可接受由 `专题-03` 的 Candidate Decision Envelope 合并判断。
|
||||
8. Candidate Quality Result 只给出质量和风险事实;候选最终是否可接受由 `专题-03` 的候选可接受性实时校验合并判断。
|
||||
|
||||
## 6. Candidate Quality Result
|
||||
|
||||
@ -148,7 +148,7 @@ AI Suggestion 生成
|
||||
|
||||
### 6.2 与风险路由的优先级
|
||||
|
||||
质量门控不能单独决定候选可接受性。最终动作由 Candidate Decision Envelope 合并:
|
||||
质量门控不能单独决定候选可接受性。最终动作由候选接受时实时校验合并:
|
||||
|
||||
1. 合规、安全、来源、授权、静态结构硬失败直接 blocked / invalidated。
|
||||
2. 市场作品资产 feature gate、owner 预检、`workAssetUsePrecheckId` 缺失直接 blocked。
|
||||
@ -156,7 +156,7 @@ AI Suggestion 生成
|
||||
4. 硬阻断检查可用且通过后,叙事关键维度才参与 pass / rewritten_pass / high_risk 判断。
|
||||
5. 非关键维度只影响展示建议,不单独阻止接受。
|
||||
|
||||
Candidate Decision Envelope 消费 Candidate Quality Result 时必须校验 `qualityPolicyVersion`、质量结果版本、评分时间、来源状态、授权快照、作品资产 feature gate、目标 `expectedRevision` 和命令幂等上下文;任一输入变化都必须重算或进入 needs_recheck,不能用旧质量结果放行 Accept / Merge。
|
||||
候选接受时实时校验消费 Candidate Quality Result 时必须校验 `qualityPolicyVersion`、质量结果版本、评分时间、来源状态、授权快照、作品资产 feature gate、目标 `expectedRevision` 和命令幂等上下文;任一输入变化都必须重算或进入 needs_recheck,不能用旧质量结果放行 Accept / Merge。
|
||||
|
||||
## 7. 创作健康度
|
||||
|
||||
|
||||
@ -38,7 +38,19 @@ no-config 不是“没有系统能力”,而是“不要求用户先配置资
|
||||
|
||||
写作台的 AI 动作前置条件应理解为“作品默认生成能力可用,且被选用的智能体、来源和权限当前有效”。用户未绑定任何外部知识来源时,系统使用默认系统能力、当前正文、规划摘要和已确认作品知识生成候选。
|
||||
|
||||
### 0.2 作品工作台信息架构合同
|
||||
### 0.2 UX 复杂度解决策略
|
||||
|
||||
产品范围不变,复杂度通过 UX 设计解决:
|
||||
|
||||
| 策略 | 说明 | 影响范围 |
|
||||
|---|---|---|
|
||||
| 简单模式 | 只暴露正文编辑 + AI 续写 + 自动知识管理,不展示智能体/知识库/市场入口 | 新用户默认体验、轻度使用场景 |
|
||||
| 渐进式披露 | 用户首次使用时只看到核心功能,随使用深度逐步解锁高级功能(智能体关联、知识来源绑定、导出交付等) | 功能入口可见性、导航层级 |
|
||||
| 概念隐藏 | Shadow/Canonical/Archive 等技术概念不暴露给用户,用产品语言替代:Shadow → "AI 建议"、Canonical → "正式内容"、Archive → "历史记录" | 全部用户可见文案、状态标签、帮助文本 |
|
||||
|
||||
简单模式下的自动知识管理:系统对满足自动确认条件的知识草稿(来源为用户自有正文 + 无冲突 + 无外部来源 + 置信度超阈值)自动确认入库,用户无需手动处理。不满足条件的草稿仍进入待确认队列。
|
||||
|
||||
### 0.3 作品工作台信息架构合同
|
||||
|
||||
作品工作台不是把所有功能平铺成同级导航。前端原型和后续实现必须按以下层级组织:
|
||||
|
||||
@ -212,16 +224,31 @@ no-config 不是“没有系统能力”,而是“不要求用户先配置资
|
||||
| 使用角色 | 普通用户。 |
|
||||
| 入口来源 | 作品工作台二级导航、候选知识状态、冲突风险提示、规划项关联知识。 |
|
||||
| 返回规则 | 知识确认或忽略后回到列表并刷新待确认数量;从问题定位返回时保留筛选。 |
|
||||
| 页面区域 | 知识分类、待确认草稿、冲突问题、来源追溯、最近使用、手动修正入口。 |
|
||||
| 可见数据 | 人物、关系、事件、地点、物品、组织、规则、时间线、叙事状态、来源、确认时间、相关章节、风险标记。 |
|
||||
| 主操作 | 确认知识草稿、忽略草稿、重新提取、发起一致性检查。 |
|
||||
| 次操作 | 搜索知识、按实体/来源/风险筛选、定位正文、查看来源、手动修正。 |
|
||||
| 页面区域 | 知识分类、自动确认记录、待确认草稿、冲突问题、来源追溯、最近使用、手动修正入口。 |
|
||||
| 可见数据 | 人物、关系、事件、地点、物品、组织、规则、时间线、叙事状态、来源、确认时间、确认方式(自动/手动)、相关章节、风险标记。 |
|
||||
| 主操作 | 确认知识草稿、忽略草稿、重新提取、发起一致性检查、撤回自动确认。 |
|
||||
| 次操作 | 搜索知识、按实体/来源/风险筛选、定位正文、查看来源、手动修正、查看自动确认记录。 |
|
||||
| 危险操作 | 删除或修改正式知识、批量确认草稿;必须显示来源和影响范围。 |
|
||||
| 状态 | 无知识、待确认、已确认、冲突、来源失效、草稿过期、检查中。 |
|
||||
| 状态 | 无知识、待确认、已自动确认、已手动确认、冲突、来源失效、草稿过期、检查中。 |
|
||||
| 权限 | 需要 `knowledge_confirm` 才能确认或修改正式知识;只读用户只能查看摘要。 |
|
||||
| 产品接口 | 查询作品知识、查询知识草稿列表、确认知识草稿、忽略知识草稿、重新提取知识草稿、发起一致性检查、保存作品知识修正。 |
|
||||
| 埋点与审计 | 记录知识确认、忽略、重新提取、手动修正和一致性检查。 |
|
||||
| 验收要点 | 未确认草稿不能进入正式检索、图查询、生成事实或局域知识库;来源失效草稿不能确认。 |
|
||||
| 产品接口 | 查询作品知识、查询知识草稿列表、确认知识草稿、忽略知识草稿、重新提取知识草稿、发起一致性检查、保存作品知识修正、撤回自动确认知识。 |
|
||||
| 埋点与审计 | 记录知识确认(含自动确认)、忽略、重新提取、撤回自动确认、手动修正和一致性检查。 |
|
||||
| 验收要点 | 未确认草稿不能进入正式检索、图查询、生成事实或局域知识库;来源失效草稿不能确认;自动确认的知识用户可随时在知识面板查看和撤回。 |
|
||||
|
||||
知识自动确认策略:
|
||||
|
||||
| 条件 | 说明 |
|
||||
|---|---|
|
||||
| 来源为用户自有正文 | 草稿提取自当前作品用户保存的正文,非外部来源派生 |
|
||||
| 无冲突 | 草稿内容与现有正式知识无矛盾或重复 |
|
||||
| 无外部来源 | 草稿 lineage 中不包含市场资产、授权知识库或其他外部来源 |
|
||||
| 置信度超阈值 | 系统提取置信度达到自动确认阈值 |
|
||||
|
||||
以上四个条件同时满足时,系统自动确认草稿进入局域知识库。自动确认后:
|
||||
- 用户可在知识面板查看自动确认记录,了解哪些知识被自动入库
|
||||
- 用户可随时撤回自动确认的知识,撤回后知识退出局域知识库
|
||||
- 不满足自动确认条件的草稿进入待确认队列,用户手动处理
|
||||
- 批量确认:低风险草稿(无冲突、无外部来源、置信度高)支持批量确认
|
||||
|
||||
### 3.8 知识草稿详情
|
||||
|
||||
|
||||
@ -164,16 +164,19 @@ no-config 旅程的目标是让普通用户在最低认知负担下完成一次
|
||||
|
||||
### 3.6 知识确认旅程
|
||||
|
||||
1. 用户从写作台候选面板、知识与一致性、导入解析审阅或风险提示进入知识草稿处理。
|
||||
2. 用户查看草稿的来源、上游 lineage、差异、风险、冲突、来源快照和授权状态。
|
||||
3. 用户可以确认来源事实、修改来源事实后确认、改写为用户自有事实、忽略或重新提取。
|
||||
4. 只有来源仍有效、授权未撤销、未被下架或召回、且无阻断冲突的来源型知识草稿,才能以来源事实进入局域知识库。
|
||||
5. 如果用户要把外部来源内容改写为用户自有事实,必须走独立确认路径,显示会断开或改变的来源关系、保留审计和用户意图,不能通过“修改后确认”绕过撤权、下架或召回限制。
|
||||
6. 已确认知识进入 Canonical,后续检索、图查询、质量门控和生成上下文才能使用。
|
||||
1. 大部分知识草稿会自动进入知识库:系统对满足自动确认条件(来源为用户自有正文 + 无冲突 + 无外部来源 + 置信度超阈值)的草稿自动确认入库,用户无需逐条手动处理。
|
||||
2. 自动确认后,用户可在知识面板查看自动确认记录,了解哪些知识被自动入库,可随时撤回。
|
||||
3. 不满足自动确认条件的草稿(存在冲突、包含外部来源、置信度不足)进入待确认队列。
|
||||
4. 用户从写作台候选面板、知识与一致性、导入解析审阅或风险提示进入待确认知识草稿处理。
|
||||
5. 用户查看草稿的来源、上游 lineage、差异、风险、冲突、来源快照和授权状态。
|
||||
6. 用户可以确认来源事实、修改来源事实后确认、改写为用户自有事实、忽略或重新提取。
|
||||
7. 只有来源仍有效、授权未撤销、未被下架或召回、且无阻断冲突的来源型知识草稿,才能以来源事实进入局域知识库。
|
||||
8. 如果用户要把外部来源内容改写为用户自有事实,必须走独立确认路径,显示会断开或改变的来源关系、保留审计和用户意图,不能通过”修改后确认”绕过撤权、下架或召回限制。
|
||||
9. 已确认知识(含自动确认和手动确认)进入 Canonical,后续检索、图查询、质量门控和生成上下文才能使用。
|
||||
|
||||
成功终态:用户确认的知识进入局域知识库;忽略的草稿归档;重提取生成新的待确认草稿。
|
||||
成功终态:自动确认的知识直接进入局域知识库;用户手动确认的知识进入局域知识库;忽略的草稿归档;重提取生成新的待确认草稿。
|
||||
|
||||
失败回退:来源失效、授权撤销、市场下架、召回或冲突未解决时,来源型确认动作禁用。用户可以定位来源、重提取、忽略、保留待处理状态,或在允许时走“改写为用户自有事实”的独立路径。
|
||||
失败回退:来源失效、授权撤销、市场下架、召回或冲突未解决时,来源型确认动作禁用。用户可以定位来源、重提取、忽略、保留待处理状态,或在允许时走”改写为用户自有事实”的独立路径。
|
||||
|
||||
### 3.7 导入解析旅程
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@ Muse 前端拆为两个项目,不能再用一套 Next.js 应用同时承载管
|
||||
| 目标仓库 | 来源 / 形态 | 定位 | 技术栈 | 接口前缀 |
|
||||
|---|---|---|---|---|
|
||||
| `muse-admin/` | fork `yudao-ui-admin-vben`,主应用路径 `apps/web-antd` | 管理后台(Admin Console) | Vue 3 + Vite + Ant Design Vue + TypeScript | `/admin-api/**` |
|
||||
| `muse-studio/` | 自研用户端 | 用户端创作产品(User Workspace / Agent Workspace / Knowledge Workspace / Marketplace / Personal Center) | 建议 Next.js / React / TypeScript | `/app-api/**` |
|
||||
| `muse-studio/` | 自研用户端 | 用户端创作产品(User Workspace / Agent Workspace / Knowledge Workspace / Marketplace / Personal Center) | React + Vite + TypeScript | `/app-api/**` |
|
||||
|
||||
核心原则:
|
||||
|
||||
@ -89,7 +89,7 @@ Vben Admin 的页面入口由后台菜单和权限点驱动。Muse 后续新增
|
||||
|
||||
| 边界 | 管理后台要求 |
|
||||
|---|---|
|
||||
| 路由 | 使用 Vben 路由、菜单、面包屑和权限守卫;不复用 `muse-studio` 的 Next.js 路由 |
|
||||
| 路由 | 使用 Vben 路由、菜单、面包屑和权限守卫;不复用 `muse-studio` 的 React Router 路由 |
|
||||
| 状态 | 使用 Vben 既有 API 请求、表格、表单、弹窗和菜单状态;不保存用户端作品编辑器状态 |
|
||||
| 权限 | 使用 `system` 菜单、按钮、角色、数据范围和高危动作复核;后端仍必须校验业务 owner |
|
||||
| API | 只访问 `/admin-api/**`;不从后台页面调用用户端 `/app-api/**` 完成用户创作决策 |
|
||||
@ -99,9 +99,9 @@ Vben Admin 的页面入口由后台菜单和权限点驱动。Muse 后续新增
|
||||
|
||||
`muse-studio/` 是普通用户使用的创作产品,不走 Vben。
|
||||
|
||||
建议技术栈:
|
||||
技术栈:
|
||||
|
||||
- Next.js App Router / React / TypeScript
|
||||
- React + Vite + TypeScript(SPA,不使用 Next.js;后续文档已全部按纯 React 栈编写)
|
||||
- Tiptap / ProseMirror:正文编辑、Block 级操作和候选合并
|
||||
- TanStack Query:服务器状态、轮询、失效刷新
|
||||
- Zustand 或等价轻量 store:工作台 UI 状态
|
||||
@ -182,11 +182,46 @@ muse-studio/
|
||||
| 表单状态 | Ant Design Vue Form | React Hook Form / local form state |
|
||||
| UI 临时态 | Vben route/menu/modal state | Zustand / component state |
|
||||
| 权限可见性 | 后端菜单和权限点驱动 | `/app-api/muse/me` 权益摘要 + 业务接口结果 |
|
||||
| 待确认内容 | 管理后台只查看、治理或异常处理 | 用户端决策:接受、修改后合并、丢弃、确认知识 |
|
||||
| 待确认内容 | 管理后台只查看、治理或异常处理 | 用户端决策:接受、修改后合并、丢弃、确认知识、规划候选确认 |
|
||||
|
||||
正式事实来自后端 Canonical,待确认内容来自 Shadow,历史来自 Archive。前端不能把本地缓存伪造成正式事实。
|
||||
|
||||
## 6. 接口边界
|
||||
## 6. 实时通信策略
|
||||
|
||||
用户端使用 SSE(Server-Sent Events)作为实时通信方案,分为两类连接:
|
||||
|
||||
### 6.1 AI 生成 streaming 端点
|
||||
|
||||
- 路径:`POST /app-api/muse/ai/generate/stream`
|
||||
- 生命周期:per-request,请求发起时建立 SSE 连接,生成完成后连接关闭。
|
||||
- 用途:AI 正文生成、候选生成等需要流式输出的场景。
|
||||
- 结束信号:服务端发送 `event: done`,payload 包含候选 ID。前端收到后用候选 ID 调用 REST 接口(`GET /app-api/muse/suggestions/{suggestionId}`)获取完整结构化结果(质量评分、来源标注等元数据)。
|
||||
- 错误处理:服务端发送 `event: error` 时,前端展示错误原因并关闭连接。
|
||||
|
||||
### 6.2 统一事件 stream
|
||||
|
||||
- 路径:`GET /app-api/muse/events/stream`
|
||||
- 生命周期:长连接,用户登录后建立,页面关闭时断开。
|
||||
- 用途:接收服务端推送的异步事件通知,前端按 event type 分发到对应处理器。
|
||||
|
||||
事件类型枚举:
|
||||
|
||||
| event type | 含义 | 前端处理 |
|
||||
|---|---|---|
|
||||
| `candidate.arrived` | 新候选到达 | 刷新候选列表,展示新候选提示 |
|
||||
| `task.completed` | 异步任务成功完成 | 停止轮询,刷新任务结果 |
|
||||
| `task.failed` | 异步任务失败 | 停止轮询,展示失败原因 |
|
||||
| `source.changed` | 来源状态变化 | 刷新来源状态,按需禁用操作 |
|
||||
| `knowledge.auto_confirmed` | 知识自动确认 | 刷新知识草稿列表 |
|
||||
|
||||
### 6.3 断线重连策略
|
||||
|
||||
- 重连机制:使用 `lastEventId` 续传。每次收到事件时记录 `lastEventId`,断线重连时通过 `Last-Event-ID` header 告知服务端续传位置。
|
||||
- 服务端保留策略:服务端保留最近 N 分钟事件。重连时如果 `lastEventId` 仍在保留窗口内,从该位置补发后续事件。
|
||||
- resync 降级:如果 `lastEventId` 已过期(超出保留窗口),服务端返回 `event: resync`。前端收到 `resync` 后,放弃增量补发,改为 refetch 当前页面所有相关状态(通过 TanStack Query 的 `invalidateQueries` 批量刷新)。
|
||||
- 退避策略:重连间隔使用指数退避(1s → 2s → 4s → 8s → 最大 30s),连接成功后重置。
|
||||
|
||||
## 7. 接口边界
|
||||
|
||||
- 管理后台只调用 `/admin-api/**`。
|
||||
- 用户端只调用 `/app-api/**`。
|
||||
@ -197,7 +232,7 @@ muse-studio/
|
||||
- 前端禁止绕过接口直接访问数据库、对象存储私有地址、RAGFlow、New-API 或内部模型服务。
|
||||
- 导出和下载前端必须承接服务端返回的导出清单(included/excluded manifest):展示已包含内容、已排除内容、排除原因、下载凭证有效期和来源/授权重验状态。下载凭证过期、来源被召回或授权被撤销时,用户端必须重新检查或重新生成,不能继续显示单一“成功下载”态。
|
||||
|
||||
## 7. 权限与导航边界
|
||||
## 8. 权限与导航边界
|
||||
|
||||
- Vben 管理后台的菜单、按钮和页面权限来自 `system` 菜单权限体系。
|
||||
- `muse-studio` 的导航可见性来自用户权益、授权、作品权限和业务状态。
|
||||
@ -206,7 +241,43 @@ muse-studio/
|
||||
- 用户端不允许通过 URL 进入管理后台配置。
|
||||
- 用户端市场购买、安装、绑定成功后,只刷新授权、安装状态、可用动作和来源授权快照;不会把市场资产内容自动写入作品正文、Local KB 或规划正式事实。
|
||||
|
||||
## 8. 关联阅读
|
||||
## 9. 跨空间跳转与 Handoff 前端消费
|
||||
|
||||
市场购买、安装或绑定资产后,用户需要从市场空间跳转到目标空间(知识库工作台、智能体工作台或作品工作台)完成绑定或使用。Handoff token 是跨空间跳转的前端传递机制。
|
||||
|
||||
### 9.1 Handoff token 前端生命周期
|
||||
|
||||
创建:
|
||||
|
||||
- 市场购买/安装成功后,前端调用 `POST /app-api/muse/marketplace/handoffs` 创建 handoff token。
|
||||
- 服务端返回 `handoffToken`、过期时间和目标 owner 消费入口。
|
||||
|
||||
传递方式:
|
||||
|
||||
- Handoff token 通过 URL query parameter 传递到目标空间页面,例如 `/works/[workId]/knowledge?handoffToken=xxx`。
|
||||
- 前端路由守卫在目标页面解析 `handoffToken` 参数。
|
||||
- 传递后立即从 URL 中移除 `handoffToken`(使用 `replaceState`),避免刷新重复消费。
|
||||
|
||||
目标空间消费:
|
||||
|
||||
- 知识库绑定:目标页面解析 handoff token 后,调用 `POST /app-api/muse/works/{workId}/knowledge-bindings/prechecks` 传入 handoff 信息,获取 `kbBindPrecheckId`,再调用绑定接口完成绑定。
|
||||
- 智能体槽位替换:目标页面调用 `POST /app-api/muse/works/{workId}/agent-slots/{slotKey}/prechecks` 传入 handoff 信息,获取 `agentSlotPrecheckId`,再调用绑定接口完成槽位替换。
|
||||
- 前端不能自造 precheck,必须由目标 owner 基于 handoff token 生成。
|
||||
|
||||
过期/取消处理:
|
||||
|
||||
- Handoff token 有短期时效(服务端定义)。
|
||||
- 过期时前端展示"跳转授权已过期,请返回市场重新操作",引导用户回到市场空间。
|
||||
- 用户可主动取消(`POST /app-api/muse/marketplace/handoffs/{handoffToken}/cancel`)。
|
||||
- 已消费的 handoff 不可重复使用;重复消费返回 `MARKET_HANDOFF_INVALID`,前端提示并引导刷新。
|
||||
|
||||
### 9.2 Handoff 状态查询
|
||||
|
||||
- 前端可调用 `GET /app-api/muse/marketplace/handoffs/{handoffToken}` 查询 handoff 当前状态。
|
||||
- 状态包括:有效、已消费、已过期、已取消。
|
||||
- 目标页面在消费前应先查询状态,避免对已失效 handoff 发起无效请求。
|
||||
|
||||
## 10. 关联阅读
|
||||
|
||||
- 产品定位:`产品-01-产品定位与核心价值.md`
|
||||
- 功能总纲:`产品-02-核心功能与交互边界.md`
|
||||
|
||||
@ -48,7 +48,65 @@ muse-studio
|
||||
| 本地继续编辑后服务端失败 | 禁止静默覆盖新输入,进入显式冲突态 |
|
||||
| 来源或授权变化 | 拦截接受/确认动作,引导重验或重新生成 |
|
||||
|
||||
## 4. 待确认对象分组
|
||||
## 4. 正文持久化与恢复
|
||||
|
||||
### 4.1 自动保存
|
||||
|
||||
编辑器内容变化后 debounce 2s 触发保存到服务端(`PUT /app-api/muse/works/{workId}/blocks/{blockId}`),携带 `expectedRevision` 做乐观并发控制。
|
||||
|
||||
保存状态指示器:
|
||||
|
||||
| 状态 | UI 展示 | 说明 |
|
||||
|---|---|---|
|
||||
| 已保存 | "已保存" + 时间戳 | 最近一次保存成功 |
|
||||
| 保存中 | "保存中..." + loading | debounce 触发后等待响应 |
|
||||
| 保存失败 | "保存失败(点击重试)" + 错误色 | 网络异常或 revision 冲突 |
|
||||
|
||||
### 4.2 IndexedDB 安全网
|
||||
|
||||
- 每次编辑变化同步写入 IndexedDB,key 为 `workId + blockId`,value 包含内容、本地时间戳和最后已知 revision。
|
||||
- IndexedDB 写入不依赖服务端响应,作为崩溃恢复安全网。
|
||||
- 正常情况下用户无感知 IndexedDB 的存在。
|
||||
|
||||
### 4.3 恢复入口
|
||||
|
||||
- 页面加载时对比 IndexedDB 版本与服务端版本(通过本地时间戳和服务端 `updatedAt` 比较)。
|
||||
- 如果 IndexedDB 内容比服务端更新(说明上次保存未成功提交),展示恢复提示:"检测到未保存的本地修改,是否恢复?"
|
||||
- 用户选择恢复:将 IndexedDB 内容加载到编辑器,触发一次保存。
|
||||
- 用户选择放弃:清除 IndexedDB 中该 Block 的本地缓存,使用服务端版本。
|
||||
- 保存成功后清除对应 IndexedDB 条目(或更新为与服务端一致)。
|
||||
|
||||
## 5. Block 模型与编辑器映射
|
||||
|
||||
### 5.1 Block 粒度
|
||||
|
||||
Block 粒度为场景/小节级。一个 Block 对应正文中一个相对独立的叙事单元(如一个场景、一个小节)。
|
||||
|
||||
### 5.2 分割点识别
|
||||
|
||||
- 自动识别:标题模式自动识别分割点,匹配 `##` 或「第X节」「第X章」等模式。
|
||||
- 手动标记:用户可在编辑器中手动插入或移除分割标记。
|
||||
- 编辑器中分割点可见(如水平分隔线 + 标签),但不干扰正常阅读和编辑。
|
||||
|
||||
### 5.3 Block 与 ProseMirror 的映射
|
||||
|
||||
- 每个 Block 对应一个独立的 ProseMirror Document(或顶级 Node)。
|
||||
- 编辑器加载时按 Block 顺序拼装为完整文档视图,Block 边界以不可编辑的分隔节点标识。
|
||||
- 每个 Block 独立维护 revision 和保存状态。
|
||||
|
||||
### 5.4 跨 Block 操作
|
||||
|
||||
- 选中跨 Block 文本时,操作拆分为对两个 Block 的独立修改,分别提交各自的 `expectedRevision`。
|
||||
- 跨 Block 删除、粘贴等操作在前端拆分为多个 Block 级 Transaction,按顺序提交。
|
||||
- 如果其中一个 Block 提交失败(revision 冲突),前端回滚该 Block 的本地变更并进入冲突处理。
|
||||
|
||||
### 5.5 AI 候选合并
|
||||
|
||||
- 接受候选时,通过 ProseMirror Transaction 替换目标 Block 内容。
|
||||
- Transaction 保留 undo history,用户可撤销合并操作(本地撤销不影响服务端已提交的 revision)。
|
||||
- 合并后立即触发保存,携带候选接受接口返回的新 revision。
|
||||
|
||||
## 6. 待确认对象分组
|
||||
|
||||
| 用户语言 | 底层对象 | 用户动作 |
|
||||
|---|---|---|
|
||||
@ -64,7 +122,7 @@ muse-studio
|
||||
|
||||
规划候选的接受、修改后保存和丢弃必须走规划 owner 的 `/app-api/**` 决策接口,由后端写入或拒绝写入规划正式事实。前端不得复用 AI Suggestion 的 accept 接口,也不得把规划确认塞进动态表单的通用保存动作。
|
||||
|
||||
## 5. AI 候选卡
|
||||
## 7. AI 候选卡
|
||||
|
||||
候选卡至少展示:
|
||||
|
||||
@ -73,10 +131,9 @@ muse-studio
|
||||
- 创作健康度和质量维度摘要。
|
||||
- 风险标记。
|
||||
- 使用和排除的来源。
|
||||
- 服务端候选决策包(Candidate Decision Envelope)的用户可读摘要;用户界面不显示内部合同名。
|
||||
- 可用动作。
|
||||
- 可用动作和硬闸门状态摘要(用户可读语言,不显示内部合同名)。
|
||||
|
||||
动作展示必须等待服务端返回最新 Candidate Decision Envelope 和硬闸门结果。前端可以展示本地草稿、质量摘要和加载态,但不能基于本地评分、本地 Zod 校验或按钮可见性自行允许接受或合并。
|
||||
动作展示必须等待服务端返回最新硬闸门结果。前端可以展示本地草稿、质量摘要和加载态,但不能基于本地评分、本地 Zod 校验或按钮可见性自行允许接受或合并。
|
||||
|
||||
动作约束:
|
||||
|
||||
@ -117,7 +174,16 @@ muse-studio
|
||||
- “引用来源已被召回,当前候选不能继续接受”
|
||||
- “安装成功,可在作品中选择使用”
|
||||
|
||||
## 6. 创作健康度展示
|
||||
### 7.1 候选接受与来源校验
|
||||
|
||||
接受时前端调用接口(`POST /app-api/muse/suggestions/{suggestionId}/accept`),后端实时校验来源版本和授权状态。前端不在本地缓存或判定来源有效性,每次接受操作由服务端做最终决策。
|
||||
|
||||
- 接受前:前端调用候选详情接口获取最新可用动作和硬闸门状态。
|
||||
- 接受请求:传入 `suggestionId`、`expectedRevision` 和 `commandId`。
|
||||
- 版本不匹配:服务端返回 `STATE_CONFLICT`,前端刷新候选卡状态和可用动作。
|
||||
- 来源失效:服务端返回阻断原因,前端展示用户可理解的阻断说明。
|
||||
|
||||
## 8. 创作健康度展示
|
||||
|
||||
创作健康度是候选解释,不是作品排名。
|
||||
|
||||
@ -130,10 +196,149 @@ muse-studio
|
||||
- 下一步动作:接受、修改后合并、丢弃、重生成、重验来源。
|
||||
|
||||
前端不能绕过 blocked / invalidated / needs_recheck 接受候选。
|
||||
<!-- 注:此处 needs_recheck 是 ActionPolicy 或 qualityState 层面的值,不是 SourceStatus 枚举值 -->
|
||||
|
||||
候选状态 `invalidated` 的 UI 处理:展示"已失效,不可接受",禁用接受和合并按钮,允许用户触发重新生成。候选失效原因(来源撤权、授权过期、质量结果过期等)必须以产品语言展示。
|
||||
|
||||
用户可以选择开放槽位中的智能体或知识库,但不能替换输入输出合规、拆分切块、RAG 入库、语义安全围栏、静态检查、质量门控、权限、审计和 Shadow -> Canonical 等保护节点。写作台只展示可选项和不可用原因,不暴露底层 Pipeline 控制权。
|
||||
|
||||
## 7. 同步与恢复
|
||||
### 8.1 Source Status 前端处理策略
|
||||
|
||||
来源状态(Source Status)是候选、知识草稿、绑定和导出动作的前置条件。前端必须统一处理来源状态到 UI 的映射(参见 `后端-05-统一API契约-v1.md` §4.2 Source Status 定义)。
|
||||
|
||||
来源状态到 UI 映射表:
|
||||
|
||||
| sourceStatus | UI 展示 | 接受/确认按钮 | 用户可用动作 |
|
||||
|---|---|---|---|
|
||||
| `active` | 来源正常(默认不额外提示) | 启用 | 正常操作 |
|
||||
| `stale` | "来源版本已更新,建议刷新" | 启用(带警告) | 刷新来源、继续操作 |
|
||||
| `needs_recheck` | "来源需要重新验证" | 禁用 | 触发重验 |
|
||||
<!-- 注:此处 needs_recheck 作为 sourceStatus UI 映射候选值,实际是 ActionPolicy 层面的判定结论;SourceStatus 合法值不含 needs_recheck,前端应以 actionPolicy=needs_recheck 驱动此 UI -->
|
||||
| `revoked` | "来源授权已撤销" | 禁用 | 查看原因、替换来源 |
|
||||
| `recalled` | "来源已被召回" | 禁用 | 查看原因、替换来源 |
|
||||
| `delisted` | "来源已下架" | 禁用 | 查看原因、替换来源 |
|
||||
| `blocked` | "来源已被阻断" | 禁用 | 查看原因、替换来源 |
|
||||
| `owner_missing` | "来源归属缺失" | 禁用 | 联系支持、替换来源 |
|
||||
| `unauthorized` | "来源授权不足" | 禁用 | 重新授权、替换来源 |
|
||||
|
||||
查询时机:
|
||||
|
||||
- 候选展示时:候选详情接口返回 `sourceSnapshot` 包含当前来源状态。
|
||||
- 定期轮询:对处于 `needs_recheck` 或 `stale` 的来源,前端按 TanStack Query 的 `refetchInterval` 定期刷新状态(建议 30s-60s)。
|
||||
<!-- 注:此处 needs_recheck 指 actionPolicy=needs_recheck 的判定结论,不是 SourceStatus 枚举值 -->
|
||||
- 用户主动刷新:提供"刷新来源状态"按钮。
|
||||
|
||||
重验触发和结果展示:
|
||||
|
||||
- 用户点击"重新验证"调用 `POST /app-api/muse/source-status/recheck`,返回 `jobId`。
|
||||
- 重验是异步任务,前端进入轮询等待。
|
||||
- 重验完成后刷新来源状态;如果恢复为 `active`,重新启用接受/确认按钮。
|
||||
- 重验失败或来源仍不可用时,展示失败原因和下一步建议。
|
||||
|
||||
来源失效时的 UI 降级:
|
||||
|
||||
- 禁用接受、确认、绑定和导出按钮。
|
||||
- 展示失效原因(使用产品语言,不暴露技术状态码)。
|
||||
- 候选卡标记为"来源不可用",视觉降级(灰色或警告色)。
|
||||
- 已展示的候选内容保留可读,但不可操作。
|
||||
|
||||
## 9. 作品规划台交互
|
||||
|
||||
作品规划台(Planning Desk)是用户打开某个作品后的规划入口,与写作台平级。
|
||||
|
||||
### 9.1 一级入口切换
|
||||
|
||||
规划台包含五个一级入口,以 Tab 或侧边导航切换:
|
||||
|
||||
| 入口 | 内容 | 切换逻辑 |
|
||||
|---|---|---|
|
||||
| 作品设定 | 题材、类型、主题、基调、禁区、结局方向 | 默认入口;切换时拉取最新投影和已确认数据 |
|
||||
| 章节大纲 | 章节顺序、摘要、目标、主线、支线、伏笔、情节节拍 | 切换时加载章节列表和大纲结构 |
|
||||
| 世界设定 | 角色、地点、物品、组织、规则、事件、时间线 | 切换时加载世界设定投影 |
|
||||
| 角色关系 | 角色档案、目标、动机、弱点、秘密、弧光、关系变化 | 切换时加载角色列表和关系图数据 |
|
||||
| 文风检查 | 作者声音、句式、节奏、视角、风格漂移 | 切换时加载最近检查结果或空态 |
|
||||
|
||||
切换逻辑约束:
|
||||
|
||||
- 每次切换调用 `/app-api/muse/works/{workId}/meta-projections/{projectionKey}` 获取当前 section 的可见结构和数据。
|
||||
- 切换不丢弃用户未提交的本地草稿;离开时提示保存或放弃。
|
||||
- 各 section 的表单渲染由 MetaSchema 动态表单驱动(参见 `前端-03-元引擎与动态表单.md` §5.2 用户端渲染链路)。
|
||||
|
||||
### 9.2 规划候选展示与确认
|
||||
|
||||
用户触发 AI 生成、补全或整理后,结果以规划候选卡展示:
|
||||
|
||||
- 候选卡展示候选方案、来源摘要、质量结果和 diff(与当前正式规划的差异)。
|
||||
- 可用动作:接受为规划项、修改后保存、丢弃。
|
||||
- 接受调用 `POST /app-api/muse/works/{workId}/planning/candidates/{candidateId}/confirm`。
|
||||
- 丢弃调用 `POST /app-api/muse/works/{workId}/planning/candidates/{candidateId}/discard`。
|
||||
- 修改后保存:用户编辑候选内容后调用 confirm,传入修改后的数据。
|
||||
- 候选确认必须带 `commandId`、`expectedRevision`、`sourceSnapshot`、`authorizationSnapshotId`。
|
||||
|
||||
多组候选时以列表或对比视图展示,用户逐一确认或丢弃。
|
||||
|
||||
### 9.3 文风检查结果展示
|
||||
|
||||
文风检查是异步任务:
|
||||
|
||||
1. 用户点击"文风检查"触发 `POST /app-api/muse/works/{workId}/planning/style-checks`,返回 `jobId`。
|
||||
2. 前端进入轮询或通知等待。
|
||||
3. 完成后调用 `GET /app-api/muse/works/{workId}/planning/style-checks/{jobId}` 获取结果。
|
||||
4. 展示内容:风格漂移标记、句式分析、节奏评估、视角一致性、禁用风格命中和建议入口。
|
||||
5. 检查结果只读展示,不直接修改正文或规划;用户可据此手动调整或触发重新生成。
|
||||
|
||||
### 9.4 动态表单渲染
|
||||
|
||||
规划台各 section 的表单字段、校验规则、可见性和可编辑状态均由后端投影返回,前端按 MetaSchema 动态表单渲染(参见 `前端-03-元引擎与动态表单.md` §3 用户端创作表单和 §5.2 用户端渲染链路)。
|
||||
|
||||
提交时必须带 `expectedSchemaVersion`、`expectedProjectionVersion` 和 `expectedDataRevision`,走 planning owner 的 `PUT /app-api/muse/works/{workId}/planning/{sectionKey}` 接口。
|
||||
|
||||
## 10. 知识与一致性工作面
|
||||
|
||||
知识与一致性工作面是用户在作品工作台中管理局域知识、处理知识草稿和检查一致性的入口。
|
||||
|
||||
### 10.1 局域知识库浏览
|
||||
|
||||
- 入口:作品工作台的"知识"Tab 或侧边导航。
|
||||
- 调用 `GET /app-api/muse/works/{workId}/local-knowledge` 获取当前作品 Local KB 内容。
|
||||
- 展示已确认知识条目列表,支持按类型(角色、地点、物品、规则等)筛选。
|
||||
- 每条知识展示来源归因、确认时间和关联章节。
|
||||
- 只读浏览;修正入口见 §8.4。
|
||||
|
||||
### 10.2 知识草稿处理
|
||||
|
||||
知识草稿(Knowledge Draft)来自 AI 提取、导入解析或正文候选合并后的重新提取。
|
||||
|
||||
列表展示:
|
||||
|
||||
- 调用 `GET /app-api/muse/works/{workId}/knowledge-drafts` 获取待确认草稿列表。
|
||||
- 每条草稿展示:提取内容摘要、来源章节/Block、来源状态、风险标记。
|
||||
- 状态标记:`pending`(待确认)、`confirmed`(已确认)、`ignored`(已忽略)、`invalidated`(已失效)、`needs_reextract`(需重新提取)。
|
||||
|
||||
详情与动作:
|
||||
|
||||
- 点击草稿进入详情,展示完整提取内容、来源 lineage 和授权快照。
|
||||
- 可用动作:确认(`POST /app-api/muse/knowledge-drafts/{draftId}/confirm`)、忽略(`POST /app-api/muse/knowledge-drafts/{draftId}/ignore`)、重验来源(`POST /app-api/muse/knowledge-drafts/{draftId}/recheck`)。
|
||||
- `invalidated` 状态展示"已失效,不可接受",允许触发重新生成。
|
||||
- `needs_reextract` 状态展示"需重新提取,原草稿已过时",引导用户触发重新提取或等待系统自动重新提取。
|
||||
|
||||
### 10.3 一致性检查结果展示
|
||||
|
||||
一致性检查由 AI 任务产生,结果展示:
|
||||
|
||||
- 设定冲突列表:冲突的知识条目对、冲突类型和严重性。
|
||||
- 角色失声提醒:长期未出现的角色或关系停滞。
|
||||
- 时间线矛盾:事件顺序或时间跨度不一致。
|
||||
- 每条结果关联到具体章节和知识条目,支持跳转定位。
|
||||
- 结果只读展示,不自动修正。
|
||||
|
||||
### 10.4 手动修正入口
|
||||
|
||||
- 用户可从一致性检查结果或局域知识浏览中发起手动修正。
|
||||
- 修正走规划 owner 或知识 owner 的对应命令接口,不走通用动态字段保存。
|
||||
- 修正后相关知识草稿可能失效,需重新提取。
|
||||
|
||||
## 11. 同步与恢复
|
||||
|
||||
服务器状态建议由 TanStack Query 管理:
|
||||
|
||||
@ -160,22 +365,29 @@ muse-studio
|
||||
3. 不可重试失败禁用动作并解释原因。
|
||||
4. 任务型操作进入轮询或通知,不阻塞正文已成功保存的主事务。
|
||||
|
||||
## 8. 导入解析与导出 UI
|
||||
## 12. 导入解析与导出 UI
|
||||
|
||||
- 导入入口属于作品工作台,不属于作品列表深层弹窗。
|
||||
- 导入正文可初始化章节和 Block。
|
||||
- 全书解析必须展示章节级进度、失败原因和章节审阅入口。
|
||||
- 章节审阅确认只推进到 Knowledge Draft 处理,不直接写 Local KB。
|
||||
- 详情页负责解释,不提供逐条绕过章节边界的确认。
|
||||
全书解析审阅交互:
|
||||
|
||||
- 章节级确认/驳回:每个 Chapter Parse Result 独立展示,用户可逐章确认(`POST /app-api/muse/chapter-parse-results/{resultId}/confirm`)或驳回(`POST /app-api/muse/chapter-parse-results/{resultId}/reject`)。
|
||||
- 一键确认可确认章节:对所有状态为可确认且无高风险标记的章节,提供批量确认入口(`POST /app-api/muse/parse-jobs/{jobId}/chapters/batch-confirm`)。批量确认以章节为事务边界,允许部分失败。
|
||||
- 高风险冲突处理:高风险章节(来源状态异常、质量阻断、revision 冲突)标记为不可批量确认,必须逐章审阅后单独处理。
|
||||
- 部分失败展示:批量确认响应返回 `confirmedChapterResultIds`、`failedChapters`、`skippedChapters` 和 `partialFailure` 标记。前端按逐章结果展示成功、失败原因和可重试项;某章失败不影响已成功章节。
|
||||
|
||||
- 导出入口属于作品工作台,必须展示服务端返回的已包含/已排除导出清单(included/excluded manifest)、排除原因和可恢复动作。
|
||||
- 下载凭证有时效和授权快照;凭证过期、来源被召回、授权被撤销或任务进入需重验时,前端必须禁用下载并引导重新检查或重新导出。
|
||||
- 导出成功态不能压扁成单一“下载成功”;页面还要保留导出记录、下载状态、凭证失效、来源撤销后重验和部分内容被排除的说明。
|
||||
|
||||
## 9. 与管理后台关系
|
||||
## 13. 与管理后台关系
|
||||
|
||||
管理后台可以查看内容异常、导入导出记录、任务失败和治理摘要,但不承载普通用户写作台。管理员不能通过后台替用户接受 AI 候选、保存正文或确认作品知识。
|
||||
|
||||
## 10. 关联阅读
|
||||
## 14. 关联阅读
|
||||
|
||||
- 用户工作区规格:`产品-02C-用户工作区与作品工作台功能规格.md`
|
||||
- 普通用户操作流程:`流程-01B-普通用户操作流程(操作视角).md`
|
||||
|
||||
@ -119,7 +119,7 @@
|
||||
|
||||
用户确认必须走对应业务入口:规划候选进入规划正式事实,Knowledge Draft 进入 Local KB,正文候选进入正文 Block。规划候选的接受、修改后保存和丢弃必须走 planning owner 的 `/app-api/**` 决策接口,不得复用 AI Suggestion accept,也不得通过动态表单通用保存写入规划正式事实。
|
||||
|
||||
前端不得把 `PUT /dynamic-fields/{targetType}/{targetId}` 封装成可写任意目标事实的通用 SDK。即使后端接口路径包含 dynamic-fields,也必须由当前 owner 投影限定 targetType、targetId、可编辑字段、版本和动作语义;规划、知识、正文的正式事实仍分别通过 Planning / Knowledge / Content owner action 进入。
|
||||
前端禁止封装通用动态字段写入 SDK。动态字段没有跨 owner 的通用写接口(参见 `后端-05-统一API契约-v1.md` §4.3 作品和正文中的投影说明);正式写入必须回到目标 owner 命令路径:规划写 `PUT /app-api/muse/works/{workId}/planning/{sectionKey}`,正文写 `PUT /app-api/muse/blocks/{blockId}`,知识写 Knowledge Draft confirm/ignore 命令,Agent 写 Agent 配置命令。前端只能调用 `/app-api/muse/works/{workId}/dynamic-fields/validate` 做校验和路由建议,不能据此直接写入任何 Canonical fact。
|
||||
|
||||
### 5.3 版本兼容和提交合同
|
||||
|
||||
|
||||
840
design-docs/前端-04-市场与个人中心交互.md
Normal file
840
design-docs/前端-04-市场与个人中心交互.md
Normal file
@ -0,0 +1,840 @@
|
||||
# 前端-04:市场与个人中心交互
|
||||
|
||||
- 版本:v1
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:前端开发者
|
||||
- 阅读时间:40-60 分钟
|
||||
- 归属仓库:`muse-studio/`(用户端)+ `muse-admin/`(管理端市场治理)
|
||||
- 边界说明:本文件定义市场空间和个人中心空间在 `muse-studio` 用户端的前端交互设计,包括页面结构、组件职责、API 调用、状态管理、Handoff 消费和错误处理。精确 API 看 `后端-05`,产品功能规格看 `产品-02F` 和 `产品-02G`,Handoff 机制看 `架构-01`。
|
||||
|
||||
---
|
||||
|
||||
## 1. 路由结构
|
||||
|
||||
基于 `前端-01` 的路由约定,市场和个人中心在 `muse-studio/` 中的路由组织如下:
|
||||
|
||||
```text
|
||||
muse-studio/
|
||||
app/
|
||||
(user)/
|
||||
marketplace/
|
||||
page.tsx # 市场首页与发现
|
||||
categories/
|
||||
page.tsx # 分类推荐与曝光
|
||||
assets/
|
||||
[assetId]/
|
||||
page.tsx # 资产详情
|
||||
acquire/page.tsx # 获取授权确认
|
||||
install/page.tsx # 安装与跳转授权入口
|
||||
records/page.tsx # 资产级记录
|
||||
governance/page.tsx # 治理结果与申诉
|
||||
publish/
|
||||
page.tsx # 发布者资产与提交状态
|
||||
[draftId]/page.tsx # 发布提交
|
||||
profile/
|
||||
page.tsx # 账户总览
|
||||
info/page.tsx # 个人资料与账号信息
|
||||
security/page.tsx # 安全与登录
|
||||
preferences/page.tsx # 偏好与通知
|
||||
usage/page.tsx # Token 与用量总览
|
||||
entitlements/page.tsx # 权益与配额
|
||||
authorizations/page.tsx # 授权获取记录
|
||||
purchases/page.tsx # 购买记录
|
||||
installations/page.tsx # 安装与绑定摘要
|
||||
publications/page.tsx # 发布记录总览
|
||||
components/
|
||||
marketplace/
|
||||
personal-center/
|
||||
```
|
||||
|
||||
## 2. 市场空间
|
||||
|
||||
### 2.1 页面结构总览
|
||||
|
||||
| 页面 | 路由 | 核心组件 | 主要 API |
|
||||
|---|---|---|---|
|
||||
| 市场首页与发现 | `/marketplace` | `MarketSearch`, `AssetTypeTab`, `RecommendSection`, `AssetList` | `GET /app-api/muse/marketplace/assets`, `GET /app-api/muse/marketplace/categories` |
|
||||
| 分类推荐与曝光 | `/marketplace/categories` | `CategoryTree`, `TopicCard`, `ExposureSummary` | `GET /app-api/muse/marketplace/categories` |
|
||||
| 资产详情 | `/marketplace/assets/[assetId]` | `AssetHeader`, `LicensePanel`, `VersionInfo`, `GovernanceAlert`, `ActionBar` | `GET /app-api/muse/marketplace/assets/{assetId}` |
|
||||
| 获取授权确认 | `/marketplace/assets/[assetId]/acquire` | `LicenseConfirm`, `RestrictionList`, `ExternalAuthRef` | `POST /app-api/muse/marketplace/assets/{assetId}/purchase` |
|
||||
| 安装与跳转授权 | `/marketplace/assets/[assetId]/install` | `InstallPanel`, `TargetSelector`, `HandoffGenerator` | `POST /app-api/muse/marketplace/assets/{assetId}/install`, `POST /app-api/muse/marketplace/handoffs` |
|
||||
| 发布者资产 | `/marketplace/publish` | `PublisherAssetList`, `StatusFilter`, `ExposureBadge` | `GET /app-api/muse/marketplace/my-publish-records` |
|
||||
| 发布提交 | `/marketplace/publish/[draftId]` | `PublishForm`, `CheckRunner`, `SubmitConfirm` | `POST /app-api/muse/marketplace/publish-drafts`, `POST /app-api/muse/marketplace/publish-drafts/{draftId}/checks`, `POST /app-api/muse/marketplace/publish-requests` |
|
||||
| 治理结果与申诉 | `/marketplace/assets/[assetId]/governance` | `GovernanceResult`, `ImpactList`, `AppealForm` | `GET /app-api/muse/marketplace/assets/{assetId}/governance-impact`, `POST /app-api/muse/marketplace/appeals` |
|
||||
| 资产级记录 | `/marketplace/assets/[assetId]/records` | `RecordTimeline`, `RecordFilter` | 资产级记录通过详情页内嵌展示 |
|
||||
|
||||
### 2.2 资产发现交互
|
||||
|
||||
#### 2.2.1 搜索与筛选
|
||||
|
||||
```typescript
|
||||
// lib/queries/marketplace.ts
|
||||
// 市场资产列表查询 hook
|
||||
export function useMarketplaceAssets(params: MarketplaceAssetsParams) {
|
||||
return useQuery({
|
||||
queryKey: ['marketplace', 'assets', params],
|
||||
queryFn: () => fetchMarketplaceAssets(params),
|
||||
// 保持搜索词、分类、筛选和滚动位置
|
||||
// 注意:keepPreviousData 是 TanStack Query v4 写法,v5 改用 placeholderData: keepPreviousData(从 @tanstack/react-query 导入)
|
||||
keepPreviousData: true,
|
||||
});
|
||||
}
|
||||
|
||||
interface MarketplaceAssetsParams {
|
||||
keyword?: string; // 搜索关键词
|
||||
assetType?: 'work' | 'agent' | 'knowledge_base'; // 资产类型
|
||||
categoryId?: string; // 分类 ID
|
||||
licenseType?: string; // 许可类型筛选
|
||||
status?: string; // 状态筛选
|
||||
sortBy?: 'relevance' | 'newest' | 'popular'; // 排序
|
||||
pageNo: number;
|
||||
pageSize: number;
|
||||
}
|
||||
```
|
||||
|
||||
交互规则:
|
||||
|
||||
- 搜索框支持即时搜索(debounce 300ms),按资产类型 Tab 切换不清空搜索词。
|
||||
- 筛选条件变化时重置分页到第一页,保留搜索词。
|
||||
- 从详情页返回时恢复搜索词、分类、筛选和滚动位置(通过 URL searchParams 持久化)。
|
||||
- 未登录用户只能浏览公开摘要,获取、安装、绑定和收藏操作需要登录。
|
||||
|
||||
#### 2.2.2 推荐位
|
||||
|
||||
推荐区独立加载,失败不阻断列表渲染:
|
||||
|
||||
```typescript
|
||||
// 推荐位独立查询,失败时静默降级
|
||||
export function useMarketplaceRecommendations() {
|
||||
return useQuery({
|
||||
queryKey: ['marketplace', 'recommendations'],
|
||||
queryFn: () => fetchCategories(), // GET /app-api/muse/marketplace/categories
|
||||
retry: 1,
|
||||
// 注意:useErrorBoundary 是 TanStack Query v4 写法,v5 改用 throwOnError
|
||||
// 推荐位加载失败不影响主列表
|
||||
useErrorBoundary: false,
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2.3 收藏
|
||||
|
||||
```typescript
|
||||
// 收藏/取消收藏 mutation
|
||||
export function useFavoriteAsset() {
|
||||
return useMutation({
|
||||
mutationFn: ({ assetId, action }: { assetId: string; action: 'add' | 'remove' }) =>
|
||||
action === 'add'
|
||||
? postFavorite(assetId) // POST /app-api/muse/marketplace/assets/{assetId}/favorite
|
||||
: deleteFavorite(assetId), // DELETE /app-api/muse/marketplace/assets/{assetId}/favorite
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries(['marketplace', 'assets']);
|
||||
},
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 购买/安装流程 UI
|
||||
|
||||
#### 2.3.1 获取授权确认页
|
||||
|
||||
获取授权确认页展示许可、版本、限制和外部授权引用状态。核心交互流程:
|
||||
|
||||
1. 进入页面时加载资产详情和获取确认信息。
|
||||
2. 展示许可范围、允许用途、禁止用途、有效期。
|
||||
3. 用户确认后调用购买接口,必须携带 `commandId` 幂等键。
|
||||
4. 获取成功后可选择进入安装页或返回详情。
|
||||
|
||||
```typescript
|
||||
// 获取授权 mutation
|
||||
export function usePurchaseAsset() {
|
||||
return useMutation({
|
||||
mutationFn: (params: {
|
||||
assetId: string;
|
||||
commandId: string; // 幂等键,前端生成 UUID
|
||||
}) => postPurchase(params.assetId, { commandId: params.commandId }),
|
||||
// POST /app-api/muse/marketplace/assets/{assetId}/purchase
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
状态管理:
|
||||
|
||||
| 状态 | UI 表现 | 用户动作 |
|
||||
|---|---|---|
|
||||
| 可获取 | 主按钮"确认获取"可用 | 点击确认 |
|
||||
| 需登录 | 主按钮禁用,提示登录 | 跳转登录 |
|
||||
| 外部授权待确认 | 主按钮禁用,展示外部状态 | 刷新外部授权 |
|
||||
| 授权失败 | 展示失败原因 | 重试或返回 |
|
||||
| 已拥有 | 展示"已获取",引导安装 | 跳转安装页 |
|
||||
| 资产不可获取 | 展示原因(下架/召回) | 返回列表 |
|
||||
|
||||
#### 2.3.2 安装流程
|
||||
|
||||
安装只适用于智能体和知识库资产。安装成功只表示资产进入账户可用列表,不等于绑定到作品。
|
||||
|
||||
```typescript
|
||||
// 安装 mutation
|
||||
export function useInstallAsset() {
|
||||
return useMutation({
|
||||
mutationFn: (params: {
|
||||
assetId: string;
|
||||
commandId: string;
|
||||
}) => postInstall(params.assetId, { commandId: params.commandId }),
|
||||
// POST /app-api/muse/marketplace/assets/{assetId}/install
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.3.3 安装进度与结果
|
||||
|
||||
安装为同步操作,响应直接返回安装状态。UI 展示:
|
||||
|
||||
- 安装中:按钮 loading 态。
|
||||
- 安装成功:展示"已安装"标记,显示可绑定目标摘要和跳转入口。
|
||||
- 安装失败:展示失败原因(授权失效、版本不可用、来源下架)。
|
||||
|
||||
### 2.4 Handoff 机制的前端消费
|
||||
|
||||
#### 2.4.1 Handoff 概述
|
||||
|
||||
市场跨空间跳转使用服务端签发的一次性 handoff token。前端职责:
|
||||
|
||||
1. 在市场空间发起 handoff 创建请求。
|
||||
2. 获取 handoff token 和目标页 URL。
|
||||
3. 携带 token 跳转到目标 owner 空间。
|
||||
4. 目标空间落地后消费 token,获取 handoff session。
|
||||
5. 基于 session 执行目标 owner 的预检和确认。
|
||||
|
||||
#### 2.4.2 创建 Handoff
|
||||
|
||||
```typescript
|
||||
// 创建市场 handoff
|
||||
export function useCreateHandoff() {
|
||||
return useMutation({
|
||||
mutationFn: (params: CreateHandoffParams) =>
|
||||
postHandoff(params),
|
||||
// POST /app-api/muse/marketplace/handoffs
|
||||
});
|
||||
}
|
||||
|
||||
interface CreateHandoffParams {
|
||||
assetId: string;
|
||||
targetOwner: 'knowledge' | 'agent' | 'content';
|
||||
targetAction: 'bind' | 'slot_bind' | 'asset_use';
|
||||
targetWorkId?: string;
|
||||
returnUrl: string; // 返回点
|
||||
commandId: string; // 幂等键
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.4.3 目标空间消费 Handoff
|
||||
|
||||
目标空间(如作品知识来源页)落地时:
|
||||
|
||||
```typescript
|
||||
// 目标空间消费 handoff token
|
||||
export function useConsumeHandoff(handoffToken: string | null) {
|
||||
return useQuery({
|
||||
queryKey: ['handoff', handoffToken],
|
||||
queryFn: () => getHandoffStatus(handoffToken!),
|
||||
// GET /app-api/muse/marketplace/handoffs/{handoffToken}
|
||||
enabled: !!handoffToken,
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.4.4 Token 过期处理
|
||||
|
||||
| 场景 | 错误码 | 前端处理 |
|
||||
|---|---|---|
|
||||
| Token 不存在 | `MARKET_HANDOFF_INVALID` | 返回市场刷新状态 |
|
||||
| Token 已过期 | `PRECHECK_EXPIRED` | 提示过期,引导重新发起 |
|
||||
| Token 已消费 | `MARKET_HANDOFF_INVALID` | 展示已消费状态 |
|
||||
| Token 已取消 | `MARKET_HANDOFF_INVALID` | 返回市场 |
|
||||
| 目标 owner 不匹配 | `MARKET_HANDOFF_INVALID` | 返回市场刷新 |
|
||||
|
||||
#### 2.4.5 Handoff 状态轮询
|
||||
|
||||
对于需要等待目标空间确认的场景,市场侧可轮询 handoff 状态:
|
||||
|
||||
```typescript
|
||||
// 轮询 handoff 状态(用户从目标空间返回后刷新)
|
||||
export function useHandoffStatus(handoffToken: string) {
|
||||
return useQuery({
|
||||
queryKey: ['handoff', 'status', handoffToken],
|
||||
queryFn: () => getHandoffStatus(handoffToken),
|
||||
// GET /app-api/muse/marketplace/handoffs/{handoffToken}
|
||||
refetchOnWindowFocus: true, // 用户从目标空间返回时自动刷新
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 2.5 发布准备 UI
|
||||
|
||||
#### 2.5.1 发布提交流程
|
||||
|
||||
发布提交页面按资产类型(作品、智能体、知识库)分型展示不同表单字段和检查项。
|
||||
|
||||
流程步骤:
|
||||
|
||||
1. 保存发布草稿 → `POST /app-api/muse/marketplace/publish-drafts`
|
||||
2. 运行发布检查 → `POST /app-api/muse/marketplace/publish-drafts/{draftId}/checks`
|
||||
3. 检查通过后提交审核 → `POST /app-api/muse/marketplace/publish-requests`
|
||||
|
||||
```typescript
|
||||
// 发布检查 mutation
|
||||
export function useRunPublishCheck() {
|
||||
return useMutation({
|
||||
mutationFn: (draftId: string) =>
|
||||
postPublishCheck(draftId),
|
||||
// POST /app-api/muse/marketplace/publish-drafts/{draftId}/checks
|
||||
});
|
||||
}
|
||||
|
||||
// 提交发布申请 mutation
|
||||
export function useSubmitPublishRequest() {
|
||||
return useMutation({
|
||||
mutationFn: (params: {
|
||||
draftId: string;
|
||||
marketPublishCheckId: string; // 消费发布检查结果
|
||||
commandId: string;
|
||||
}) => postPublishRequest(params),
|
||||
// POST /app-api/muse/marketplace/publish-requests
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.5.2 发布检查状态
|
||||
|
||||
| 检查状态 | UI 表现 | 用户动作 |
|
||||
|---|---|---|
|
||||
| 未检查 | "运行检查"按钮可用 | 点击运行 |
|
||||
| 检查中 | 按钮 loading,展示进度 | 等待 |
|
||||
| 检查通过 | 展示通过项,"提交审核"可用 | 提交 |
|
||||
| 检查失败 | 展示阻断项和警告项 | 修正后重新检查 |
|
||||
| 检查过期 | 提示过期,需重新检查 | 重新运行 |
|
||||
|
||||
#### 2.5.3 来源状态确认
|
||||
|
||||
发布前必须确认来源资产状态。前端调用来源状态查询:
|
||||
|
||||
```typescript
|
||||
// 查询来源状态
|
||||
export function useSourceStatus(params: SourceStatusParams) {
|
||||
return useQuery({
|
||||
queryKey: ['source-status', params],
|
||||
queryFn: () => postSourceStatusQuery(params),
|
||||
// POST /app-api/muse/source-status/query
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
来源状态异常时禁用发布提交按钮,展示原因和处理建议。
|
||||
|
||||
### 2.6 治理结果展示
|
||||
|
||||
#### 2.6.1 下架/召回通知
|
||||
|
||||
资产详情页顶部展示治理状态 Alert:
|
||||
|
||||
```typescript
|
||||
// 治理影响查询
|
||||
export function useGovernanceImpact(assetId: string) {
|
||||
return useQuery({
|
||||
queryKey: ['marketplace', 'governance-impact', assetId],
|
||||
queryFn: () => getGovernanceImpact(assetId),
|
||||
// GET /app-api/muse/marketplace/assets/{assetId}/governance-impact
|
||||
enabled: !!assetId,
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
UI 展示规则:
|
||||
|
||||
| 治理状态 | Alert 类型 | 展示内容 | 可用动作 |
|
||||
|---|---|---|---|
|
||||
| 已下架 | warning | 下架原因、影响范围 | 查看替代、申诉 |
|
||||
| 召回中 | error | 召回原因、影响范围、处理期限 | 停用安装、申诉 |
|
||||
| 授权撤销 | error | 撤销原因、影响绑定 | 重新获取、替代 |
|
||||
| 申诉中 | info | 申诉进度、预计处理时间 | 补充材料、撤回 |
|
||||
|
||||
#### 2.6.2 违规说明
|
||||
|
||||
违规说明展示在治理结果页,包含:
|
||||
|
||||
- 结果类型和原因摘要
|
||||
- 生效时间
|
||||
- 影响范围(新获取、新安装、新绑定、生成使用是否停止)
|
||||
- 替代方案建议
|
||||
- 申诉入口和期限
|
||||
|
||||
### 2.7 来源状态反馈
|
||||
|
||||
#### 2.7.1 来源失效 UI
|
||||
|
||||
当资产来源失效时,前端根据 `sourceStatus` 和 `actionPolicy` 展示不同 UI:
|
||||
|
||||
| sourceStatus | actionPolicy | UI 表现 |
|
||||
|---|---|---|
|
||||
| `active` | `allowed` | 正常展示,所有操作可用 |
|
||||
| `stale` | `needs_recheck` | 黄色提示条,建议重验,提供重验按钮 |
|
||||
| `revoked` | `blocked` | 红色提示,禁用绑定/生成 |
|
||||
| `recalled` | `blocked` | 红色提示,展示召回说明 |
|
||||
| `delisted` | `blocked` | 灰色提示,展示下架原因 |
|
||||
|
||||
#### 2.7.2 授权变化展示
|
||||
|
||||
授权状态变化时,资产详情页和安装页实时反映:
|
||||
|
||||
```typescript
|
||||
// 资产详情页监听授权状态
|
||||
// 通过 refetchOnWindowFocus 和 refetchInterval 保持最新
|
||||
export function useAssetDetail(assetId: string) {
|
||||
return useQuery({
|
||||
queryKey: ['marketplace', 'asset', assetId],
|
||||
queryFn: () => getAssetDetail(assetId),
|
||||
// GET /app-api/muse/marketplace/assets/{assetId}
|
||||
refetchOnWindowFocus: true,
|
||||
staleTime: 30_000, // 30 秒内不重复请求
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 2.8 错误处理和边界情况
|
||||
|
||||
#### 2.8.1 通用错误处理策略
|
||||
|
||||
```typescript
|
||||
// lib/api/error-handler.ts
|
||||
// 市场空间错误处理映射
|
||||
const marketplaceErrorHandlers: Record<string, ErrorHandler> = {
|
||||
UNAUTHENTICATED: () => redirectToLogin(),
|
||||
FORBIDDEN: (ctx) => showNoPermissionToast(ctx.msg),
|
||||
RESOURCE_NOT_FOUND: () => redirectToMarketplaceHome(),
|
||||
SOURCE_NEEDS_RECHECK: (ctx) => showRecheckPrompt(ctx.data),
|
||||
SOURCE_BLOCKED: (ctx) => showBlockedAlert(ctx.data),
|
||||
PRECHECK_EXPIRED: (ctx) => showExpiredPrompt(ctx.data),
|
||||
MARKET_HANDOFF_INVALID: () => redirectToMarketplaceWithRefresh(),
|
||||
IDEMPOTENCY_CONFLICT: (ctx) => showConflictToast(ctx.msg),
|
||||
FEATURE_DISABLED: (ctx) => hideOrDisableEntry(ctx.data),
|
||||
};
|
||||
```
|
||||
|
||||
#### 2.8.2 边界情况处理
|
||||
|
||||
| 边界情况 | 处理方式 |
|
||||
|---|---|
|
||||
| 资产在浏览过程中被下架 | 详情页展示下架提示,禁用获取/安装按钮 |
|
||||
| 获取过程中授权失效 | 中断获取流程,展示失效原因 |
|
||||
| Handoff 跳转后目标空间不可用 | 展示错误页,提供返回市场按钮 |
|
||||
| 发布检查过程中资产版本变化 | 检查结果标记为过期,需重新检查 |
|
||||
| 网络中断 | TanStack Query 自动重试,展示离线提示 |
|
||||
| 分页加载失败 | 保留已加载数据,展示重试按钮 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 个人中心空间
|
||||
|
||||
### 3.1 页面结构总览
|
||||
|
||||
| 页面 | 路由 | 核心组件 | 主要 API |
|
||||
|---|---|---|---|
|
||||
| 账户总览 | `/profile` | `OverviewCard`, `SecurityCard`, `UsageCard`, `AssetSummaryCard`, `AlertBar` | `GET /app-api/muse/me`, `GET /app-api/muse/account/entitlements`, `GET /app-api/muse/account/usage` |
|
||||
| 个人资料 | `/profile/info` | `ProfileForm`, `ContactVerification`, `AvatarUpload` | `GET /app-api/muse/profile`, `PATCH /app-api/muse/profile` |
|
||||
| 安全与登录 | `/profile/security` | `PasswordSection`, `MFASection`, `SessionList`, `SecurityEventList` | `GET /app-api/muse/account/security-events` |
|
||||
| 偏好与通知 | `/profile/preferences` | `PreferenceForm`, `NotificationSettings` | 偏好相关接口(复用 Yudao 基础能力) |
|
||||
| Token 与用量 | `/profile/usage` | `UsageTrend`, `UsageTable`, `AttributionDetail` | `GET /app-api/muse/account/usage`, `GET /app-api/muse/account/entitlements` |
|
||||
| 权益与配额 | `/profile/entitlements` | `EntitlementCard`, `QuotaProgress`, `ChangeLog` | `GET /app-api/muse/account/entitlements` |
|
||||
| 授权获取记录 | `/profile/authorizations` | `AuthRecordTable`, `SnapshotDrawer` | `GET /app-api/muse/account/licenses` |
|
||||
| 购买记录 | `/profile/purchases` | `PurchaseTable`, `ReceiptDrawer` | `GET /app-api/muse/account/purchases` |
|
||||
| 安装与绑定摘要 | `/profile/installations` | `InstalledList`, `BindingAnomalyList` | 通过 `/app-api/muse/me` 和相关接口聚合 |
|
||||
| 发布记录总览 | `/profile/publications` | `PublishRecordTable`, `StatusBadge` | `GET /app-api/muse/account/publish-records` |
|
||||
|
||||
### 3.2 权益摘要展示
|
||||
|
||||
#### 3.2.1 `/app-api/muse/me` 数据消费
|
||||
|
||||
应用入口初始化时调用 `/app-api/muse/me`,获取当前用户权益摘要和可见产品空间:
|
||||
|
||||
```typescript
|
||||
// lib/queries/me.ts
|
||||
// 当前用户信息和权益摘要
|
||||
export function useCurrentUser() {
|
||||
return useQuery({
|
||||
queryKey: ['me'],
|
||||
queryFn: () => fetchMe(),
|
||||
// GET /app-api/muse/me
|
||||
staleTime: 5 * 60 * 1000, // 5 分钟缓存
|
||||
refetchOnWindowFocus: true,
|
||||
});
|
||||
}
|
||||
|
||||
// 返回数据结构(前端类型定义)
|
||||
interface MeResponse {
|
||||
userId: string;
|
||||
nickname: string;
|
||||
avatar: string;
|
||||
entitlementSummary: {
|
||||
planName: string;
|
||||
tokenQuota: number;
|
||||
tokenUsed: number;
|
||||
expiresAt: string | null;
|
||||
isLimited: boolean;
|
||||
};
|
||||
visibleSpaces: string[]; // 可见产品空间列表
|
||||
defaultEntry: string; // 默认入口
|
||||
securityRisk: boolean; // 是否有安全风险
|
||||
pendingAlerts: number; // 待处理提醒数
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.2 账户总览页数据聚合
|
||||
|
||||
账户总览页并行加载多个摘要接口:
|
||||
|
||||
```typescript
|
||||
// 账户总览页数据加载
|
||||
export function useProfileOverview() {
|
||||
const me = useCurrentUser();
|
||||
const entitlements = useEntitlements();
|
||||
const usage = useUsageSummary();
|
||||
const securityEvents = useSecurityEvents({ limit: 5 });
|
||||
|
||||
return {
|
||||
me,
|
||||
entitlements,
|
||||
usage,
|
||||
securityEvents,
|
||||
isLoading: me.isLoading || entitlements.isLoading,
|
||||
};
|
||||
}
|
||||
|
||||
// 权益与配额查询
|
||||
function useEntitlements() {
|
||||
return useQuery({
|
||||
queryKey: ['account', 'entitlements'],
|
||||
queryFn: () => fetchEntitlements(),
|
||||
// GET /app-api/muse/account/entitlements
|
||||
});
|
||||
}
|
||||
|
||||
// 用量摘要查询
|
||||
function useUsageSummary() {
|
||||
return useQuery({
|
||||
queryKey: ['account', 'usage'],
|
||||
queryFn: () => fetchUsage(),
|
||||
// GET /app-api/muse/account/usage
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 配额和用量可视化
|
||||
|
||||
#### 3.3.1 配额进度条
|
||||
|
||||
权益与配额页使用进度条可视化展示额度消耗:
|
||||
|
||||
```typescript
|
||||
// components/personal-center/QuotaProgress.tsx
|
||||
interface QuotaProgressProps {
|
||||
label: string; // 配额名称
|
||||
total: number; // 总额度
|
||||
used: number; // 已用
|
||||
unit: string; // 单位(如 "Token")
|
||||
expiresAt?: string; // 到期时间
|
||||
isLimited?: boolean; // 是否被限流
|
||||
}
|
||||
```
|
||||
|
||||
展示规则:
|
||||
|
||||
- 使用率 < 70%:绿色进度条
|
||||
- 使用率 70%-90%:黄色进度条 + 提醒文案
|
||||
- 使用率 > 90%:红色进度条 + 额度不足警告
|
||||
- 已过期:灰色进度条 + 过期提示
|
||||
- 被限流:红色进度条 + 限流原因和恢复路径
|
||||
|
||||
#### 3.3.2 用量趋势图
|
||||
|
||||
Token 与用量页展示近 30 天用量趋势:
|
||||
|
||||
```typescript
|
||||
// 用量趋势数据
|
||||
export function useUsageTrend(params: { days: number; groupBy: 'day' | 'week' }) {
|
||||
return useQuery({
|
||||
queryKey: ['account', 'usage', 'trend', params],
|
||||
queryFn: () => fetchUsage(),
|
||||
// GET /app-api/muse/account/usage(带时间范围参数)
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
用量明细表支持按来源筛选:
|
||||
|
||||
| 筛选维度 | 说明 |
|
||||
|---|---|
|
||||
| 时间范围 | 近 7 天 / 30 天 / 自定义 |
|
||||
| 归属对象 | 作品 / 智能体 / 知识库 |
|
||||
| 状态 | 已归属 / 待归属 / 异常 |
|
||||
|
||||
#### 3.3.3 跳转来源记录
|
||||
|
||||
用量明细中的归属对象支持跳转到对应 owner 空间:
|
||||
|
||||
```typescript
|
||||
// 跨空间跳转(从个人中心到作品/智能体/知识库记录)
|
||||
function handleJumpToSource(record: UsageRecord) {
|
||||
const targetUrl = buildSourceUrl(record.sourceType, record.sourceId);
|
||||
// 使用 router 跳转,携带返回点
|
||||
router.push(`${targetUrl}?returnTo=/profile/usage`);
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 安全事件列表和处理交互
|
||||
|
||||
#### 3.4.1 安全事件列表
|
||||
|
||||
```typescript
|
||||
// 安全事件查询
|
||||
export function useSecurityEvents(params: { pageNo: number; pageSize: number }) {
|
||||
return useQuery({
|
||||
queryKey: ['account', 'security-events', params],
|
||||
queryFn: () => fetchSecurityEvents(params),
|
||||
// GET /app-api/muse/account/security-events
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
安全事件列表展示:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| 事件类型 | 异地登录、密码修改、二次验证变更、会话异常 |
|
||||
| 时间 | 事件发生时间 |
|
||||
| 设备/地点 | 脱敏展示 |
|
||||
| 风险等级 | 高/中/低 |
|
||||
| 处理状态 | 未处理、已确认本人、已处理 |
|
||||
|
||||
#### 3.4.2 确认非本人操作
|
||||
|
||||
高风险安全事件支持"确认本人操作"交互:
|
||||
|
||||
```typescript
|
||||
// 确认安全事件为本人操作
|
||||
export function useAcknowledgeSecurityEvent() {
|
||||
return useMutation({
|
||||
mutationFn: (params: {
|
||||
eventId: string;
|
||||
confirmation: string; // 确认说明
|
||||
commandId: string;
|
||||
}) => postAcknowledgeSecurityEvent(params),
|
||||
// POST /app-api/muse/account/security-events/{eventId}/acknowledge
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries(['account', 'security-events']);
|
||||
},
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
交互流程:
|
||||
|
||||
1. 用户点击"这是我本人"按钮。
|
||||
2. 高风险事件触发 step-up 验证(二次验证或密码确认)。
|
||||
3. step-up 通过后展示事件摘要和确认影响。
|
||||
4. 用户确认后追加处置标记。
|
||||
5. 刷新安全事件列表和风险提示。
|
||||
|
||||
如果用户认为非本人操作,引导:修改密码 → 撤销可疑会话 → 联系客服。
|
||||
|
||||
### 3.5 购买/发布记录的分页和筛选
|
||||
|
||||
#### 3.5.1 购买记录
|
||||
|
||||
```typescript
|
||||
// 购买记录查询
|
||||
export function usePurchaseRecords(params: PurchaseRecordParams) {
|
||||
return useQuery({
|
||||
queryKey: ['account', 'purchases', params],
|
||||
queryFn: () => fetchPurchases(params),
|
||||
// GET /app-api/muse/account/purchases
|
||||
// 注意:keepPreviousData 是 TanStack Query v4 写法,v5 改用 placeholderData: keepPreviousData(从 @tanstack/react-query 导入)
|
||||
keepPreviousData: true,
|
||||
});
|
||||
}
|
||||
|
||||
interface PurchaseRecordParams {
|
||||
pageNo: number;
|
||||
pageSize: number;
|
||||
status?: 'completed' | 'processing' | 'failed';
|
||||
assetType?: 'work' | 'agent' | 'knowledge_base';
|
||||
startTime?: string;
|
||||
endTime?: string;
|
||||
}
|
||||
```
|
||||
|
||||
购买记录表格列:
|
||||
|
||||
| 列 | 数据 | 操作 |
|
||||
|---|---|---|
|
||||
| 时间 | 购买时间 | - |
|
||||
| 资产 | 资产名称和类型 | 跳转市场详情 |
|
||||
| 来源 | 购买/免费/管理员授权 | - |
|
||||
| 金额 | 金额或"免费" | - |
|
||||
| 状态 | 已完成/处理中/失败 | 查看凭证 |
|
||||
| 授权结果 | 是否已生成授权 | 跳转授权记录 |
|
||||
|
||||
#### 3.5.2 发布记录
|
||||
|
||||
```typescript
|
||||
// 发布记录查询
|
||||
export function usePublishRecords(params: PublishRecordParams) {
|
||||
return useQuery({
|
||||
queryKey: ['account', 'publish-records', params],
|
||||
queryFn: () => fetchPublishRecords(params),
|
||||
// GET /app-api/muse/account/publish-records
|
||||
// 注意:keepPreviousData 是 TanStack Query v4 写法,v5 改用 placeholderData: keepPreviousData(从 @tanstack/react-query 导入)
|
||||
keepPreviousData: true,
|
||||
});
|
||||
}
|
||||
|
||||
interface PublishRecordParams {
|
||||
pageNo: number;
|
||||
pageSize: number;
|
||||
assetType?: 'work' | 'agent' | 'knowledge_base';
|
||||
reviewStatus?: 'draft' | 'submitted' | 'reviewing' | 'needs_supplement' | 'approved' | 'rejected';
|
||||
marketStatus?: 'listed' | 'delisted' | 'recalled';
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.5.3 通用分页组件
|
||||
|
||||
所有记录页使用统一分页组件,支持:
|
||||
|
||||
- 页码切换和每页条数选择
|
||||
- URL searchParams 持久化(刷新不丢失筛选)
|
||||
- 加载中保留上一页数据(`keepPreviousData`)
|
||||
- 空态展示和跳转入口
|
||||
|
||||
### 3.6 跳转规则
|
||||
|
||||
#### 3.6.1 从个人中心跳转到其他空间
|
||||
|
||||
个人中心是 read model 和跳转入口,所有业务处理必须跳转到对应 owner 空间。
|
||||
|
||||
| 来源页面 | 跳转目标 | 触发条件 | 携带参数 |
|
||||
|---|---|---|---|
|
||||
| 授权获取记录 | 市场资产详情 | 点击资产名称 | `assetId`, `returnTo` |
|
||||
| 授权获取记录 | 智能体已安装页 | 点击"去安装" | `assetId`, `returnTo` |
|
||||
| 授权获取记录 | 知识库已安装页 | 点击"去安装" | `assetId`, `returnTo` |
|
||||
| 安装与绑定摘要 | 作品智能体关联 | 点击异常处理 | `workId`, `slotKey`, `returnTo` |
|
||||
| 安装与绑定摘要 | 作品知识来源 | 点击异常处理 | `workId`, `bindingId`, `returnTo` |
|
||||
| 发布记录总览 | 市场发布提交 | 点击"去补充" | `draftId`, `returnTo` |
|
||||
| 发布记录总览 | 智能体发布准备 | 点击"去处理" | `agentId`, `returnTo` |
|
||||
| 发布记录总览 | 知识库发布准备 | 点击"去处理" | `kbId`, `returnTo` |
|
||||
| Token 与用量 | 作品记录与用量 | 点击归属作品 | `workId`, `returnTo` |
|
||||
| 权益与配额 | 市场(补充权益) | 点击"补充权益" | `returnTo` |
|
||||
|
||||
#### 3.6.2 返回规则
|
||||
|
||||
所有跳转携带 `returnTo` 参数,目标空间处理完成后通过该参数返回个人中心并刷新对应数据:
|
||||
|
||||
```typescript
|
||||
// 跳转工具函数
|
||||
function navigateToOwnerSpace(target: string, returnTo: string) {
|
||||
const url = new URL(target, window.location.origin);
|
||||
url.searchParams.set('returnTo', returnTo);
|
||||
router.push(url.pathname + url.search);
|
||||
}
|
||||
|
||||
// 返回个人中心时刷新数据
|
||||
function handleReturnFromOwnerSpace() {
|
||||
const returnTo = searchParams.get('returnTo');
|
||||
if (returnTo?.startsWith('/profile')) {
|
||||
// 失效相关查询缓存,触发重新加载
|
||||
queryClient.invalidateQueries(['account']);
|
||||
router.push(returnTo);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 状态管理策略
|
||||
|
||||
### 4.1 市场空间状态分层
|
||||
|
||||
| 状态类型 | 管理方式 | 示例 |
|
||||
|---|---|---|
|
||||
| 服务器数据 | TanStack Query | 资产列表、详情、授权状态、治理结果 |
|
||||
| 搜索/筛选状态 | URL searchParams | 搜索词、分类、排序、分页 |
|
||||
| UI 临时态 | React useState | 弹窗开关、表单编辑中、loading |
|
||||
| 跨页面共享 | Zustand store | 当前 handoff session、返回点 |
|
||||
|
||||
### 4.2 个人中心状态分层
|
||||
|
||||
| 状态类型 | 管理方式 | 示例 |
|
||||
|---|---|---|
|
||||
| 服务器数据 | TanStack Query | 权益、用量、记录列表、安全事件 |
|
||||
| 筛选/分页 | URL searchParams | 时间范围、状态筛选、页码 |
|
||||
| 表单状态 | React Hook Form | 个人资料编辑、偏好设置 |
|
||||
| step-up 状态 | Zustand store | 二次验证流程状态 |
|
||||
|
||||
### 4.3 缓存失效策略
|
||||
|
||||
```typescript
|
||||
// 市场操作后的缓存失效
|
||||
const marketplaceMutationConfig = {
|
||||
// 购买成功后失效资产详情和授权记录
|
||||
onPurchaseSuccess: () => {
|
||||
queryClient.invalidateQueries(['marketplace', 'asset']);
|
||||
queryClient.invalidateQueries(['account', 'licenses']);
|
||||
queryClient.invalidateQueries(['me']); // 权益可能变化
|
||||
},
|
||||
// 安装成功后失效安装状态
|
||||
onInstallSuccess: () => {
|
||||
queryClient.invalidateQueries(['marketplace', 'asset']);
|
||||
queryClient.invalidateQueries(['account', 'installations']);
|
||||
},
|
||||
// 发布提交后失效发布记录
|
||||
onPublishSuccess: () => {
|
||||
queryClient.invalidateQueries(['account', 'publish-records']);
|
||||
queryClient.invalidateQueries(['marketplace', 'my-publish-records']);
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 管理端市场治理(muse-admin)
|
||||
|
||||
管理端市场治理页面在 `muse-admin/` 中实现,使用 Vben Admin 框架,调用 `/admin-api/**`。
|
||||
|
||||
### 5.1 管理端市场页面
|
||||
|
||||
| 页面 | API | 说明 |
|
||||
|---|---|---|
|
||||
| 市场资产列表 | `GET /admin-api/muse/market/assets` | 查看所有市场资产和治理摘要 |
|
||||
| 发布申请审核 | `GET /admin-api/muse/market/publish-requests` | 审核发布申请 |
|
||||
| 审核通过/拒绝 | `POST /admin-api/muse/market/publish-requests/{id}/approve` | 审核决策 |
|
||||
| 资产下架 | `POST /admin-api/muse/market/assets/{id}/delist` | 下架资产 |
|
||||
| 资产召回 | `POST /admin-api/muse/market/assets/{id}/recall` | 召回资产 |
|
||||
| 申诉处理 | `GET /admin-api/muse/market/appeals` | 查看和处理申诉 |
|
||||
|
||||
管理端不承载普通用户的市场发现、购买、安装或绑定流程。
|
||||
|
||||
---
|
||||
|
||||
## 6. 关联阅读
|
||||
|
||||
| 文档 | 关联内容 |
|
||||
|---|---|
|
||||
| `产品-02F-市场功能规格.md` | 市场产品定义、页面规格、操作规格、跨空间跳转 |
|
||||
| `产品-02G-个人中心功能规格.md` | 个人中心产品定义、页面规格、权限和安全规则 |
|
||||
| `后端-05-统一API契约-v1.md` | 所有 API 路径、请求响应格式、错误码定义 |
|
||||
| `架构-01-系统全貌与边界上下文.md` | Handoff 机制、BC 边界、Source/Authorization 横切契约 |
|
||||
| `前端-01-工程结构与核心依赖.md` | 工程结构、路由约定、状态分层、接口边界 |
|
||||
| `前端-02-写作台与候选交互.md` | 写作台交互模式参考 |
|
||||
| `前端-03-元引擎与动态表单.md` | MetaSchema 消费和动态表单渲染 |
|
||||
| `架构-04-状态机与约束清单.md` | 资产状态机、授权状态机 |
|
||||
|
||||
1024
design-docs/前端-05-智能体与知识库工作台交互.md
Normal file
1024
design-docs/前端-05-智能体与知识库工作台交互.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
# 后端-01:领域模型与聚合设计
|
||||
|
||||
- 版本:v6
|
||||
- 更新日期:2026-05-23
|
||||
- 版本:v7
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:后端 / 架构 / 产品
|
||||
- 阅读时间:30-45 分钟
|
||||
- 边界说明:本文件只定义 Muse 领域模型、聚合职责、owner module 和不变式;工程结构看 `后端-02`,流程看 `后端-03`,Schema 看 `后端-04`,API 看 `后端-05`。
|
||||
@ -37,17 +37,17 @@
|
||||
|---|---|---|---|---|
|
||||
| Auth / Permission | `yudao-module-system` | 用户、角色、权限、权限组、菜单、登录日志、操作日志 | Yudao 原生 admin/app 认证与权限接口 | 作品级事实确认、知识确认、市场授权事实 |
|
||||
| Infra | `yudao-module-infra` | 文件、配置、字典、定时任务、API 日志、监控 | Yudao 原生 infra 接口 | Muse 业务领域事实 |
|
||||
| Governance / Admin Control | 逻辑 owner;物理表按对象落到 `content` / `ai` | MetaSchema、系统功能链路、保护节点、质量策略、影响预览和发布审计 | `/admin-api/muse/governance/**` | 用户私有正文、Local KB Canonical、候选确认、市场目标事实 |
|
||||
| Content BC | `yudao-module-content` | Work、Chapter、Block、正文版本、Planning Canonical、Block Source Attribution、导入导出任务、作品设置、MetaSchema 版本化投影的物理承载 | `/admin-api/muse/content/**`、`/app-api/muse/works/**` | Prompt、Agent、知识确认、市场交易、MetaSchema 治理写入 |
|
||||
| MetaSchema BC | `yudao-module-meta`(独立模块) | MetaSchema、元结构版本、字段定义、可见性策略、影响预览和发布审计 | `/admin-api/muse/governance/meta-schemas/**`(admin 写)、facade-api 只读消费 | 用户私有正文、Local KB Canonical、候选确认、市场目标事实、保护节点、质量策略 |
|
||||
| Content BC | `yudao-module-content` | Work、Chapter、Block、正文版本、Planning Canonical、Block Source Attribution、导入导出任务、作品设置 | `/admin-api/muse/content/**`、`/app-api/muse/works/**` | Prompt、Agent、知识确认、市场交易、MetaSchema 治理写入 |
|
||||
| Knowledge BC | `yudao-module-knowledge` | User KB、Local KB、Knowledge Draft、Knowledge Entity/Relation/Event、Knowledge Source Binding、投影状态 | `/admin-api/muse/knowledge/**`、`/app-api/muse/knowledge-*/**` | 正文写入、市场资产授权、模型路由 |
|
||||
| AI Orchestration BC | `yudao-module-ai` 二开 | Prompt、Agent、Agent Slot、Tool Grant 投影、Runtime Permission Envelope、AI Task、Parse Job、Chapter Parse Result、Suggestion、Planning Candidate、Quality Result、Evaluation Dataset/Run | `/admin-api/muse/ai/**`、`/app-api/muse/ai/**`、`/app-api/muse/suggestions/**` | New-API 模型 Provider/供应商路由、分组限流、成本策略、原始调用日志 authority、用户权益账本、正文 Canonical、Tool Grant authority 自授权 |
|
||||
| Marketplace/Asset BC | `yudao-module-market` | Marketplace Asset、Listing、License、Authorization、Install、Publish Request、Appeal、Governance Result、来源侧 Handoff Token、授权摘要、跳转审计、Source Status Event | `/admin-api/muse/market/**`、`/app-api/muse/marketplace/**` | 正文事实、知识正式确认、Agent Slot Binding、Knowledge Source Binding、Block Source Attribution、目标 owner precheck/session、支付清结算底层 |
|
||||
| Account / Entitlement BC | 逻辑 `account`,物理为 `yudao-module-account` 或 `member` 二开二选一 | Profile、Entitlement、Quota、Usage Summary、Purchase/Auth/Publish Summary、Personal Center Summary | `/admin-api/muse/account/**`、`/app-api/muse/account/**`、`/app-api/muse/me` | 作品事实、市场 asset owner、New-API 原始调用日志或成本账本 authority |
|
||||
| Account / Entitlement BC | `yudao-module-member`(已决策:member 模块承载端侧用户 Account 功能) | Profile、Entitlement、Quota、Usage Summary、Purchase/Auth/Publish Summary、Personal Center Summary | `/admin-api/muse/account/**`、`/app-api/muse/account/**`、`/app-api/muse/me` | 作品事实、市场 asset owner、New-API 原始调用日志或成本账本 authority |
|
||||
| Source / Authorization Context | 来源对象 owner + outbox 协作 | Source Snapshot、Authorization Snapshot、Source Status Event、Source Propagation Target | 通过 Content / Knowledge / AI / Market / Account 的 owner API 和 `/admin-api/muse/source-events/**` 暴露 | 业务 Canonical 写入、支付清结算、权限菜单 |
|
||||
| Payment BC | `yudao-module-pay` | 充值、支付、交易流水、退款基础能力 | Yudao 原生 pay 接口,Muse 只引用交易结果 | 市场资产 owner、作品事实 |
|
||||
| Workflow BC | `yudao-module-bpm` | 复杂审核、申诉、合规流程 | Yudao 原生 bpm 接口或 Muse 流程回调 | 简单资产状态机的唯一 owner |
|
||||
|
||||
`account` 的逻辑 owner 必须固定:如果后续选择在 `member` 内二开,也只能由 `member` 内的 Muse account 包写 Profile、Entitlement、Quota 和个人中心聚合;不能再并行新增另一个 `account` 模块写同一批事实。
|
||||
Account BC 物理落点已决策:`yudao-module-member`。member 模块承载端侧用户的 Profile、Entitlement、Quota、Usage、Security Event 和 New-API Binding 聚合。不新增 `yudao-module-account`;`member` 内的 Muse account 包是唯一写入 authority,不允许并行新增另一个模块写同一批事实。
|
||||
|
||||
## 3. 核心聚合
|
||||
|
||||
@ -61,7 +61,7 @@
|
||||
| Block Source Attribution | 正文 revision 的来源归因 | 候选使用 AI、市场、外部或授权知识来源时必须写入 lineage、授权快照和召回状态 |
|
||||
| Import / Export Task | 导入解析和导出交付任务 | 外部文件处理异步化;导出前必须重验权限、来源和许可 |
|
||||
| Planning Canonical | 用户确认或手动保存后的正式规划项 | 规划候选不能自动进入正式规划;进入 AI 上下文前必须校验来源、版本和可见性 |
|
||||
| MetaSchema Projection | 作品和知识表达结构的系统级版本化投影 | 逻辑 owner 是 Admin/Governance;若物理表放在 Content,也只能由治理 facade / admin-api 写入,Content 和 app API 只能消费 active/gray 版本投影 |
|
||||
| MetaSchema Projection | 作品和知识表达结构的系统级版本化投影 | 逻辑 owner 是 `yudao-module-meta`(独立模块);Content 和 app API 只能消费 active/gray 版本投影 |
|
||||
|
||||
Content 只拥有正文和作品结构。知识、AI 候选、市场授权都通过公开接口或事件协作。
|
||||
|
||||
@ -91,7 +91,7 @@ Content 只拥有正文和作品结构。知识、AI 候选、市场授权都通
|
||||
| Parse Job / Chapter Parse Result | 导入解析和全书解析的 AI Shadow 结果 | AI 拥有任务、章节解析结果、质量和失败状态;章节审阅通过后只请求 Knowledge 生成 Knowledge Draft |
|
||||
| AI Suggestion | 正文候选 | 只能进入 Shadow,不能直接写正文 |
|
||||
| Planning Candidate | 规划候选 | 只能进入 Shadow,必须经用户确认或手动保存后才成为正式规划 |
|
||||
| Candidate Quality Result | 候选质量结果 | 质量结果不单独决定可接受性,最终由 Candidate Decision Envelope 合并 |
|
||||
| Candidate Quality Result | 候选质量结果 | 质量结果不单独决定可接受性,接受时实时校验来源版本、质量结果和合规状态 |
|
||||
| Evaluation Dataset / Run | 质量评估集和评估运行 | 默认不得使用用户私有正文、私人候选全文、完整 Prompt/Response 或完整上下文 |
|
||||
|
||||
AI 模块负责 Muse 侧编排、智能体、任务和待审对象。Yudao 原生 `ai` 能力只是可复用底座;一旦二开为 Muse AI owner,仍不得拥有 New-API 模型 Provider、供应商路由、分组限流、成本策略、原始调用日志 authority 或正文/知识 Canonical。
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
# 后端-02:工程结构与模块职责
|
||||
|
||||
- 版本:v6
|
||||
- 更新日期:2026-05-23
|
||||
- 版本:v8
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:后端 / 架构 / 平台 / 测试
|
||||
- 阅读时间:25-40 分钟
|
||||
- 边界说明:本文件只定义后端工程基线、Yudao Cloud fork 保留/裁剪模块、Muse 业务模块职责和模块协作边界。领域模型看 `后端-01`,关键流程看 `后端-03`,Schema 看 `后端-04`,API 契约看 `后端-05`。本文描述目标工程形态,不代表当前仓库所有模块都已实现。
|
||||
@ -22,7 +22,7 @@ muse-cloud/ # fork YunaiV/yudao-cloud
|
||||
2. `/admin-api/**` 和 `/app-api/**` 只是入口不同,不是两套领域事实。
|
||||
3. 同一个领域事实只能有一个 owner module。
|
||||
4. 优先复用 Yudao 的 system、infra、framework、gateway、job、log、file、config、dict 等平台能力。
|
||||
5. Muse 业务模块只补创作系统需要的 content、knowledge、ai、market、account 能力。
|
||||
5. Muse 业务模块只补创作系统需要的 content、knowledge、ai、market、meta 能力,account 功能由 `yudao-module-member` 承载。
|
||||
6. `yudao-server` 只负责启动装配、配置聚合和模块引入,不放 use case、领域规则、mapper 拼装或跨模块写入脚本。
|
||||
|
||||
## 2. 当前保留模块
|
||||
@ -36,7 +36,7 @@ muse-cloud/ # fork YunaiV/yudao-cloud
|
||||
| `yudao-module-system` | 用户、角色、权限、菜单、登录日志、操作日志 | 保留并作为后台权限、菜单和用户基础能力 owner |
|
||||
| `yudao-module-infra` | 文件、字典、配置、定时任务、API 日志、监控 | 保留并作为基础设施能力 owner |
|
||||
| `yudao-module-ai` | Yudao AI 基础能力 | 保留,默认隐藏;后续二开为 Muse AI/Agent 能力载体 |
|
||||
| `yudao-module-member` | 会员/账户基础能力 | 保留,默认隐藏;后续评估改造成账户/权益或被 `account` 替代 |
|
||||
| `yudao-module-member` | 会员/账户基础能力;**已决策为 Muse Account BC 物理承载** | 保留并启用;承载端侧用户 Profile、Entitlement、Quota、Usage、Security Event 和 New-API Binding |
|
||||
| `yudao-module-pay` | 支付、充值、交易基础能力 | 保留,默认隐藏;市场交易、套餐、充值时启用 |
|
||||
| `yudao-module-bpm` | 工作流审批 | 保留,默认隐藏;审核、申诉、合规流程复杂后启用 |
|
||||
| `yudao-module-report` | 报表大屏 | 保留,默认隐藏;运营报表、质量大屏时启用 |
|
||||
@ -56,8 +56,8 @@ muse-cloud/ # fork YunaiV/yudao-cloud
|
||||
保留模块分层:
|
||||
|
||||
- `gateway/dependencies/framework/server` 是工程底座。
|
||||
- `system/infra/member/pay/bpm/report/mp` 是 Yudao 平台和可选业务底座。
|
||||
- `content/knowledge/ai/market/account` 是 Muse 创作业务 owner。
|
||||
- `system/infra/member/pay/bpm/report/mp` 是 Yudao 平台和可选业务底座;其中 `member` 同时承载 Muse Account BC。
|
||||
- `content/knowledge/ai/market/meta` 是 Muse 创作业务 owner。
|
||||
- `pay/bpm/report/mp` 在阶段 7 可以默认隐藏,但不能因为隐藏就删除依赖、菜单扩展点或后续接入边界。
|
||||
|
||||
## 3. Muse 核心业务模块
|
||||
@ -66,15 +66,38 @@ muse-cloud/ # fork YunaiV/yudao-cloud
|
||||
|
||||
| Muse 模块 | 职责 | 不负责 |
|
||||
|---|---|---|
|
||||
| `yudao-module-content` | 作品、章节、文本块、正文版本、作品设置、导入任务、导入文件、章节上下文、导出、Block Source Attribution、MetaSchema 物理表和版本化投影消费 | Prompt、Agent、市场授权、知识确认、MetaSchema 治理写入、Parse Job / Chapter Parse Result |
|
||||
| `yudao-module-content` | 作品、章节、文本块、正文版本、作品设置、导入任务、导入文件、章节上下文、导出、Block Source Attribution | Prompt、Agent、市场授权、知识确认、MetaSchema 治理写入、Parse Job / Chapter Parse Result |
|
||||
| `yudao-module-knowledge` | 用户知识库、局域知识、知识草稿确认、知识来源、投影、检索来源、知识库绑定 | 正文写入、市场交易、模型调用 |
|
||||
| `yudao-module-ai` 二开 | Prompt、Agent、槽位、运行时权限包、生成任务、Parse Job、Chapter Parse Result、候选、质量门控、评测、Tool Grant 投影、Context Assembly、Candidate Decision Envelope / Archive | New-API 模型 Provider/供应商路由、成本策略、原始调用日志 authority、正文或知识 Canonical、Tool Grant authority 自授权 |
|
||||
| `yudao-module-market` | 市场资产、授权、安装、来源侧 Handoff Token、授权摘要、跳转审计、发布申请、申诉、治理结果 | 作品正文事实、知识正式确认、Agent Slot Binding、Knowledge Source Binding、Block Source Attribution、目标 owner precheck/session、支付清结算底层 |
|
||||
| `yudao-module-account` 或改造 `member` | 个人资料、权益、配额、用量、购买/授权/发布记录总览 | 作品事实、市场资产 owner、New-API 原始调用日志或成本账本 authority |
|
||||
| `yudao-module-ai` 二开 | Prompt、Agent、槽位、运行时权限包、生成任务、Parse Job、Chapter Parse Result、候选、质量门控、评测、Tool Grant 投影、Context Assembly、Candidate Archive | New-API 模型 Provider/供应商路由、成本策略、原始调用日志 authority、正文或知识 Canonical、Tool Grant authority 自授权 |
|
||||
| `yudao-module-meta` | MetaSchema 元结构定义、字段、可见性策略、版本发布、激活、回滚和影响预览 | 用户作品正文、Local KB、候选确认、市场目标事实 |
|
||||
| `yudao-module-market` | 市场资产、授权、安装、来源侧 Handoff Token、授权摘要、跳转审计、发布申请、申诉、治理结果(含市场治理) | 作品正文事实、知识正式确认、Agent Slot Binding、Knowledge Source Binding、Block Source Attribution、目标 owner precheck/session、支付清结算底层 |
|
||||
| `yudao-module-member` | 个人资料、权益、配额、用量、安全事件、New-API 绑定、购买/授权/发布记录总览(Account BC 物理承载) | 作品事实、市场资产 owner、New-API 原始调用日志或成本账本 authority |
|
||||
|
||||
建议决策:业务语义上使用 `account` 承载权益、配额、用量、授权和发布记录;`member` 先作为 Yudao 可复用底座保留隐藏。是否物理新增 `yudao-module-account`,还是在 `member` 内二开,需要在后端落地前单独确认。
|
||||
Account BC 物理落点已决策:使用现有 `yudao-module-member` 模块承载端侧用户(Account)功能,不新增 `yudao-module-account`。member = 端侧用户,语义等同于 Account BC 的物理承载。
|
||||
|
||||
物理落地约束:`account` 与 `member` 只能二选一承载 Muse 账户权益事实。选择前,文档和 API 使用逻辑名 `account`;选择后,另一个模块只能作为依赖或适配层,不得并行写 Profile、Entitlement、Quota、Usage Summary 或 Personal Center Summary。
|
||||
member 模块扩展职责:除 Yudao 原有会员基础能力外,新增 Muse 的权益(Entitlement)、配额(Quota)、用量(Usage)、安全事件(Security Event)和 API 绑定(New-API Binding)。
|
||||
|
||||
包结构建议:
|
||||
|
||||
```text
|
||||
yudao-module-member/
|
||||
yudao-module-member-api/
|
||||
admin/
|
||||
app/
|
||||
event/
|
||||
yudao-module-member-server/
|
||||
controller/admin/
|
||||
controller/app/
|
||||
application/
|
||||
domain/
|
||||
profile/ # 用户画像/偏好
|
||||
entitlement/ # 权益
|
||||
quota/ # 配额
|
||||
usage/ # 用量
|
||||
security/ # 安全事件
|
||||
binding/ # New-API 绑定
|
||||
infrastructure/
|
||||
```
|
||||
|
||||
### 3.2 标准模块结构
|
||||
|
||||
@ -122,6 +145,103 @@ yudao-module-content/
|
||||
|
||||
禁止出现 `yudao-server/src/main/java/.../muse/...` 这类承载业务用例的过渡目录;如果为了启动聚合需要配置 Bean,只能在 `yudao-server` 做模块装配。
|
||||
|
||||
## 3.3 Agent BC 与 AI Orchestration BC 包级隔离策略
|
||||
|
||||
`yudao-module-ai` 在同一物理模块内承载 Agent BC(智能体配置、版本、槽位)和 AI Orchestration BC(任务编排、候选生成、质量门控、上下文组装)。为防止职责混淆和越权调用,必须在包级别做隔离:
|
||||
|
||||
```text
|
||||
yudao-module-ai-server/
|
||||
domain/
|
||||
agent/ # Agent BC:Agent、AgentVersion、Slot、SlotBinding
|
||||
orchestration/ # AI Orchestration BC:Task、Candidate、QualityGate、ContextAssembly、ParseJob
|
||||
grant/ # Tool Grant 投影消费(只读)+ Protection Node + Quality Policy 写入服务
|
||||
application/
|
||||
agent/ # Agent 配置用例
|
||||
orchestration/ # 编排运行用例
|
||||
grant/ # Grant/Governance 包:Tool Grant、Runtime Permission Envelope、Protection Node 写入服务,只暴露给 admin-api
|
||||
controller/
|
||||
admin/
|
||||
grant/ # /admin-api/muse/ai/tool-grants/**、/admin-api/muse/governance/protection-nodes/**
|
||||
app/
|
||||
runtime/ # /app-api/muse/ai/**
|
||||
```
|
||||
|
||||
AI 授权隔离(grant vs runtime):
|
||||
|
||||
| 包 | 职责 | 暴露入口 |
|
||||
|---|---|---|
|
||||
| `ai.grant`(`application/grant` + `domain/grant`) | Tool Grant 写入、Runtime Permission Envelope 签发、Protection Node 写入服务 | 只暴露给 admin-api(Governance facade 调用) |
|
||||
| `ai.runtime`(`application/orchestration` + `domain/orchestration`) | AI 任务执行、候选生成、上下文组装 | 只能读取 grant 包签发的 envelope,不能调用 grant 写入接口 |
|
||||
|
||||
ArchUnit 规则:
|
||||
|
||||
```java
|
||||
// 禁止 runtime 包调用 grant 包的写入接口
|
||||
noClasses()
|
||||
.that().resideInAPackage("..ai.application.orchestration..")
|
||||
.or().resideInAPackage("..ai.domain.orchestration..")
|
||||
.should().accessClassesThat()
|
||||
.resideInAPackage("..ai.application.grant..")
|
||||
.orShould().callMethodWhere(
|
||||
target(nameMatching(".*Write.*|.*Create.*|.*Update.*|.*Delete.*|.*Publish.*"))
|
||||
.and(target(owner(resideInAPackage("..ai.domain.grant.."))))
|
||||
);
|
||||
```
|
||||
|
||||
依赖方向约束:
|
||||
|
||||
| 包 | 允许依赖 | 禁止依赖 |
|
||||
|---|---|---|
|
||||
| `domain/agent` | 自身聚合、`domain/grant`(只读投影) | `domain/orchestration` 内部实现 |
|
||||
| `domain/orchestration` | 自身聚合、`domain/agent`(只读版本查询)、`domain/grant`(只读投影) | `domain/grant` 写入方法 |
|
||||
| `domain/grant` | 无外部领域依赖 | `domain/agent`、`domain/orchestration` |
|
||||
| `application/grant` | `domain/grant`(读写)、外部 Governance/Security facade | `application/orchestration`、`domain/orchestration` |
|
||||
| `application/orchestration` | `domain/orchestration`、`domain/agent`(只读 facade)、`domain/grant`(只读) | `application/grant` 写入用例 |
|
||||
|
||||
Tool Grant 写入约束:
|
||||
|
||||
- Tool Grant 的创建、审批、变更和版本发布只能通过 `governance/security facade` 包路径完成,物理入口在 Governance/Admin facade 或 Security facade。
|
||||
- `domain/grant` 包内只暴露只读投影查询接口(`ToolGrantProjectionQuery`),不暴露任何写入方法。
|
||||
- AI runtime(`domain/orchestration`、`application/orchestration`)只能调用 `domain/grant` 的只读投影生成 Runtime Permission Envelope,不能直接调用 grant 写入方法。
|
||||
- 违反此约束的代码在 code review 和 ArchUnit 规则中必须被拦截。
|
||||
|
||||
### 3.4 Governance Facade 工程落点
|
||||
|
||||
Governance facade 是 MetaSchema、保护节点、系统功能链路、Tool Grant 和质量策略的逻辑写入 authority。工程落点已明确拆分:
|
||||
|
||||
| 职责 | 物理位置 | 说明 |
|
||||
|---|---|---|
|
||||
| MetaSchema 全部能力 | `yudao-module-meta`(独立模块) | admin 写入 + 用户作品级覆盖 + facade-api 只读消费;Content、Knowledge、AI 等模块通过 `meta-api` 只读依赖消费 active/gray 投影 |
|
||||
| Protection Node + Quality Policy | `yudao-module-ai-server/application/grant/` | AI grant 包承载保护节点和质量策略的写入服务,只暴露给 admin-api |
|
||||
| Tool Grant authority 实现 | `yudao-module-ai-server/application/grant/` | 写入入口只接受 Governance/Security facade 调用 |
|
||||
| 市场治理 | `yudao-module-market-server/controller/admin/` | 市场资产下架、召回、封禁、申诉处理等治理动作归 market admin 包 |
|
||||
|
||||
`yudao-module-meta` 模块结构:
|
||||
|
||||
```text
|
||||
yudao-module-meta/
|
||||
yudao-module-meta-api/
|
||||
admin/ # MetaSchema 管理 DTO、facade 接口
|
||||
app/ # 用户作品级覆盖 DTO
|
||||
facade/ # 只读消费 facade(供 content/knowledge/ai 依赖)
|
||||
yudao-module-meta-server/
|
||||
controller/admin/ # /admin-api/muse/governance/meta-schemas/**
|
||||
controller/app/ # /app-api/muse/works/{workId}/meta-projections/**
|
||||
application/
|
||||
domain/
|
||||
schema/ # MetaSchema、MetaField、VisibilityPolicy
|
||||
version/ # 版本发布、激活、回滚、灰度
|
||||
projection/ # 投影计算和缓存
|
||||
infrastructure/
|
||||
```
|
||||
|
||||
约束:
|
||||
|
||||
- `yudao-module-meta` 是 MetaSchema 唯一写入 authority。
|
||||
- Content、Knowledge、AI 等模块只能通过 `meta-api/facade` 只读消费 active/gray 投影。
|
||||
- 用户作品级覆盖(work-level override)通过 app 入口提交,但仍由 meta 模块校验和存储。
|
||||
- Content 模块不再物理承载 MetaSchema 表。
|
||||
|
||||
## 4. 模块边界
|
||||
|
||||
### 4.1 owner 边界
|
||||
@ -130,14 +250,21 @@ yudao-module-content/
|
||||
|---|---|---|
|
||||
| 用户、角色、权限、菜单 | `yudao-module-system` | 全部模块通过权限摘要或用户上下文读取 |
|
||||
| 文件、配置、字典、任务、API 日志 | `yudao-module-infra` | 全部模块按 Yudao 基础设施方式调用 |
|
||||
| 作品、章节、Block、正文版本、MetaSchema 物理表和版本化投影 | `yudao-module-content`;MetaSchema 逻辑 owner 是 Governance/Admin facade | knowledge、ai、market、account |
|
||||
| 作品、章节、Block、正文版本 | `yudao-module-content` | knowledge、ai、market、account |
|
||||
| MetaSchema、元结构版本、字段定义、可见性策略 | `yudao-module-meta` | content、knowledge、ai、market、account |
|
||||
| 用户知识库、局域知识、知识草稿、来源绑定 | `yudao-module-knowledge` | content、ai、market |
|
||||
| Prompt、Agent、Parse Job、Chapter Parse Result、任务、候选、质量门控、评测、Candidate Decision Archive | `yudao-module-ai` | content、knowledge、market、account |
|
||||
| Prompt、Agent、Parse Job、Chapter Parse Result、任务、候选、质量门控、评测、Candidate Archive | `yudao-module-ai` | content、knowledge、market、account |
|
||||
| 市场资产、授权、安装、发布、申诉、治理、来源侧 Handoff Token、授权摘要、跳转审计 | `yudao-module-market` | content、knowledge、ai、account |
|
||||
| 权益、配额、用量、购买/授权/发布记录总览 | `yudao-module-account` 或 `member` | market、ai、personal center read model |
|
||||
| 权益、配额、用量、购买/授权/发布记录总览 | `yudao-module-member` | market、ai、personal center read model |
|
||||
| Source Snapshot、Authorization Snapshot、Source Status Event、Source Propagation Target | 来源对象 owner + 授权签发 owner;横切表级 owner 跟随来源 owner,不归入 Knowledge 单模块 | content、knowledge、ai、market、account |
|
||||
|
||||
Source / Authorization Context 是横切上下文:来源 owner 负责发布 Source Status Event,受影响对象 owner 负责幂等消费、禁用新使用、标记需重验或刷新自己的读模型。Knowledge 只拥有知识来源绑定和知识投影,不拥有所有来源授权事实。
|
||||
Source / Authorization Context 是横切上下文:来源 owner 负责发布 Source Status Event,受影响对象 owner 负责幂等消费、禁用新使用或刷新自己的读模型。Knowledge 只拥有知识来源绑定和知识投影,不拥有所有来源授权事实。
|
||||
|
||||
Source / Authorization 物理归属:
|
||||
|
||||
- `source_snapshot` 表 DDL 归 `yudao-module-infra` 模块(横切基础设施)。
|
||||
- 各业务模块(content、knowledge、ai、market、account)分散写入 source_snapshot 记录。
|
||||
- 传播模式为事件驱动自治:通过 Spring Event 或 MQ 发布来源状态事件,各模块自行监听并处理自己 owner 范围内的传播目标。
|
||||
|
||||
### 4.2 跨模块调用规则
|
||||
|
||||
@ -146,7 +273,7 @@ Source / Authorization Context 是横切上下文:来源 owner 负责发布 So
|
||||
| 查询摘要 | 通过 `api` facade、只读 query service 或事件投影读取 | 直接跨模块读写对方表并推断状态 |
|
||||
| 写入事实 | 回到 owner module 的 application use case | 在调用方 mapper 里直接写对方事实 |
|
||||
| 异步协作 | outbox event + 幂等 consumer + 可重试任务 | MQ 消费端无幂等直接改 Canonical |
|
||||
| MetaSchema 治理 | `/admin-api/muse/governance/**` 经 Governance/Admin facade 写 MetaSchema 草稿、发布、激活、回滚和影响预览 | Content app/admin controller 任意写字段结构或让用户端绕过治理改 Schema |
|
||||
| MetaSchema 治理 | `/admin-api/muse/governance/**` 经 `yudao-module-meta` 写 MetaSchema 草稿、发布、激活、回滚和影响预览 | Content app/admin controller 任意写字段结构或让用户端绕过治理改 Schema |
|
||||
| Tool Grant | Governance / Security facade 发布授权,AI runtime 只消费授权投影生成权限包 | `yudao-module-ai` 按 Prompt、模型输出或 Agent 自述给自己增加工具、上下文、外发或预算 |
|
||||
| Handoff | market 只写 Authorization / Install / 来源侧 handoff token / 授权摘要 / 跳转审计,目标 owner 生成并消费自己的 precheck/session | 市场模块直接写槽位、知识绑定、正文归因、作品正文或目标预检结果 |
|
||||
| Source Status Event | 来源 owner 发布事件,影响对象 owner 幂等处理 | 查询时临时拼状态但不落传播结果 |
|
||||
@ -156,7 +283,7 @@ Source / Authorization Context 是横切上下文:来源 owner 负责发布 So
|
||||
- 不按 `admin` 和 `app` 复制两套领域服务。
|
||||
- 不让管理后台 controller 直接写用户作品正文、知识事实或候选确认结果。
|
||||
- 不让用户端 controller 直接修改 MetaSchema、系统 Prompt、系统 Agent、质量策略、Tool Grant 或市场治理结果。
|
||||
- 不让 Content controller 把 MetaSchema 当普通作品表单结构随意更新;MetaSchema 写入只能经 Governance/Admin facade、影响预览、版本发布和审计。
|
||||
- 不让 Content controller 把 MetaSchema 当普通作品表单结构随意更新;MetaSchema 写入只能经 `yudao-module-meta`、影响预览、版本发布和审计。
|
||||
- 不让 `yudao-module-ai` 自授工具、上下文、外发目标、预算或来源访问权限;运行时只能消费服务端签发的 Runtime Permission Envelope。
|
||||
- 不让 `yudao-server` 聚合层承载业务逻辑。
|
||||
- 不让 `infra`、`system` 成为 Muse 业务事实的万能容器。
|
||||
@ -182,11 +309,12 @@ yudao-gateway
|
||||
-> yudao-server
|
||||
-> yudao-module-system
|
||||
-> yudao-module-infra
|
||||
-> yudao-module-meta # MetaSchema 独立模块
|
||||
-> yudao-module-content
|
||||
-> yudao-module-knowledge
|
||||
-> yudao-module-ai
|
||||
-> yudao-module-market
|
||||
-> yudao-module-account/member
|
||||
-> yudao-module-member # 承载 Account BC
|
||||
```
|
||||
|
||||
可以按模块边界演进到微服务,但阶段 7 文档不要求立即拆成多进程。无论单体聚合还是微服务,领域 owner、API 前缀、权限边界和事件合同保持不变。
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
# 后端-03:关键流程实现与接口契约
|
||||
|
||||
- 版本:v7
|
||||
- 更新日期:2026-05-23
|
||||
- 版本:v9
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:后端 / 前端 / 架构 / 测试
|
||||
- 阅读时间:30-50 分钟
|
||||
- 边界说明:本文件只讲关键链路、事务边界、失败模式和后端职责归属;精确路径、请求响应和错误码看 `后端-05`,状态机看 `架构-04`,工程模块看 `后端-02`。
|
||||
@ -70,7 +70,7 @@ Accept Suggestion 是正文候选进入正文 Canonical 的唯一合法入口。
|
||||
1. 校验用户对 Work / Chapter / Block / Suggestion 的权限。
|
||||
2. 校验 Suggestion 仍处于 Active Shadow,未过期、未失效、未 blocked。
|
||||
3. 校验 expectedRevision。
|
||||
4. 消费或重算 Candidate Decision Envelope,包含 `qualityResultVersion`、输出合规结果、静态检查结果、Authorization Snapshot、Source Snapshot、Source Status、market feature gate、`workAssetUsePrecheckId`、`expectedRevision` 和 `idempotencyKey`。
|
||||
4. 实时校验来源版本:比对候选记录的 `source_version` 与当前来源实际版本,校验 `qualityResultVersion`、输出合规结果、静态检查结果、Authorization Snapshot、Source Snapshot、Source Status、market feature gate、`workAssetUsePrecheckId` 和 `idempotencyKey`。
|
||||
5. 写 Block 新 revision。
|
||||
6. 写 Block Source Attribution。
|
||||
7. 将 Suggestion 迁入 Archive。
|
||||
@ -95,10 +95,43 @@ Accept Suggestion 是正文候选进入正文 Canonical 的唯一合法入口。
|
||||
- 来源 revoked / recalled / blocked / owner_missing / unauthorized:候选 blocked 或 invalidated,不写正文。
|
||||
- 市场作品资产缺 `workAssetUsePrecheckId` 或 feature gate:不写正文。
|
||||
- revision 冲突:返回可恢复冲突信息,不静默覆盖。
|
||||
- Candidate Decision Envelope 过期、质量结果版本不匹配、输出合规或静态检查 blocked:返回阻断原因、来源归因和可重算入口,不写正文。
|
||||
- 来源版本不匹配、质量结果版本不匹配、输出合规或静态检查 blocked:返回阻断原因、来源归因和可重试入口,不写正文。
|
||||
- 失败响应必须保留 `blockSourceAttribution`、`blockedReasons`、`sourceStatusReasons`、`reasonAttributions`、`authorizationSnapshotId`、`qualityResultVersion` 和 `nextActions`,不能把 stale / revoked / unauthorized 来源压缩成普通失败。
|
||||
- outbox 或投影失败:不得回滚已成功的正文主事务,但必须可重试、可观察、可审计。
|
||||
|
||||
## 4A. 正文保存后知识提取
|
||||
|
||||
正文保存成功后,系统可触发知识提取链路,将正文变更转化为知识草稿供用户确认。
|
||||
|
||||
```text
|
||||
Block 保存成功(Content owner)
|
||||
-> AFTER_COMMIT 写 outbox 事件(BlockSavedEvent)
|
||||
-> AI/Knowledge 消费事件
|
||||
-> AI 创建知识提取任务(extraction task)
|
||||
-> AI 调用模型提取实体/关系/事件
|
||||
-> AI 生成 Knowledge Draft(Shadow)
|
||||
-> 用户在知识草稿入口确认
|
||||
-> Knowledge 写 Local KB Canonical
|
||||
```
|
||||
|
||||
流程职责拆分:
|
||||
|
||||
| 阶段 | Owner | 说明 |
|
||||
|---|---|---|
|
||||
| Block 保存和 outbox 事件 | `content` | 正文保存主事务成功后,AFTER_COMMIT 写 `BlockSavedEvent` 到 outbox,包含 `workId`、`chapterId`、`blockId`、`revision`、`changeSource` |
|
||||
| 事件消费和提取任务创建 | `ai` | 消费 `BlockSavedEvent`,按策略判断是否需要提取(例如 revision 变化量、章节完成度、用户配置),创建 extraction task |
|
||||
| 知识提取执行 | `ai` | 调用模型提取实体、关系、事件,生成 Shadow 结果 |
|
||||
| Knowledge Draft 生成 | `knowledge` | AI 提取完成后,通过 Knowledge facade 请求创建或刷新 Knowledge Draft |
|
||||
| 用户确认 | `knowledge` | 用户在知识草稿入口确认后写 Local KB Canonical |
|
||||
|
||||
约束:
|
||||
|
||||
- 正文保存主事务不等待知识提取完成;提取是异步 followup task。
|
||||
- 提取失败不回滚已保存正文。
|
||||
- 提取结果只能进入 Knowledge Draft(Shadow),不能直接写 Local KB Canonical。
|
||||
- 提取任务按 `workId + chapterId + blockId + revision` 幂等;同一 revision 不重复提取。
|
||||
- Block 保存响应可包含 `followupTasks` 字段,告知前端有知识提取任务已触发(见 `后端-05` 4.3 节 `PUT /blocks/{blockId}` 响应说明)。
|
||||
|
||||
## 5. Knowledge Draft 确认
|
||||
|
||||
知识草稿确认由 `yudao-module-knowledge` owner 执行。
|
||||
@ -178,8 +211,8 @@ AI 链路由 `yudao-module-ai` 二开承载。
|
||||
-> 静态检查 / 来源状态校验
|
||||
-> Quality Gate
|
||||
-> Output Compliance
|
||||
-> Candidate Decision Envelope
|
||||
-> 用户决策
|
||||
-> Shadow Candidate(记录 source_version)
|
||||
-> 用户决策(接受时实时对比来源版本)
|
||||
```
|
||||
|
||||
后端职责:
|
||||
@ -275,8 +308,8 @@ Account/Member 只提供用户可见权益和汇总,不替代业务 owner。
|
||||
| `eventId` | 幂等事件 ID |
|
||||
| `sourceType` / `sourceId` / `sourceVersion` | 来源对象和版本 |
|
||||
| `eventType` | SourceEventType,例如 `source_updated`、`source_revoked`、`asset_recalled`、`asset_delisted`、`asset_blocked`、`owner_missing`、`authorization_revoked`、`authorization_expired`、`license_changed`、`processing_failed`、`recheck_required` |
|
||||
| `sourceStatus` | SourceStatus,例如 `active`、`stale`、`revoked`、`recalled`、`delisted`、`blocked`、`owner_missing`、`unauthorized`、`needs_recheck` |
|
||||
| `actionPolicy` | SourceActionPolicy:`allowed`、`read_only`、`blocked`、`needs_recheck` |
|
||||
| `sourceStatus` | SourceStatus,例如 `active`、`stale`、`revoked`、`recalled`、`delisted`、`blocked`、`owner_missing`、`unauthorized` |
|
||||
| `actionPolicy` | SourceActionPolicy:`allowed`、`read_only`、`blocked`、`needs_recheck`(注:needs_recheck 是 ActionPolicy 层面的动作策略结论,不是 SourceStatus 枚举值) |
|
||||
| `reasonCode` | 治理、授权、版本、权利、合规或处理失败原因 |
|
||||
| `reasonAttribution` | reasonCode 对应的来源 owner、授权快照、治理动作或处理任务 |
|
||||
| `affectedScopes` | 候选、草稿、绑定、安装、运行任务、导出、下载、个人中心记录等影响范围 |
|
||||
@ -293,17 +326,17 @@ Account/Member 只提供用户可见权益和汇总,不替代业务 owner。
|
||||
| 市场资产下架但历史授权可读 | `asset_delisted` | `delisted` | `read_only` |
|
||||
| 治理封禁 | `asset_blocked` | `blocked` | `blocked` |
|
||||
| owner 缺失或不可见 | `owner_missing` | `owner_missing` | `blocked` |
|
||||
| 版本、许可或处理状态变化 | `license_changed` / `processing_failed` / `recheck_required` | `stale` 或 `needs_recheck` | `needs_recheck` |
|
||||
| 版本、许可或处理状态变化 | `license_changed` / `processing_failed` / `recheck_required` | `stale` | `needs_recheck` |
|
||||
|
||||
处理结果不得改写已确认 Canonical。允许的动作是禁用新使用、标记需重验、作废未确认对象、取消或阻断运行中任务、失效下载凭证、刷新个人中心摘要和写审计。
|
||||
|
||||
## 12. P1 跨模块补充契约
|
||||
|
||||
- Candidate Decision Archive owner 单一化:AI 拥有归档表和 Decision Envelope 版本,Content Accept 只能通过 AI decision facade 消费或重算后拿 `decisionArchiveId` 引用,不在 Content 表复制候选决策事实。
|
||||
- Download Credential 必须承载来源传播结果:来源 revoked / recalled / blocked / unauthorized 后,已签发凭证进入 disabled 或 needs_recheck,下载时再次校验授权快照和 source event version。
|
||||
- Candidate Decision Archive owner 单一化:AI 拥有归档表,Content Accept 只能通过 AI decision facade 消费后拿 `decisionArchiveId` 引用,不在 Content 表复制候选决策事实。接受时实时校验来源版本,不再依赖预计算的 Envelope。
|
||||
- Download Credential 必须承载来源传播结果:来源 revoked / recalled / blocked / unauthorized 后,已签发凭证进入 disabled 状态,下载时再次校验授权快照和 source event version。
|
||||
- Local KB entity / relation / event 必须保存来源快照、授权快照和 source status 摘要;来源事件不删除正式知识,但阻断新检索、新生成、新确认和受限导出。
|
||||
- New-API binding、quota request、call attribution 必须有本地幂等记录、correlationId、重试组和用户可见归属状态;Muse 不复制 Provider、路由、成本和原始日志 authority。
|
||||
- Pay callback / refund 只通过支付引用和幂等事件传播到 account entitlement ledger;退款、撤销和补偿都用 append-only 反向流水,不覆盖原权益流水。
|
||||
- Pay callback / refund 只通过支付引用和幂等事件传播到 account entitlement 可变表和审计日志;退款、撤销和补偿通过反向变更更新可变表并写审计日志记录。
|
||||
- 文件上传必须绑定 owner、用途、大小、MIME、hash、扫描状态、保留期、清理策略和来源快照;Yudao infra 只提供文件能力,不拥有导入、知识资料或市场素材的业务事实。
|
||||
|
||||
## 13. 关联阅读
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
# 后端-04:统一数据库 Schema(结构定义)-v1
|
||||
|
||||
- 版本:v8
|
||||
- 更新日期:2026-05-23
|
||||
- 版本:v10
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:后端 / 架构 / 前端 / 数据库维护者 / 测试
|
||||
- 阅读时间:35-55 分钟
|
||||
- 边界说明:本文件定义 Muse 在 `YunaiV/yudao-cloud` fork 上新增或二开的业务 Schema 目标。Yudao 原生 `system`、`infra`、`member`、`pay`、`bpm`、`report`、`mp` 表结构由对应 Yudao 模块负责,本文不重复定义。接口契约见 `后端-05-统一API契约-v1.md`,状态机见 `架构-04-状态机与约束清单.md`,工程模块见 `后端-02-工程结构与模块职责.md`。
|
||||
@ -50,7 +50,7 @@ Muse 新业务表建议使用统一前缀:
|
||||
| 知识 | `muse_knowledge_` | `muse_knowledge_draft` |
|
||||
| AI / Agent | `muse_ai_` | `muse_ai_candidate` |
|
||||
| 市场 | `muse_market_` | `muse_market_asset` |
|
||||
| 账户 | `muse_account_` | `muse_account_usage_record` |
|
||||
| 账户 | `muse_member_` | `muse_member_usage_record` |
|
||||
| 来源与授权 | `muse_source_` / `muse_authorization_` | `muse_source_status_event` / `muse_authorization_snapshot` |
|
||||
| 审计 | `muse_audit_` | `muse_audit_event` |
|
||||
| Outbox | `muse_outbox_` | `muse_outbox_event` |
|
||||
@ -60,11 +60,11 @@ Muse 新业务表建议使用统一前缀:
|
||||
|
||||
Owner 约定:
|
||||
|
||||
- `content` 拥有作品、章节、Block、正文版本、Block Source Attribution、Planning Canonical、导入任务、导入文件、章节上下文、导出和下载凭证;MetaSchema 可以物理承载在 content 表,但逻辑 owner 是 Admin/Governance。
|
||||
- `content` 拥有作品、章节、Block、正文版本、Block Source Attribution、Planning Canonical、导入任务、导入文件、章节上下文、导出和下载凭证。
|
||||
- `knowledge` 拥有 User KB、Local KB、Knowledge Draft、Knowledge Entity/Relation/Event 和知识来源绑定。
|
||||
- `ai` 拥有 Prompt、Agent、Protected Node Registry、Override Slot、Tool Grant 投影、Runtime Permission Envelope、AI Task、Parse Job、Chapter Parse Result、Candidate、Quality Result 和 Candidate Decision Archive。
|
||||
- `ai` 拥有 Prompt、Agent、Protected Node Registry、Override Slot、Tool Grant 投影、Runtime Permission Envelope、AI Task、Parse Job、Chapter Parse Result、Candidate、Quality Result 和 Candidate Decision Archive。候选记录 `source_version`,接受时实时对比来源版本。
|
||||
- `market` 拥有 Market Asset、License、Authorization、Install、来源侧 Handoff Token、授权摘要、跳转审计、Publish、Review、Governance 和 Appeal;不拥有目标 owner precheck/session。
|
||||
- `account` 拥有 Muse 创作权益、Usage、Entitlement、个人中心读模型、安全事件和账户导出。
|
||||
- `account`(物理承载于 member 模块)拥有 Muse 创作权益、Usage、Entitlement、个人中心读模型、安全事件和账户导出。
|
||||
- `source/authorization` 是横切来源与授权快照 owner:由来源 owner 生成或引用,负责不可变来源快照、授权快照、来源状态事件和传播目标。
|
||||
- `audit/outbox/integration` 是横切 owner:由触发动作的业务模块写入业务审计、领域事件和外部调用摘要,不接管 Content / Knowledge / AI / Market / Account 的 Canonical 事实。
|
||||
|
||||
@ -110,12 +110,13 @@ API 层 ID 规则:
|
||||
|
||||
| 分区 | Owner 模块 | 核心表 |
|
||||
|---|---|---|
|
||||
| Content | `yudao-module-content` | Work、Chapter、Block、Block Revision、Block Source Attribution、Planning、MetaSchema 物理表、Import、Import File、Chapter Context、Export |
|
||||
| Content | `yudao-module-content` | Work、Chapter、Block、Block Revision、Block Source Attribution、Planning、Import、Import File、Chapter Context、Export |
|
||||
| MetaSchema | `yudao-module-meta` | MetaSchema、MetaField、MetaVisibilityPolicy、MetaSchemaVersion |
|
||||
| Knowledge | `yudao-module-knowledge` | Knowledge Base、Document、Chunk、Processing Job、Local KB、Knowledge Draft、Knowledge Source Binding |
|
||||
| AI / Agent | `yudao-module-ai` 二开 | Prompt、Agent、System Function Chain、Protected Node、Override Slot、Tool Grant、Runtime Envelope、AI Task、Parse Job、Chapter Parse Result、Candidate、Quality Policy、Evaluation |
|
||||
| Marketplace | `yudao-module-market` | Asset、Listing、License、Purchase/Authorization、Install、Collection、Publish、Review、Governance、Appeal、Source-side Handoff |
|
||||
| Account | `yudao-module-account` 或 `member` 二开 | Profile Extension、Preference、Entitlement Snapshot、Entitlement Ledger、Quota Adjustment、Usage Record、Asset Summary、Security Event、Account Export |
|
||||
| Source / Authorization | 来源对象 owner + outbox 协作 | Source Snapshot、Authorization Snapshot、Source Status Event、Source Propagation |
|
||||
| Account | `yudao-module-member`(已决策) | Profile Extension、Preference、Entitlement Snapshot、Entitlement(可变表)、Entitlement Audit Log、Quota Adjustment、Usage Record、Asset Summary、Security Event、Account Export |
|
||||
| Source / Authorization | `yudao-module-infra`(DDL) + 各业务模块分散写入 | Source Snapshot、Authorization Snapshot、Source Status Event、Source Propagation |
|
||||
| Audit / Outbox / Integration | Muse 业务模块 + Yudao infra | High-risk Audit、Outbox、Projection、Integration Call Log |
|
||||
|
||||
### 3.1 表级 Owner 矩阵
|
||||
@ -132,10 +133,10 @@ API 层 ID 规则:
|
||||
| `muse_content_planning_item` | content | content | ai / knowledge | planning 变化写 outbox,供 AI 上下文投影消费 |
|
||||
| `muse_content_narrative_state` | content | content | ai / knowledge | narrative state 变化写 outbox |
|
||||
| `muse_content_work_asset_use_precheck` | content | content target owner service | market / ai / source | 作品资产用于参考、模板或 AI 上下文的目标预检;阶段 7 默认 feature disabled |
|
||||
| `muse_content_meta_schema` | content | governance/admin facade -> content meta service | ai / knowledge / market / account | 激活、停用、回滚写 outbox,供投影和运行时缓存刷新 |
|
||||
| `muse_content_meta_field` | content | governance/admin facade -> content meta service | ai / knowledge | 随 MetaSchema 版本发布传播 |
|
||||
| `muse_content_meta_visibility_policy` | content | governance/admin facade -> content meta service | ai / knowledge / account | 随 MetaSchema 版本发布传播 |
|
||||
| `muse_content_meta_schema_version` | content | governance/admin facade -> content meta service | ai / knowledge / market / account | 发布、激活、回滚和影响预览写 outbox |
|
||||
| `muse_meta_schema` | meta | `yudao-module-meta` admin service | ai / knowledge / market / account / content | 激活、停用、回滚写 outbox,供投影和运行时缓存刷新 |
|
||||
| `muse_meta_field` | meta | `yudao-module-meta` admin service | ai / knowledge / content | 随 MetaSchema 版本发布传播 |
|
||||
| `muse_meta_visibility_policy` | meta | `yudao-module-meta` admin service | ai / knowledge / account / content | 随 MetaSchema 版本发布传播 |
|
||||
| `muse_meta_schema_version` | meta | `yudao-module-meta` admin service | ai / knowledge / market / account / content | 发布、激活、回滚和影响预览写 outbox |
|
||||
| `muse_content_import_task` | content | content | knowledge / ai | 导入完成触发 AI parse job 或正文初始化事件 |
|
||||
| `muse_content_import_file` | content | content + infra file facade | ai / knowledge / source | 上传文件 owner、hash、扫描、保留期和清理策略写 outbox |
|
||||
| `muse_content_import_chapter_context` | content | content | ai / knowledge | 章节拆分上下文供 AI Parse Job 读取,不保存解析结果 |
|
||||
@ -153,7 +154,7 @@ API 层 ID 规则:
|
||||
| `muse_knowledge_draft` | knowledge | knowledge | content / ai / source | draft stale、invalidated、needs_reextract 写 outbox |
|
||||
| `muse_knowledge_source_binding` | knowledge | knowledge | content / ai / market / source | 绑定状态受来源事件传播,阻断新检索或生成 |
|
||||
| `muse_knowledge_bind_precheck` | knowledge | knowledge target owner service | market / source / account | 知识绑定目标预检或签名消费凭证,原子消费后写 source binding |
|
||||
| `muse_source_snapshot` | source/authorization | 来源 owner 或 source facade | content / knowledge / ai / market / account | 创建后不可变,通过引用传播 |
|
||||
| `muse_source_snapshot` | infra(DDL owner) | 各业务模块分散写入 | content / knowledge / ai / market / account | 创建后不可变,通过引用传播 |
|
||||
| `muse_authorization_snapshot` | source/authorization | authorization facade | content / knowledge / ai / market / account | 创建后不可变,过期或撤权触发重验 |
|
||||
| `muse_source_status_event` | source/authorization | 来源 owner + market governance | content / knowledge / ai / market / account | `event_key` 幂等进入 outbox 并展开传播目标 |
|
||||
| `muse_source_propagation_target` | source/authorization | source propagation worker | content / knowledge / ai / market / account | 逐目标记录 pending / applied / blocked / failed / skipped |
|
||||
@ -197,18 +198,19 @@ API 层 ID 规则:
|
||||
| `muse_market_review_submission` | market | market | audit / bpm | 审核状态写 outbox |
|
||||
| `muse_market_governance_action` | market | market governance | source / authorization / audit | 下架、召回、blocked 必须写 Source Status Event |
|
||||
| `muse_market_appeal` | market | market | audit / bpm | 申诉状态写 outbox |
|
||||
| `muse_account_profile_ext` | account | account | market / content | 个人资料变化写账户读模型事件 |
|
||||
| `muse_account_preference` | account | account | content / ai | 偏好变化刷新运行时默认值 |
|
||||
| `muse_account_new_api_binding` | account | account integration service | ai / audit | 网关用户绑定摘要和重验状态,不保存 token 或 provider authority |
|
||||
| `muse_account_entitlement_snapshot` | account | account entitlement service | ai / market | 权益快照变化写 outbox |
|
||||
| `muse_account_entitlement_ledger` | account | account entitlement service | ai / market / audit | append-only 权益流水写审计 |
|
||||
| `muse_account_quota_request` | account | account integration service | ai / audit | New-API 额度配置请求、correlationId、幂等和补偿状态 |
|
||||
| `muse_account_quota_adjustment` | account | admin account service | ai / audit | 管理员调额 append-only,按幂等键去重 |
|
||||
| `muse_account_usage_record` | account | account usage service | ai / content / knowledge / market | usage 摘要写个人中心读模型 |
|
||||
| `muse_account_call_attribution_job` | account | account attribution service | ai / integration / audit | 调用归属、补偿和用户可见解释任务 |
|
||||
| `muse_account_asset_summary` | account | account projection worker | market / ai / knowledge | 只做读模型投影 |
|
||||
| `muse_account_security_event` | account | account / audit | content / market | 安全事件 append-only |
|
||||
| `muse_account_export_task` | account | account | content / market / source / authorization | API 应承接导出任务创建、轮询和下载审计 |
|
||||
| `muse_member_profile_ext` | member | member | market / content | 个人资料变化写账户读模型事件 |
|
||||
| `muse_member_preference` | member | member | content / ai | 偏好变化刷新运行时默认值 |
|
||||
| `muse_member_new_api_binding` | member | member integration service | ai / audit | 网关用户绑定摘要和重验状态,不保存 token 或 provider authority |
|
||||
| `muse_member_entitlement_snapshot` | member | member entitlement service | ai / market | 权益快照变化写 outbox |
|
||||
| `muse_member_entitlement` | member | member entitlement service | ai / market / audit | 可变权益表,变更时同步写审计日志 |
|
||||
| `muse_member_entitlement_audit_log` | member | member entitlement service | ai / market / audit | 权益变更审计日志,append-only |
|
||||
| `muse_member_quota_request` | member | member integration service | ai / audit | New-API 额度配置请求、correlationId、幂等和补偿状态 |
|
||||
| `muse_member_quota_adjustment` | member | admin member service | ai / audit | 管理员调额 append-only,按幂等键去重 |
|
||||
| `muse_member_usage_record` | member | member usage service | ai / content / knowledge / market | usage 摘要写个人中心读模型 |
|
||||
| `muse_member_call_attribution_job` | member | member attribution service | ai / integration / audit | 调用归属、补偿和用户可见解释任务 |
|
||||
| `muse_member_asset_summary` | member | member projection worker | market / ai / knowledge | 只做读模型投影 |
|
||||
| `muse_member_security_event` | member | member / audit | content / market | 安全事件 append-only |
|
||||
| `muse_member_export_task` | member | member | content / market / source / authorization | API 应承接导出任务创建、轮询和下载审计 |
|
||||
| `muse_audit_event` | audit | 动作 owner | 全模块 | append-only,不反写业务事实 |
|
||||
| `muse_outbox_event` | outbox | 事实 owner | 全模块 | `event_key` 幂等消费 |
|
||||
| `muse_projection_task` | integration/outbox | 投影 owner | 全模块 | 投影失败可重试,不反写 Canonical |
|
||||
@ -297,7 +299,7 @@ Block revision 历史。
|
||||
| `source_object_id` / `source_version` | 来源对象和版本 |
|
||||
| `lineage_payload` | 派生链路摘要 |
|
||||
| `authorization_snapshot_id` | 授权快照 |
|
||||
| `source_status` | SourceStatus:`active` / `stale` / `revoked` / `recalled` / `delisted` / `blocked` / `owner_missing` / `unauthorized` / `needs_recheck` |
|
||||
| `source_status` | SourceStatus:`active` / `stale` / `revoked` / `recalled` / `delisted` / `blocked` / `owner_missing` / `unauthorized` |
|
||||
| `license_restriction_snapshot` | 导出、二次分发、AI 上下文等限制 |
|
||||
|
||||
约束:
|
||||
@ -319,18 +321,18 @@ Block revision 历史。
|
||||
- 规划候选未确认前不得进入正式生成上下文。
|
||||
- Narrative State 需要真实持久化载体,不能只靠 MetaSchema 表达。
|
||||
|
||||
### 4.7 MetaSchema 表
|
||||
### 4.7 MetaSchema 表(归属 `yudao-module-meta` 独立模块)
|
||||
|
||||
MetaSchema 是 Admin/Governance 逻辑 owner 的元结构定义,由管理后台配置、影响预览、发布、激活和回滚,但它不是管理员私有数据,也不是某个页面表单的临时状态。阶段 7 可以由 `yudao-module-content` 物理承载基础表,按 `domain / scope / target_type` 服务作品、规划、知识和 AI 上下文;物理表放在 content 不代表 Content app/admin API 可以任意改结构。
|
||||
MetaSchema 是独立模块 `yudao-module-meta` 的元结构定义,由管理后台配置、影响预览、发布、激活和回滚,但它不是管理员私有数据,也不是某个页面表单的临时状态。`yudao-module-meta` 按 `domain / scope / target_type` 服务作品、规划、知识和 AI 上下文;Content、Knowledge、AI 等模块通过 facade-api 只读消费。
|
||||
|
||||
| 表 | 职责 |
|
||||
|---|---|
|
||||
| `muse_content_meta_schema` | 元结构根对象,包含 schema_key、domain、scope、target_type、当前激活版本和适用范围 |
|
||||
| `muse_content_meta_field` | 字段定义、类型、必填、枚举、引用、排序和校验规则 |
|
||||
| `muse_content_meta_visibility_policy` | `uiVisible`、`aiContext`、`userEditable`、`userSearchable`、`exportable` 等可见性策略 |
|
||||
| `muse_content_meta_schema_version` | 发布版本、激活状态、灰度、回滚和影响预览摘要 |
|
||||
| `muse_meta_schema` | 元结构根对象,包含 schema_key、domain、scope、target_type、当前激活版本和适用范围 |
|
||||
| `muse_meta_field` | 字段定义、类型、必填、枚举、引用、排序和校验规则 |
|
||||
| `muse_meta_visibility_policy` | `uiVisible`、`aiContext`、`userEditable`、`userSearchable`、`exportable` 等可见性策略 |
|
||||
| `muse_meta_schema_version` | 发布版本、激活状态、灰度、回滚和影响预览摘要 |
|
||||
|
||||
`muse_content_meta_schema` 字段合同:
|
||||
`muse_meta_schema` 字段合同:
|
||||
|
||||
| 字段语义 | 要求 |
|
||||
|---|---|
|
||||
@ -342,11 +344,11 @@ MetaSchema 是 Admin/Governance 逻辑 owner 的元结构定义,由管理后
|
||||
| `effective_scope` | 适用范围摘要,至少能表达全局、租户、用户、作品、类型灰度 |
|
||||
| `projection_version` | 当前读模型或运行时缓存使用的投影版本 |
|
||||
|
||||
`muse_content_meta_schema_version` 字段合同:
|
||||
`muse_meta_schema_version` 字段合同:
|
||||
|
||||
| 字段语义 | 要求 |
|
||||
|---|---|
|
||||
| `schema_id` | 关联 `muse_content_meta_schema` |
|
||||
| `schema_id` | 关联 `muse_meta_schema` |
|
||||
| `schema_key` | 冗余稳定键,便于审计和跨版本查询 |
|
||||
| `version_no` | 单调递增版本号,同一 `schema_key` 下唯一 |
|
||||
| `status` | `draft` / `reviewing` / `published` / `active` / `disabled` / `archived` / `rolled_back` |
|
||||
@ -361,13 +363,13 @@ MetaSchema 是 Admin/Governance 逻辑 owner 的元结构定义,由管理后
|
||||
|
||||
约束:
|
||||
|
||||
- MetaSchema 写入入口只能是 `/admin-api/muse/governance/**` 经 Governance/Admin facade;Content 只提供受控的 meta application service 和版本化投影。
|
||||
- MetaSchema 写入入口只能是 `/admin-api/muse/governance/**` 经 `yudao-module-meta`;Content 等模块只能通过 meta facade-api 消费只读投影。
|
||||
- Content / app API 只能读取 active/gray 投影并在目标 owner 命令中校验,不能创建、发布、激活、回滚或废弃 Schema。
|
||||
- 管理员配置 MetaSchema 不等于修改用户作品内容、Local KB 或用户知识库资料。
|
||||
- MetaSchema 不能把系统保护节点重新分类为开放槽位。
|
||||
- `uiVisible=false` 不等于不能进 AI 上下文;`aiContext=true` 不等于用户可见;`exportable=true` 仍必须受 owner、授权、来源状态和导出许可约束。
|
||||
- 后端必须在可见投影、保存、检索、AI 上下文组装和导出预检中重复校验 MetaSchema 策略,不能只靠前端隐藏字段。
|
||||
- 唯一键:`muse_content_meta_schema(domain, scope, target_type, schema_key)`;版本唯一键:`muse_content_meta_schema_version(schema_key, version_no)`。
|
||||
- 唯一键:`muse_meta_schema(domain, scope, target_type, schema_key)`;版本唯一键:`muse_meta_schema_version(schema_key, version_no)`。
|
||||
- 激活唯一约束:同一 `schema_key + effective_scope` 仅允许一条 `active_flag = true` 的版本;物理库不支持部分唯一索引时,由状态机事务和唯一辅助列共同保证。
|
||||
- 发布前必须写 `impact_preview_snapshot`;回滚必须保留 from / to 版本,不能覆盖原版本记录。
|
||||
|
||||
@ -444,8 +446,28 @@ MetaSchema 是 Admin/Governance 逻辑 owner 的元结构定义,由管理后
|
||||
| `muse_knowledge_chunk` | 系统拆分切块结果 |
|
||||
| `muse_knowledge_processing_job` | 解析、切块、索引、入 RAG、重建投影任务 |
|
||||
|
||||
`muse_knowledge_document_version` 字段合同:
|
||||
|
||||
| 字段语义 | 要求 |
|
||||
|---|---|
|
||||
| `document_id` | 关联 `muse_knowledge_document` |
|
||||
| `version_no` | 同一 document 下单调递增版本号 |
|
||||
| `content_hash` | 版本内容 hash,用于 stale 检测和去重 |
|
||||
| `source_snapshot_id` | 来源快照 |
|
||||
| `processing_status` | `pending` / `processing` / `completed` / `failed` |
|
||||
| `previous_version_id` | 前版本引用(BIGINT),指向同一 document 的上一个版本记录,首版本为空 |
|
||||
| `change_summary` | 变更摘要(JSON),记录与前版本的差异概要,包含 `addedSections`、`removedSections`、`modifiedSections`、`diffStats` 等结构化信息 |
|
||||
| `change_reason` | 变更原因(VARCHAR(500)),记录本次版本变更的业务原因,例如"修正角色设定冲突"、"补充第三章背景资料"等 |
|
||||
|
||||
约束:
|
||||
|
||||
- `previous_version_id` 必须指向同一 `document_id` 下已存在的版本记录,或为空(首版本)。
|
||||
- `change_summary` 在非首版本时建议必填,由处理任务自动生成或用户手动填写。
|
||||
- `change_reason` 在非首版本时建议必填,便于审计和版本回溯。
|
||||
- 版本差异追踪不替代 chunk 级别的增量重建策略;处理任务可基于 `change_summary` 优化增量切块和索引。
|
||||
|
||||
通用约束:
|
||||
|
||||
- 拆分切块和入 RAG 是系统保护节点,不允许用户智能体替换。
|
||||
- 处理失败的资料不得进入正式检索和生成上下文。
|
||||
- Chunk 只服务检索和解释,不是正式作品事实。
|
||||
@ -464,13 +486,18 @@ Local KB Canonical 必要来源字段:
|
||||
| 字段语义 | 要求 |
|
||||
|---|---|
|
||||
| `work_id` | 所属作品 |
|
||||
| `entity_type` | 实体类型,例如 `character` / `location` / `item` / `concept` |
|
||||
| `normalized_name` | 标准化名称 |
|
||||
| `scope` | 作用域,例如 `global` / `chapter:{chapterId}` / `arc:{arcId}`,用于区分同名实体在不同范围的含义 |
|
||||
| `source_snapshot_id` | 最近一次确认或修正所依据的来源快照 |
|
||||
| `authorization_snapshot_id` | 确认时的授权快照 |
|
||||
| `source_status` | `active` / `stale` / `revoked` / `recalled` / `blocked` / `owner_missing` / `unauthorized` / `needs_recheck` |
|
||||
| `source_action_policy` | `allowed` / `blocked` / `needs_recheck` |
|
||||
| `source_status` | `active` / `stale` / `revoked` / `recalled` / `blocked` / `owner_missing` / `unauthorized` |
|
||||
| `source_action_policy` | `allowed` / `read_only` / `blocked` / `needs_recheck`(注:needs_recheck 是 ActionPolicy 层面的动作策略结论,表示"下次使用时需要重新校验",不是 SourceStatus 枚举值。SourceStatus 不含 needs_recheck,来源变化时直接决策 active 或 disabled) |
|
||||
| `source_event_version` | 最近已消费的来源事件版本 |
|
||||
| `lineage_payload` | 派生链路摘要,不保存敏感全文 |
|
||||
|
||||
唯一键:`(work_id, entity_type, normalized_name, scope)`。
|
||||
|
||||
约束:
|
||||
|
||||
- Local KB 不需要单独容器表,由 `work_id` 归属表达。
|
||||
@ -512,7 +539,7 @@ Local KB Canonical 必要来源字段:
|
||||
| `source_snapshot_id` | 绑定时的来源快照 |
|
||||
| `authorization_snapshot_id` | 绑定时的授权快照 |
|
||||
| `binding_scope` | `read` / `generation_context` / `parse_context` / `export` |
|
||||
| `binding_status` | SourceStatus / binding 状态投影:`active` / `stale` / `revoked` / `recalled` / `delisted` / `blocked` / `owner_missing` / `unauthorized` / `needs_recheck` / `disabled` |
|
||||
| `binding_status` | SourceStatus / binding 状态投影:`active` / `stale` / `revoked` / `recalled` / `delisted` / `blocked` / `owner_missing` / `unauthorized` / `disabled` |
|
||||
| `target_version` | 绑定目标版本,供来源事件传播和幂等重验 |
|
||||
|
||||
约束:
|
||||
@ -523,7 +550,13 @@ Local KB Canonical 必要来源字段:
|
||||
|
||||
## 6. Source / Authorization Schema
|
||||
|
||||
Source / Authorization 是独立一级 Schema,不属于 Knowledge 子章节。它承接跨 Content、Knowledge、AI、Market、Account 的来源快照、授权快照、来源状态事件和传播目标,避免每个业务模块各自保存一份“当前授权通过”的临时布尔值。
|
||||
Source / Authorization 是独立一级 Schema,不属于 Knowledge 子章节。它承接跨 Content、Knowledge、AI、Market、Account 的来源快照、授权快照、来源状态事件和传播目标,避免每个业务模块各自保存一份”当前授权通过”的临时布尔值。
|
||||
|
||||
物理归属:
|
||||
|
||||
- `source_snapshot` 表 DDL 归 `yudao-module-infra` 模块(横切基础设施表)。
|
||||
- 各业务模块(content、knowledge、ai、market、account)分散写入 source_snapshot 记录。
|
||||
- 传播模式为事件驱动自治:通过 Spring Event 或 MQ 发布来源状态事件,各模块自行监听并处理自己 owner 范围内的传播目标。
|
||||
|
||||
### 6.1 `muse_source_snapshot`
|
||||
|
||||
@ -536,7 +569,7 @@ Source / Authorization 是独立一级 Schema,不属于 Knowledge 子章节。
|
||||
| `source_object_id` | 来源对象 ID |
|
||||
| `source_version` | 来源版本,例如 Block revision、资料版本、资产版本或候选版本 |
|
||||
| `source_hash` | 来源内容 hash,用于 stale 检测 |
|
||||
| `source_status` | SourceStatus:`active` / `stale` / `revoked` / `recalled` / `delisted` / `blocked` / `owner_missing` / `unauthorized` / `needs_recheck` |
|
||||
| `source_status` | SourceStatus:`active` / `stale` / `revoked` / `recalled` / `delisted` / `blocked` / `owner_missing` / `unauthorized` |
|
||||
| `owner_user_id` / `tenant_id` | 来源 owner 上下文;系统或全局来源可以为空但必须有系统 owner 标记 |
|
||||
| `lineage_payload` | 派生链路摘要,不保存敏感全文 |
|
||||
| `evidence_payload` | 权利声明、导入材料、检查摘要或外部引用摘要 |
|
||||
@ -558,7 +591,7 @@ Source / Authorization 是独立一级 Schema,不属于 Knowledge 子章节。
|
||||
| `actor_user_id` | 发起用户或系统服务身份 |
|
||||
| `authorization_purpose` | `read` / `generate` / `bind` / `confirm_draft` / `accept_candidate` / `export` / `download` / `publish` / `evaluate` |
|
||||
| `authorization_scope` | 可用范围摘要,至少表达 work / chapter / kb / asset / account 范围 |
|
||||
| `authorization_status` | `allowed` / `denied` / `expired` / `revoked` / `needs_recheck` |
|
||||
| `authorization_status` | `allowed` / `denied` / `expired` / `revoked` |
|
||||
| `expires_at` | 授权过期时间;长期授权也必须明确策略来源 |
|
||||
| `license_restriction_snapshot` | 导出、二次分发、AI 上下文、市场发布等限制 |
|
||||
| `policy_version` | 授权策略版本 |
|
||||
@ -581,7 +614,7 @@ Source / Authorization 是独立一级 Schema,不属于 Knowledge 子章节。
|
||||
| `source_snapshot_id` | 受影响来源快照 |
|
||||
| `event_type` | SourceEventType:`source_updated` / `source_revoked` / `asset_recalled` / `asset_delisted` / `asset_blocked` / `owner_missing` / `license_changed` / `authorization_expired` / `authorization_revoked` / `processing_failed` / `recheck_required` |
|
||||
| `source_status_after` | 本事件应用后的 SourceStatus,不得只用 event type 推断 |
|
||||
| `action_policy_after` | SourceActionPolicy:`allowed` / `read_only` / `blocked` / `needs_recheck` |
|
||||
| `action_policy_after` | SourceActionPolicy:`allowed` / `read_only` / `blocked` / `needs_recheck`(注:needs_recheck 是 ActionPolicy 层面的动作策略结论,不是 SourceStatus 枚举值) |
|
||||
| `event_version` | 同一来源事件版本,单调递增 |
|
||||
| `event_status` | `pending` / `propagating` / `completed` / `partially_failed` / `failed` |
|
||||
| `reason_code` / `reason_message` | 状态变化原因摘要 |
|
||||
@ -606,7 +639,7 @@ SourceEventType 到状态策略的默认映射:
|
||||
| `asset_blocked` | `blocked` | `blocked` |
|
||||
| `owner_missing` | `owner_missing` | `blocked` |
|
||||
| `authorization_expired` / `authorization_revoked` | `unauthorized` | `blocked` |
|
||||
| `license_changed` / `processing_failed` / `recheck_required` | `needs_recheck` | `needs_recheck` |
|
||||
| `license_changed` / `processing_failed` / `recheck_required` | `stale` | `needs_recheck` |
|
||||
|
||||
### 6.4 `muse_source_propagation_target`
|
||||
|
||||
@ -813,7 +846,7 @@ SourceEventType 到状态策略的默认映射:
|
||||
- Candidate Decision Archive 只证明用户对候选的处理,不证明知识草稿已确认。
|
||||
- 质量门控可以在 Shadow 内有限重写候选,但不能替用户确认正文或知识。
|
||||
|
||||
`muse_ai_candidate_decision_archive` 必须由 AI decision archive service 单一写入,字段至少包含 `candidate_id`、`decision_envelope_version`、`decision_type`、`quality_result_version`、`output_compliance_result_id`、`static_check_result_id`、`source_snapshot_id`、`authorization_snapshot_id`、`source_status`、`market_feature_gate`、`work_asset_use_precheck_id`、`expected_revision`、`idempotency_key`、`blocked_reason_payload` 和 `audit_event_id`。Content Accept 成功后只保存 `decision_id` 引用;失败时不得创建可误认为已接受的归档。
|
||||
`muse_ai_candidate_decision_archive` 必须由 AI decision archive service 单一写入,字段至少包含 `candidate_id`、`decision_type`、`quality_result_version`、`output_compliance_result_id`、`static_check_result_id`、`source_snapshot_id`、`source_version`、`authorization_snapshot_id`、`source_status`、`market_feature_gate`、`work_asset_use_precheck_id`、`expected_revision`、`idempotency_key`、`blocked_reason_payload` 和 `audit_event_id`。候选记录 `source_version`,接受时实时对比当前来源版本。Content Accept 成功后只保存 `decision_id` 引用;失败时不得创建可误认为已接受的归档。
|
||||
|
||||
## 8. Marketplace Schema
|
||||
|
||||
@ -891,34 +924,35 @@ SourceEventType 到状态策略的默认映射:
|
||||
- 下架、召回、blocked 必须产生 Source Status Event。
|
||||
- 管理员拥有系统级治理能力,但不替用户修改已购买或私有资产内容。
|
||||
|
||||
## 9. Account Schema
|
||||
## 9. Account Schema(物理承载:`yudao-module-member`)
|
||||
|
||||
是否新增 `yudao-module-account`,还是改造 `member`,后端落地前需要单独决策。无论物理模块如何选择,账户相关 Schema 只保存 Muse 创作系统所需的权益、用量和聚合视图。
|
||||
已决策:Account BC 由 `yudao-module-member` 承载,不新增 `yudao-module-account`。表前缀统一使用 `muse_member_`,与 member 模块对齐。
|
||||
|
||||
| 表 | 职责 |
|
||||
|---|---|
|
||||
| `muse_account_profile_ext` | Muse 展示名、创作偏好入口等扩展资料 |
|
||||
| `muse_account_preference` | 用户偏好、通知偏好、创作辅助偏好 |
|
||||
| `muse_account_new_api_binding` | Muse 用户和 New-API 网关用户绑定摘要 |
|
||||
| `muse_account_entitlement_snapshot` | 套餐、配额、余额或外部网关权益的本地快照 |
|
||||
| `muse_account_entitlement_ledger` | 权益变更 append-only 流水,承接购买、赠送、到期、撤销和管理员调额结果 |
|
||||
| `muse_account_quota_request` | 向 New-API 或本地权益服务发起的额度配置/同步请求 |
|
||||
| `muse_account_quota_adjustment` | 管理员调额请求记录,支持幂等、原因、前后值和审计 |
|
||||
| `muse_account_usage_record` | 生成、检索、评估、导出等任务级用量归属摘要 |
|
||||
| `muse_account_call_attribution_job` | New-API 调用归属、补偿和用户可见解释任务 |
|
||||
| `muse_account_asset_summary` | 个人中心资产摘要读模型 |
|
||||
| `muse_account_security_event` | 登录、敏感导出、凭证失效、异常访问等安全事件摘要 |
|
||||
| `muse_account_export_task` | 个人资料、安全事件或账户记录导出任务 |
|
||||
| `muse_member_profile_ext` | Muse 展示名、创作偏好入口等扩展资料 |
|
||||
| `muse_member_preference` | 用户偏好、通知偏好、创作辅助偏好 |
|
||||
| `muse_member_new_api_binding` | Muse 用户和 New-API 网关用户绑定摘要 |
|
||||
| `muse_member_entitlement_snapshot` | 套餐、配额、余额或外部网关权益的本地快照 |
|
||||
| `muse_member_entitlement` | 用户当前权益可变表,直接更新当前状态;所有变更写入 `muse_member_entitlement_audit_log` 审计日志 |
|
||||
| `muse_member_entitlement_audit_log` | 权益变更审计日志,记录每次变更的操作者、原因、前后值和来源,用于追溯和合规 |
|
||||
| `muse_member_quota_request` | 向 New-API 或本地权益服务发起的额度配置/同步请求 |
|
||||
| `muse_member_quota_adjustment` | 管理员调额请求记录,支持幂等、原因、前后值和审计 |
|
||||
| `muse_member_usage_record` | 生成、检索、评估、导出等任务级用量归属摘要 |
|
||||
| `muse_member_call_attribution_job` | New-API 调用归属、补偿和用户可见解释任务 |
|
||||
| `muse_member_asset_summary` | 个人中心资产摘要读模型 |
|
||||
| `muse_member_security_event` | 登录、敏感导出、凭证失效、异常访问等安全事件摘要 |
|
||||
| `muse_member_export_task` | 个人资料、安全事件或账户记录导出任务 |
|
||||
|
||||
New-API 绑定、额度和调用归属最小字段:
|
||||
|
||||
| 表 | 必要字段 |
|
||||
|---|---|
|
||||
| `muse_account_new_api_binding` | `account_user_id`、`gateway_user_ref`、`binding_status`、`last_recheck_at`、`correlation_id`、`idempotency_key`、`failure_code` |
|
||||
| `muse_account_quota_request` | `account_user_id`、`request_type`、`requested_value_snapshot`、`correlation_id`、`idempotency_key`、`request_status`、`retry_group`、`failure_code` |
|
||||
| `muse_account_call_attribution_job` | `account_user_id`、`ai_task_id`、`gateway_request_id`、`correlation_id`、`source_owner`、`source_id`、`attribution_status`、`retry_group`、`compensation_status`、`failure_code` |
|
||||
| `muse_member_new_api_binding` | `account_user_id`、`gateway_user_ref`、`binding_status`、`last_recheck_at`、`correlation_id`、`idempotency_key`、`failure_code` |
|
||||
| `muse_member_quota_request` | `account_user_id`、`request_type`、`requested_value_snapshot`、`correlation_id`、`idempotency_key`、`request_status`、`retry_group`、`failure_code` |
|
||||
| `muse_member_call_attribution_job` | `account_user_id`、`ai_task_id`、`gateway_request_id`、`correlation_id`、`source_owner`、`source_id`、`attribution_status`、`retry_group`、`compensation_status`、`failure_code` |
|
||||
|
||||
`muse_account_quota_adjustment` 字段合同:
|
||||
`muse_member_quota_adjustment` 字段合同:
|
||||
|
||||
| 字段语义 | 要求 |
|
||||
|---|---|
|
||||
@ -927,32 +961,39 @@ New-API 绑定、额度和调用归属最小字段:
|
||||
| `idempotency_key` | 管理员调额幂等键,同一管理员动作唯一 |
|
||||
| `reason_code` / `reason_message` | 调整原因,必须可审计 |
|
||||
| `before_value_snapshot` / `after_value_snapshot` | 调整前后权益或配额摘要 |
|
||||
| `ledger_entry_id` | 调整落账后的权益流水引用 |
|
||||
| `ledger_entry_id` | 调整落账后的审计日志引用 |
|
||||
| `status` | `pending` / `applied` / `rejected` / `canceled` |
|
||||
| `approved_by` / `applied_by` | 审批人和执行人 |
|
||||
| `audit_event_id` | 高危动作审计引用 |
|
||||
|
||||
`muse_account_entitlement_ledger` 字段合同:
|
||||
`muse_member_entitlement_audit_log` 字段合同:
|
||||
|
||||
| 字段语义 | 要求 |
|
||||
|---|---|
|
||||
| `account_user_id` | 账户 owner |
|
||||
| `ledger_type` | `purchase` / `admin_adjustment` / `usage_debit` / `refund` / `expiration` / `revoke` / `sync_correction` |
|
||||
| `change_type` | `purchase` / `admin_adjustment` / `usage_debit` / `refund` / `expiration` / `revoke` / `sync_correction` |
|
||||
| `source_owner` / `source_id` | 来源 owner 和来源记录,例如支付订单、调额记录或外部同步记录 |
|
||||
| `idempotency_key` | 落账幂等键 |
|
||||
| `idempotency_key` | 变更幂等键 |
|
||||
| `before_value_snapshot` / `delta_value_snapshot` / `after_value_snapshot` | 前值、变更值和后值 |
|
||||
| `reason_code` / `reason_message` | 业务原因 |
|
||||
| `operator_user_id` | 操作者(系统、管理员或用户自身) |
|
||||
| `audit_event_id` | 审计事件引用 |
|
||||
|
||||
Entitlement 存储模式说明:
|
||||
|
||||
- `muse_member_entitlement` 是可变表,直接反映用户当前权益状态(套餐、配额、余额等),支持高效查询和前置检查。
|
||||
- `muse_member_entitlement_audit_log` 是审计日志表,记录每次权益变更的完整上下文,用于追溯、合规和争议处理。
|
||||
- 不采用 append-only ledger 模式;错误调整通过反向变更 + 审计日志记录,直接更新可变表状态。
|
||||
|
||||
约束:
|
||||
|
||||
- `muse_account_usage_record` 不是 New-API 成本账本 authority。
|
||||
- `muse_account_entitlement_ledger` 和 `muse_account_quota_adjustment` 均为 append-only;错误调整必须用反向流水或撤销记录补偿,不能覆盖原记录。
|
||||
- `muse_member_usage_record` 不是 New-API 成本账本 authority。
|
||||
- `muse_member_entitlement` 是可变表,`muse_member_entitlement_audit_log` 记录所有变更历史;`muse_member_quota_adjustment` 记录管理员调额请求。
|
||||
- 管理员调额必须写幂等键、原因、前后值、操作者和审计事件。
|
||||
- Pay callback、refund、套餐撤销和市场补偿必须按 `source_owner + source_id + idempotency_key` 落到 entitlement ledger;重复回调返回同一处理结果,退款或补偿用反向流水,不覆盖原流水。
|
||||
- Pay callback、refund、套餐撤销和市场补偿必须按 `source_owner + source_id + idempotency_key` 写入审计日志并更新可变表;重复回调返回同一处理结果。
|
||||
- New-API binding、quota request 和 call attribution 只保存 Muse 任务、用户权益和失败恢复需要的引用、correlationId、幂等键和状态,不保存 Provider、供应商路由、成本账本或原始调用日志 authority。
|
||||
- 个人中心是 read model 和跳转入口,不反写作品、知识、市场资产或 AI 任务事实。
|
||||
- 账户导出只能导出个人中心 owner 范围内的数据,并记录下载审计;`muse_account_export_task` 是 API 必须承接的 Schema 落点,接口层应提供创建、轮询、取消和下载凭证领取。
|
||||
- 账户导出只能导出个人中心 owner 范围内的数据,并记录下载审计;`muse_member_export_task` 是 API 必须承接的 Schema 落点,接口层应提供创建、轮询、取消和下载凭证领取。
|
||||
|
||||
## 10. Audit、Outbox 与 Integration
|
||||
|
||||
@ -993,7 +1034,7 @@ Owner 约束:
|
||||
| 入 RAG 不反写事实 | `muse_knowledge_processing_job` / `muse_projection_task` 只产投影和索引 |
|
||||
| 导出必须重验来源许可 | Export Task + Download Credential + Authorization Snapshot |
|
||||
| 管理员不替用户确认私有事实 | Admin 接口只写配置、治理和审计;Content/Knowledge 决策命令必须校验 owner 用户 |
|
||||
| 管理员调额必须可追溯 | `muse_account_quota_adjustment` + `muse_account_entitlement_ledger` append-only,保留幂等键、原因、前后值和审计 |
|
||||
| 管理员调额必须可追溯 | `muse_member_quota_adjustment` + `muse_member_entitlement_audit_log`,保留幂等键、原因、前后值和审计 |
|
||||
|
||||
## 12. 索引策略
|
||||
|
||||
@ -1008,14 +1049,14 @@ Owner 约束:
|
||||
- 解析结果:`parse_job_id + chapter_id + review_status`。
|
||||
- 当前候选:`work_id + status + create_time`。
|
||||
- 知识草稿:`work_id + status + update_time`。
|
||||
- Local KB 检索:`work_id + entity_type + name`。
|
||||
- Local KB 检索:`work_id + entity_type + normalized_name + scope`。
|
||||
- 用户知识库:`owner_user_id + status + update_time`。
|
||||
- 来源传播:`event_key`、`target_owner + target_type + target_id + propagation_status`。
|
||||
- 市场资产:`asset_type + listing_status + category + update_time`。
|
||||
- 市场收藏:`user_id + status + update_time`、`user_id + asset_id`。
|
||||
- 授权/安装:`user_id + asset_type + status`。
|
||||
- 任务轮询:`actor_user_id + task_type + status + update_time`。
|
||||
- 账户权益流水:`account_user_id + create_time`、`idempotency_key`。
|
||||
- 账户权益审计日志:`account_user_id + create_time`、`idempotency_key`。
|
||||
|
||||
### 12.2 唯一性
|
||||
|
||||
@ -1026,9 +1067,9 @@ Owner 约束:
|
||||
- `muse_content_block_revision(block_id, revision)`。
|
||||
- `muse_ai_parse_job(idempotency_key)`。
|
||||
- `muse_ai_chapter_parse_result(parse_job_id, chapter_id, result_type)`。
|
||||
- `muse_content_meta_schema(domain, scope, target_type, schema_key)`。
|
||||
- `muse_content_meta_schema_version(schema_key, version_no)`。
|
||||
- `muse_knowledge_entity(work_id, entity_type, normalized_name)`。
|
||||
- `muse_meta_schema(domain, scope, target_type, schema_key)`。
|
||||
- `muse_meta_schema_version(schema_key, version_no)`。
|
||||
- `muse_knowledge_entity(work_id, entity_type, normalized_name, scope)`。
|
||||
- `muse_source_snapshot(source_owner_module, source_type, source_object_id, source_version, source_hash)`。
|
||||
- `muse_source_status_event(event_key)`。
|
||||
- `muse_source_propagation_target(event_key, target_owner, target_type, target_id, target_version)`。
|
||||
@ -1041,16 +1082,16 @@ Owner 约束:
|
||||
- `muse_market_install(user_id, asset_id, asset_version_id)`。
|
||||
- `muse_market_collection(user_id, asset_id)` 仅约束 `status = active` 的收藏记录。
|
||||
- `muse_market_bind_precheck(precheck_id)`。
|
||||
- `muse_account_new_api_binding(account_user_id)`。
|
||||
- `muse_account_quota_request(idempotency_key)`。
|
||||
- `muse_account_call_attribution_job(correlation_id, gateway_request_id)`。
|
||||
- `muse_account_quota_adjustment(idempotency_key)`。
|
||||
- `muse_account_entitlement_ledger(idempotency_key)`。
|
||||
- `muse_member_new_api_binding(account_user_id)`。
|
||||
- `muse_member_quota_request(idempotency_key)`。
|
||||
- `muse_member_call_attribution_job(correlation_id, gateway_request_id)`。
|
||||
- `muse_member_quota_adjustment(idempotency_key)`。
|
||||
- `muse_member_entitlement_audit_log(idempotency_key)`。
|
||||
- `muse_outbox_event(event_key)`。
|
||||
|
||||
激活唯一约束:
|
||||
|
||||
- MetaSchema:同一 `schema_key + effective_scope` 仅一条 `active_flag = true` 的 `muse_content_meta_schema_version`。
|
||||
- MetaSchema:同一 `schema_key + effective_scope` 仅一条 `active_flag = true` 的 `muse_meta_schema_version`。
|
||||
- Function Chain:同一 `chain_id + effective_scope` 仅一条 `active_flag = true` 的 `muse_ai_system_function_chain_version`。
|
||||
- Quality Policy:同一 `policy_id + effective_scope` 仅一条 `active_flag = true` 的 `muse_ai_quality_policy_version`。
|
||||
|
||||
@ -1058,6 +1099,26 @@ Owner 约束:
|
||||
|
||||
结构化 JSON 字段默认不作为复杂查询主路径。凡是进入筛选、排序、权限、状态机或审计的字段,必须提取成显式列或读模型字段。
|
||||
|
||||
### 12.4 Archive 存储策略
|
||||
|
||||
候选归档(Candidate Decision Archive)、知识草稿归档和任务归档采用同表 + status 模式:
|
||||
|
||||
- 归档记录与活跃记录存储在同一张表中,通过 `status` 字段区分(例如 `active` / `archived` / `expired` / `invalidated`)。
|
||||
- 不单独创建 archive 表或分区表。
|
||||
- 热路径查询通过 `status` 索引过滤归档记录,保证活跃数据查询性能。
|
||||
- 归档记录保留完整上下文(来源快照、授权快照、质量结果、决策类型),用于审计和追溯。
|
||||
- 数据量增长后可通过数据库分区(按时间或状态)优化,但逻辑上仍是同一张表。
|
||||
|
||||
### 12.5 API 版本策略
|
||||
|
||||
API 版本通过 HTTP Header 传递,路由路径不变:
|
||||
|
||||
- Header:`X-API-Version: 1`(当前版本为 1)。
|
||||
- 服务端根据 header 值返回对应版本的响应结构。
|
||||
- 未传 header 时默认使用最新稳定版本。
|
||||
- Deprecation Policy:旧版本至少保留 6 个月,期间返回 `Deprecation` 响应头提示迁移;到期后返回 `API_VERSION_DEPRECATED` 错误码。
|
||||
- 版本变更只影响响应结构和字段语义,不影响路由路径和认证方式。
|
||||
|
||||
## 13. 迁移与 SQL 文件口径
|
||||
|
||||
### 13.1 迁移策略
|
||||
@ -1076,7 +1137,7 @@ Owner 约束:
|
||||
|
||||
目标 SQL 必须等以下事项确认后重新生成:
|
||||
|
||||
1. `account` 是新增模块还是改造 `member`。
|
||||
1. `account` 模块选择:已决策,使用 `yudao-module-member` 承载。
|
||||
2. 目标数据库类型和 Yudao migration 方式。
|
||||
3. 是否启用 Yudao 多租户字段。
|
||||
4. 物理外键策略。
|
||||
|
||||
@ -1,35 +1,334 @@
|
||||
-- ============================================================
|
||||
-- Muse 后端-04a:完整建表 SQL(历史快照说明)
|
||||
-- 更新日期:2026-05-23
|
||||
-- 状态:阶段 7 已废弃为目标建表 SQL,禁止直接执行
|
||||
-- Muse 后端-04a:核心业务建表 SQL(第一批)
|
||||
-- 更新日期:2026-05-24
|
||||
-- 目标数据库:MySQL 8.0+
|
||||
-- 状态:需要与后端-04 Schema 文档对齐,当前为旧实现快照
|
||||
-- ============================================================
|
||||
--
|
||||
-- 重要结论:
|
||||
-- 1. 本文件原内容来自旧 `services/muse-engine` Flyway V1-V18 合并快照,
|
||||
-- 使用 UUID、BIGSERIAL、PostgreSQL JSONB、S0-ID 和旧自研单体口径。
|
||||
-- 2. 阶段 7 的后端工程基线已调整为 `YunaiV/yudao-cloud` fork:
|
||||
-- - 后端复用 Yudao Cloud 的 gateway、system、infra、framework、job、log、file、config 等能力。
|
||||
-- - 管理后台调用 `/admin-api/**`。
|
||||
-- - 用户端 `muse-studio` 调用 `/app-api/**`。
|
||||
-- - Muse 业务表按 content、knowledge、ai、market、account 等模块新增。
|
||||
-- 3. 因此,旧 SQL 不再是目标库的完整建表 SQL,也不能直接搬到 `yudao-cloud`。
|
||||
-- !! 重要说明 !!
|
||||
-- 本文件当前内容为旧实现快照,尚未与最新的后端-04 Schema 文档对齐。
|
||||
-- 已知差异包括但不限于:
|
||||
-- 1. Entitlement 模型已改为可变表 + 审计日志(非 append-only ledger)
|
||||
-- 2. MetaSchema 表已迁移至独立 yudao-module-meta 模块(表前缀改为 muse_meta_)
|
||||
-- 3. 知识实体唯一键已加 scope 字段
|
||||
-- 4. Candidate Decision Envelope 已去掉,简化为候选记录 source_version
|
||||
-- 5. needs_recheck 已从 SourceStatus 枚举中移除
|
||||
-- 6. source_snapshot 表 DDL 归属已改为 infra 模块
|
||||
-- 7. API 版本策略已确定为 X-API-Version header 方式
|
||||
-- 请勿直接执行到 yudao-cloud 目标库,需等后端-04 完全确认后重新生成。
|
||||
--
|
||||
-- 禁止用途:
|
||||
-- - 不允许把本文件作为 `yudao-cloud` 目标库初始化脚本执行。
|
||||
-- - 不允许以本文件的 UUID/BIGSERIAL/JSONB/S0-ID 设计反向覆盖 `后端-04`。
|
||||
-- - 不允许在本文件上继续补旧 `muse-engine` 风格 DDL,然后声称已适配 Yudao。
|
||||
--
|
||||
-- 允许用途:
|
||||
-- - 作为旧实现快照的迁移对照。
|
||||
-- - 用于检查哪些旧字段语义需要在新 `后端-04` 中被保留、改名或废弃。
|
||||
-- - 用于后续生成 Yudao migration 时做差异提醒。
|
||||
--
|
||||
-- 新目标 SQL 生成前置条件:
|
||||
-- 1. `后端-04-统一数据库Schema-v1.md` 的模块 owner 和表清单确认。
|
||||
-- 2. 确认 account 是新增 `yudao-module-account`,还是改造 `yudao-module-member`。
|
||||
-- 3. 确认目标数据库类型、Yudao migration 工具、物理外键策略和多租户字段策略。
|
||||
-- 4. 确认 JSON 字段的物理类型和 MyBatis TypeHandler。
|
||||
-- 5. 按 Yudao 模块分别生成 migration,不再维护一个跨模块手写大 SQL。
|
||||
--
|
||||
-- 当前文件刻意不保留任何可执行 DDL,避免误建旧库。
|
||||
-- ============================================================
|
||||
|
||||
-- ============================================================
|
||||
-- 一、Member 模块(Account BC 物理承载)的 Muse 扩展表
|
||||
-- ============================================================
|
||||
|
||||
-- 用户画像/偏好扩展
|
||||
CREATE TABLE `muse_member_profile` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`user_id` BIGINT NOT NULL COMMENT '用户ID,引用 Yudao system_users',
|
||||
`display_name` VARCHAR(100) DEFAULT NULL COMMENT 'Muse 展示名',
|
||||
`avatar_url` VARCHAR(500) DEFAULT NULL COMMENT '头像URL',
|
||||
`bio` VARCHAR(500) DEFAULT NULL COMMENT '个人简介',
|
||||
`writing_preference` JSON DEFAULT NULL COMMENT '创作偏好(JSON)',
|
||||
`notification_preference` JSON DEFAULT NULL COMMENT '通知偏好(JSON)',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 用户画像扩展(member 模块)';
|
||||
|
||||
-- 用户权益
|
||||
CREATE TABLE `muse_member_entitlement` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||||
`plan_type` VARCHAR(50) NOT NULL COMMENT '套餐类型:free/basic/pro/enterprise',
|
||||
`plan_started_at` DATETIME DEFAULT NULL COMMENT '套餐开始时间',
|
||||
`plan_expires_at` DATETIME DEFAULT NULL COMMENT '套餐过期时间',
|
||||
`ai_call_quota` INT NOT NULL DEFAULT 0 COMMENT 'AI 调用配额(次/月)',
|
||||
`ai_call_used` INT NOT NULL DEFAULT 0 COMMENT 'AI 调用已用量',
|
||||
`storage_quota_mb` BIGINT NOT NULL DEFAULT 0 COMMENT '存储配额(MB)',
|
||||
`storage_used_mb` BIGINT NOT NULL DEFAULT 0 COMMENT '存储已用量(MB)',
|
||||
-- PLACEHOLDER_SQL_PART2
|
||||
`kb_count_quota` INT NOT NULL DEFAULT 0 COMMENT '知识库数量配额',
|
||||
`work_count_quota` INT NOT NULL DEFAULT 0 COMMENT '作品数量配额',
|
||||
`export_quota` INT NOT NULL DEFAULT 0 COMMENT '导出配额(次/月)',
|
||||
`features_json` JSON DEFAULT NULL COMMENT '功能开关集合(JSON)',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 用户权益(member 模块)';
|
||||
|
||||
-- 用户配额
|
||||
CREATE TABLE `muse_member_quota` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||||
`quota_type` VARCHAR(50) NOT NULL COMMENT '配额类型:ai_call/storage/kb_count/work_count/export',
|
||||
`total_amount` BIGINT NOT NULL DEFAULT 0 COMMENT '总配额',
|
||||
`used_amount` BIGINT NOT NULL DEFAULT 0 COMMENT '已使用量',
|
||||
`reset_cycle` VARCHAR(20) DEFAULT NULL COMMENT '重置周期:monthly/yearly/never',
|
||||
`last_reset_at` DATETIME DEFAULT NULL COMMENT '上次重置时间',
|
||||
`next_reset_at` DATETIME DEFAULT NULL COMMENT '下次重置时间',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_quota_type` (`user_id`, `quota_type`),
|
||||
KEY `idx_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 用户配额(member 模块)';
|
||||
|
||||
-- 用量记录
|
||||
CREATE TABLE `muse_member_usage_record` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||||
`usage_type` VARCHAR(50) NOT NULL COMMENT '用量类型:ai_generation/ai_parse/retrieval/export/evaluation',
|
||||
`work_id` BIGINT DEFAULT NULL COMMENT '关联作品ID',
|
||||
`task_id` BIGINT DEFAULT NULL COMMENT '关联任务ID',
|
||||
`token_input` INT DEFAULT 0 COMMENT '输入 token 数',
|
||||
`token_output` INT DEFAULT 0 COMMENT '输出 token 数',
|
||||
`cost_reference` VARCHAR(100) DEFAULT NULL COMMENT '成本参考(非 authority,仅摘要)',
|
||||
`gateway_request_id` VARCHAR(200) DEFAULT NULL COMMENT 'New-API 网关请求ID',
|
||||
-- PLACEHOLDER_SQL_PART3
|
||||
`correlation_id` VARCHAR(200) DEFAULT NULL COMMENT '关联ID,用于去重和归属',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'completed' COMMENT '状态:completed/failed/compensated',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_create_time` (`user_id`, `create_time`),
|
||||
KEY `idx_correlation_id` (`correlation_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 用量记录(member 模块)';
|
||||
|
||||
-- 安全事件
|
||||
CREATE TABLE `muse_member_security_event` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||||
`event_type` VARCHAR(50) NOT NULL COMMENT '事件类型:login_anomaly/credential_expired/sensitive_export/access_denied_burst/device_change/permission_escalation',
|
||||
`severity` VARCHAR(20) NOT NULL DEFAULT 'info' COMMENT '严重级别:info/warning/critical',
|
||||
`occurred_at` DATETIME NOT NULL COMMENT '事件发生时间',
|
||||
`source_ip` VARCHAR(50) DEFAULT NULL COMMENT '来源IP',
|
||||
`device_info` JSON DEFAULT NULL COMMENT '设备信息(JSON)',
|
||||
`affected_scope` VARCHAR(200) DEFAULT NULL COMMENT '影响范围描述',
|
||||
`description` VARCHAR(500) DEFAULT NULL COMMENT '事件描述',
|
||||
`suggested_actions` JSON DEFAULT NULL COMMENT '建议处理措施(JSON数组)',
|
||||
`acknowledged_at` DATETIME DEFAULT NULL COMMENT '用户确认时间',
|
||||
`acknowledged_action` VARCHAR(50) DEFAULT NULL COMMENT '用户确认动作:acknowledged/password_changed/session_revoked/false_positive',
|
||||
`acknowledge_note` VARCHAR(500) DEFAULT NULL COMMENT '用户确认备注',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_occurred` (`user_id`, `occurred_at`),
|
||||
KEY `idx_user_severity` (`user_id`, `severity`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 安全事件(member 模块)';
|
||||
|
||||
-- New-API 绑定
|
||||
CREATE TABLE `muse_member_api_binding` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||||
`gateway_user_ref` VARCHAR(200) NOT NULL COMMENT 'New-API 网关用户引用(不存明文 token)',
|
||||
`binding_status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '绑定状态:active/expired/revoked/recheck_needed',
|
||||
-- PLACEHOLDER_SQL_PART4
|
||||
`last_recheck_at` DATETIME DEFAULT NULL COMMENT '上次重验时间',
|
||||
`correlation_id` VARCHAR(200) DEFAULT NULL COMMENT '关联ID',
|
||||
`idempotency_key` VARCHAR(200) DEFAULT NULL COMMENT '幂等键',
|
||||
`failure_code` VARCHAR(50) DEFAULT NULL COMMENT '失败错误码',
|
||||
`failure_message` VARCHAR(500) DEFAULT NULL COMMENT '失败原因',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse New-API 绑定(member 模块)';
|
||||
|
||||
-- ============================================================
|
||||
-- 二、Content 模块核心表
|
||||
-- ============================================================
|
||||
|
||||
-- 作品
|
||||
CREATE TABLE `muse_content_work` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`owner_user_id` BIGINT NOT NULL COMMENT '所属用户ID',
|
||||
`title` VARCHAR(200) NOT NULL COMMENT '作品标题',
|
||||
`genre` VARCHAR(50) DEFAULT NULL COMMENT '作品类型/体裁',
|
||||
`summary` TEXT DEFAULT NULL COMMENT '作品简介',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'writing' COMMENT '状态:writing/completed/archived',
|
||||
`work_schema_id` BIGINT DEFAULT NULL COMMENT '关联 MetaSchema ID',
|
||||
`import_status` VARCHAR(20) DEFAULT NULL COMMENT '导入摘要状态',
|
||||
`parse_status` VARCHAR(20) DEFAULT NULL COMMENT '全书解析摘要状态',
|
||||
`word_count` INT NOT NULL DEFAULT 0 COMMENT '总字数(读模型)',
|
||||
`chapter_count` INT NOT NULL DEFAULT 0 COMMENT '章节数(读模型)',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_owner_update` (`owner_user_id`, `update_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 作品(content 模块)';
|
||||
|
||||
-- 章节
|
||||
CREATE TABLE `muse_content_chapter` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`work_id` BIGINT NOT NULL COMMENT '所属作品ID',
|
||||
`title` VARCHAR(200) NOT NULL COMMENT '章节标题',
|
||||
`order_no` INT NOT NULL COMMENT '章节排序',
|
||||
-- PLACEHOLDER_SQL_PART5
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT '状态:draft/writing/completed/archived',
|
||||
`goal_snapshot` JSON DEFAULT NULL COMMENT '已确认规划摘要',
|
||||
`outline_snapshot` JSON DEFAULT NULL COMMENT '大纲摘要',
|
||||
`parse_review_status` VARCHAR(20) DEFAULT NULL COMMENT '全书解析章节审阅状态',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_work_order` (`work_id`, `order_no`),
|
||||
KEY `idx_work_id` (`work_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 章节(content 模块)';
|
||||
|
||||
-- 正文块
|
||||
CREATE TABLE `muse_content_block` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`work_id` BIGINT NOT NULL COMMENT '所属作品ID',
|
||||
`chapter_id` BIGINT NOT NULL COMMENT '所属章节ID',
|
||||
`order_no` INT NOT NULL COMMENT '章节内排序',
|
||||
`content_doc` JSON DEFAULT NULL COMMENT '富文本结构化内容(JSON)',
|
||||
`revision` INT NOT NULL DEFAULT 1 COMMENT '乐观锁版本,保存正文必须带 expectedRevision',
|
||||
`word_count` INT NOT NULL DEFAULT 0 COMMENT '当前字数',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_chapter_order` (`chapter_id`, `order_no`),
|
||||
KEY `idx_work_id` (`work_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 正文块(content 模块)';
|
||||
|
||||
-- 叙事运行态
|
||||
CREATE TABLE `muse_content_narrative_state` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`work_id` BIGINT NOT NULL COMMENT '所属作品ID',
|
||||
`chapter_id` BIGINT DEFAULT NULL COMMENT '章节ID(章节维度时填写)',
|
||||
`entity_id` BIGINT DEFAULT NULL COMMENT '实体ID(实体维度时填写)',
|
||||
`scope` VARCHAR(20) NOT NULL COMMENT '维度:work/chapter/entity',
|
||||
`state_payload` JSON NOT NULL COMMENT '叙事运行态数据(JSON)',
|
||||
`revision` INT NOT NULL DEFAULT 1 COMMENT '版本',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_work_scope` (`work_id`, `scope`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 叙事运行态(content 模块)';
|
||||
|
||||
-- ============================================================
|
||||
-- 三、AI 模块核心表
|
||||
-- ============================================================
|
||||
-- PLACEHOLDER_SQL_PART6
|
||||
|
||||
-- AI 任务
|
||||
CREATE TABLE `muse_ai_task` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`work_id` BIGINT DEFAULT NULL COMMENT '关联作品ID',
|
||||
`chapter_id` BIGINT DEFAULT NULL COMMENT '关联章节ID',
|
||||
`actor_user_id` BIGINT NOT NULL COMMENT '发起用户ID',
|
||||
`task_type` VARCHAR(50) NOT NULL COMMENT '任务类型:generation/continuation/expansion/polish/detection/planning/parse/evaluation',
|
||||
`agent_version_id` BIGINT DEFAULT NULL COMMENT '使用的 Agent 版本ID',
|
||||
`runtime_envelope_id` BIGINT DEFAULT NULL COMMENT '运行时权限包ID',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'queued' COMMENT '状态:queued/running/completed/failed/canceled',
|
||||
`idempotency_key` VARCHAR(200) NOT NULL COMMENT '幂等键',
|
||||
`input_snapshot` JSON DEFAULT NULL COMMENT '输入上下文摘要(不含敏感全文)',
|
||||
`output_summary` JSON DEFAULT NULL COMMENT '输出摘要',
|
||||
`error_code` VARCHAR(50) DEFAULT NULL COMMENT '失败错误码',
|
||||
`error_message` VARCHAR(500) DEFAULT NULL COMMENT '失败原因',
|
||||
`retry_count` INT NOT NULL DEFAULT 0 COMMENT '重试次数',
|
||||
`started_at` DATETIME DEFAULT NULL COMMENT '开始执行时间',
|
||||
`finished_at` DATETIME DEFAULT NULL COMMENT '完成时间',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_idempotency_key` (`idempotency_key`),
|
||||
KEY `idx_work_status` (`work_id`, `status`, `update_time`),
|
||||
KEY `idx_actor_status` (`actor_user_id`, `task_type`, `status`, `update_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse AI 任务(ai 模块)';
|
||||
|
||||
-- AI 候选
|
||||
CREATE TABLE `muse_ai_candidate` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`work_id` BIGINT NOT NULL COMMENT '关联作品ID',
|
||||
`chapter_id` BIGINT DEFAULT NULL COMMENT '关联章节ID',
|
||||
`block_id` BIGINT DEFAULT NULL COMMENT '目标 Block ID',
|
||||
`task_id` BIGINT NOT NULL COMMENT '来源任务ID',
|
||||
`candidate_type` VARCHAR(50) NOT NULL COMMENT '候选类型:suggestion/planning_candidate',
|
||||
`content_snapshot` JSON DEFAULT NULL COMMENT '候选内容快照',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '状态:pending/accepted/rejected/expired/invalidated',
|
||||
`quality_result_id` BIGINT DEFAULT NULL COMMENT '质量门控结果ID',
|
||||
`source_snapshot_id` BIGINT DEFAULT NULL COMMENT '来源快照ID',
|
||||
`authorization_snapshot_id` BIGINT DEFAULT NULL COMMENT '授权快照ID',
|
||||
-- PLACEHOLDER_SQL_PART7
|
||||
`source_status` VARCHAR(30) DEFAULT NULL COMMENT '来源状态',
|
||||
`decision_archive_id` BIGINT DEFAULT NULL COMMENT '决策归档ID',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_work_status` (`work_id`, `status`, `create_time`),
|
||||
KEY `idx_task_id` (`task_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse AI 候选(ai 模块)';
|
||||
|
||||
-- AI Agent
|
||||
CREATE TABLE `muse_ai_agent` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`agent_key` VARCHAR(100) NOT NULL COMMENT '智能体稳定业务键',
|
||||
`agent_name` VARCHAR(200) NOT NULL COMMENT '智能体名称',
|
||||
`agent_type` VARCHAR(20) NOT NULL COMMENT '类型:system/user/market_installed',
|
||||
`owner_user_id` BIGINT DEFAULT NULL COMMENT '所属用户(user 类型时填写)',
|
||||
`description` VARCHAR(500) DEFAULT NULL COMMENT '描述',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态:active/disabled/archived',
|
||||
`current_version_id` BIGINT DEFAULT NULL COMMENT '当前激活版本ID',
|
||||
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_agent_key` (`agent_key`),
|
||||
KEY `idx_type_status` (`agent_type`, `status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Muse 智能体(ai 模块)';
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 后端-05:统一 API(接口) 契约-v1
|
||||
|
||||
- 版本:v6
|
||||
- 版本:v8
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:前端 / 后端 / 架构 / 测试
|
||||
- 阅读时间:35-55 分钟
|
||||
@ -35,7 +35,7 @@ Muse API 分组与 owner:
|
||||
| Knowledge | `/admin-api/muse/knowledge/**`、`/app-api/muse/knowledge-*/**` | `yudao-module-knowledge` | 全局/用户/局域知识库、草稿、绑定、投影 |
|
||||
| AI / Agent | `/admin-api/muse/ai/**`、`/app-api/muse/ai/**`、`/app-api/muse/agents/**` | `yudao-module-ai` 二开 | Prompt、Agent、任务、候选、质量门控、评估 |
|
||||
| Market | `/admin-api/muse/market/**`、`/app-api/muse/marketplace/**` | `yudao-module-market` | 市场资产、授权、安装、handoff、发布、治理 |
|
||||
| Account | `/admin-api/muse/account/**`、`/app-api/muse/account/**`、`/app-api/muse/me` | 逻辑 `account` | 权益、配额、用量、授权/购买/发布摘要 |
|
||||
| Account | `/admin-api/muse/account/**`、`/app-api/muse/account/**`、`/app-api/muse/me` | `yudao-module-member`(已决策:member 模块实现 account API 路径) | 权益、配额、用量、授权/购买/发布摘要 |
|
||||
| Jobs / Events | `/admin-api/muse/jobs/**`、`/app-api/muse/jobs/**`、`/admin-api/muse/source-events/**` | 各 owner + outbox | 异步任务状态、来源事件传播和重试入口 |
|
||||
|
||||
## 2. 通用约定
|
||||
@ -128,6 +128,26 @@ API 响应遵循 Yudao 风格的统一响应壳。产品语义字段可以在 `d
|
||||
|
||||
管理员可见摘要不等于可见私有正文。需要查看用户私有内容时,必须另有合规访问接口、最小字段、原因、时效、分权和审计;不得用通用内容列表绕过。
|
||||
|
||||
### 2.7 API 版本策略
|
||||
|
||||
API 版本通过 HTTP Header 传递,路由路径不变:
|
||||
|
||||
| 项目 | 说明 |
|
||||
|---|---|
|
||||
| Header | `X-API-Version: 1`(当前版本为 1) |
|
||||
| 默认行为 | 未传 header 时使用最新稳定版本 |
|
||||
| 版本影响范围 | 响应结构和字段语义;不影响路由路径和认证方式 |
|
||||
| Deprecation Policy | 旧版本至少保留 6 个月;期间响应头返回 `Deprecation: true` 和 `Sunset: <date>` 提示迁移 |
|
||||
| 到期行为 | 到期后返回 `API_VERSION_DEPRECATED` 错误码,HTTP 410 Gone |
|
||||
| 版本变更触发条件 | 响应字段删除、字段语义不兼容变更、枚举值语义变化 |
|
||||
| 非破坏性变更 | 新增可选字段、新增枚举值、新增接口不触发版本升级 |
|
||||
|
||||
客户端集成要求:
|
||||
|
||||
- 前端 SDK 和 API 客户端必须显式传递 `X-API-Version` header。
|
||||
- 后端网关层解析 header 并注入请求上下文,各模块 controller 按版本返回对应响应结构。
|
||||
- 版本不匹配或已废弃时,响应 body 必须包含 `currentVersion`、`supportedVersions` 和 `migrationGuide` 字段。
|
||||
|
||||
## 3. Admin APIs
|
||||
|
||||
### 3.1 治理和元结构
|
||||
@ -274,9 +294,9 @@ Tool Grant 写入必须经 Governance / Security facade 校验审批、用途、
|
||||
|
||||
支付底层交易、退款和充值能力优先复用 `yudao-module-pay`。
|
||||
|
||||
Quota adjustment ledger 是账户侧 append-only 语义:每次人工调整、套餐变更、市场补偿、导出扣减回滚或 New-API 配置请求回填都必须记录 `commandId`、`correlationId`、调整原因、前后权益快照、操作者、审批或复核信息和幂等状态。ledger 不是 New-API 成本账本 authority,也不能被 AI 管理接口用来推断供应商路由或底层成本。
|
||||
Quota adjustment 是账户侧审计语义:每次人工调整、套餐变更、市场补偿、导出扣减回滚或 New-API 配置请求回填都必须记录 `commandId`、`correlationId`、调整原因、前后权益快照、操作者、审批或复核信息和幂等状态。权益审计日志不是 New-API 成本账本 authority,也不能被 AI 管理接口用来推断供应商路由或底层成本。
|
||||
|
||||
Pay callback、refund、套餐撤销和市场补偿必须通过 account entitlement ledger 幂等传播:以支付订单、退款单、市场授权或调额请求作为 `sourceOwner/sourceId`,以回调或补偿事件作为 `idempotencyKey`。重复回调返回同一 ledger 结果;退款和撤销使用反向流水或补偿流水,不覆盖原流水。
|
||||
Pay callback、refund、套餐撤销和市场补偿必须通过 account entitlement 可变表 + 审计日志幂等传播:以支付订单、退款单、市场授权或调额请求作为 `sourceOwner/sourceId`,以回调或补偿事件作为 `idempotencyKey`。重复回调返回同一处理结果;退款和撤销使用反向变更更新可变表并写审计日志。
|
||||
|
||||
### 3.7 任务、来源事件和审计
|
||||
|
||||
@ -325,7 +345,7 @@ Source Status 请求必须带业务上下文,不能只用 `sourceType + source
|
||||
| `sourceVersion` | 调用方当前持有的来源版本 |
|
||||
| `authorizationSnapshotId` | 调用方当前持有的授权快照 |
|
||||
|
||||
Source Status 响应必须返回 `sourceStatus`、`actionPolicy`、`blockedReasons`、`needsRecheckReasons`、`reasonAttributions`、`sourceEvents`、`nextActions`、`currentSourceVersion`、`currentAuthorizationSnapshotId` 和可选 `jobId`。`sourceStatus` 使用 SourceStatus:`active`、`stale`、`revoked`、`recalled`、`delisted`、`blocked`、`owner_missing`、`unauthorized`、`needs_recheck`;`actionPolicy` 使用 SourceActionPolicy:`allowed`、`read_only`、`blocked`、`needs_recheck`。API 不能只返回一个 `blocked=true`,必须保留 revoked / recalled / delisted / unauthorized / processing_failed 等原因和归因;`read_only` 只允许历史查看或授权记录展示,不允许写入、绑定、生成、接受候选或受限导出;`needs_recheck` 不等于允许继续写入,目标 owner 必须在自己的命令接口重新校验。
|
||||
Source Status 响应必须返回 `sourceStatus`、`actionPolicy`、`blockedReasons`、`needsRecheckReasons`(注:needsRecheckReasons 是 ActionPolicy 层面的补充信息,说明为何 actionPolicy=needs_recheck,不是 SourceStatus 枚举值)、`reasonAttributions`、`sourceEvents`、`nextActions`、`currentSourceVersion`、`currentAuthorizationSnapshotId` 和可选 `jobId`。`sourceStatus` 使用 SourceStatus:`active`、`stale`、`revoked`、`recalled`、`delisted`、`blocked`、`owner_missing`、`unauthorized`;`actionPolicy` 使用 SourceActionPolicy:`allowed`、`read_only`、`blocked`、`needs_recheck`。API 不能只返回一个 `blocked=true`,必须保留 revoked / recalled / delisted / unauthorized / processing_failed 等原因和归因;`read_only` 只允许历史查看或授权记录展示,不允许写入、绑定、生成、接受候选或受限导出;`needs_recheck` 不等于允许继续写入,目标 owner 必须在自己的命令接口重新校验。
|
||||
|
||||
### 4.3 作品和正文
|
||||
|
||||
@ -341,6 +361,26 @@ Source Status 响应必须返回 `sourceStatus`、`actionPolicy`、`blockedReaso
|
||||
| POST | `/app-api/muse/chapters/{chapterId}/blocks` | 新建 Block |
|
||||
| PUT | `/app-api/muse/blocks/{blockId}` | 保存 Block,必须带 expectedRevision |
|
||||
| GET | `/app-api/muse/blocks/{blockId}/source-attribution` | 查看当前 Block revision 来源归因 |
|
||||
|
||||
Block 保存(`PUT /blocks/{blockId}`)响应除返回新 revision 外,可包含 `followupTasks` 字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `revision` | int | 保存成功后的新 revision |
|
||||
| `wordCount` | int | 当前字数 |
|
||||
| `followupTasks` | array | 可选,保存后触发的异步任务摘要列表,例如知识提取任务 |
|
||||
|
||||
`followupTasks` 数组元素结构:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `taskType` | enum | `knowledge_extraction` / `source_recheck` / `projection_refresh` |
|
||||
| `jobId` | string | 异步任务 ID,可用于轮询 |
|
||||
| `status` | enum | `queued` / `skipped` |
|
||||
| `reason` | string | 若 skipped,说明跳过原因(例如无变更、策略未启用) |
|
||||
|
||||
前端可基于 `followupTasks` 展示知识提取进度提示或刷新知识草稿列表。`followupTasks` 为空或不返回时表示无后续异步任务。
|
||||
|
||||
| GET | `/app-api/muse/works/{workId}/meta-projections` | 查询作品维度用户可见 MetaSchema 投影 |
|
||||
| GET | `/app-api/muse/works/{workId}/meta-projections/{projectionKey}` | 查询指定投影结构、字段数据和版本 |
|
||||
| POST | `/app-api/muse/works/{workId}/dynamic-fields/validate` | 校验动态字段数据,不写入 |
|
||||
@ -357,6 +397,23 @@ Source Status 响应必须返回 `sourceStatus`、`actionPolicy`、`blockedReaso
|
||||
|
||||
动态字段没有跨 owner 的通用写接口。`/dynamic-fields/validate` 只做校验和路由建议,不写入任何 Canonical fact;正式写入必须回到目标 owner API,例如规划写 `PUT /works/{workId}/planning/{sectionKey}`,正文写 `PUT /blocks/{blockId}`,知识写 Knowledge Draft / Local KB 命令,Agent 写 Agent 配置命令。Owner 命令必须校验 `schemaVersion`、`projectionVersion`、`expectedDataRevision`、字段 allowlist、来源状态和目标 owner 权限。Schema 过期返回 `SCHEMA_STALE`;字段已废弃返回 `FIELD_DEPRECATED`;投影过期返回 `PROJECTION_STALE`;字段试图写 Canonical fact 但没有 owner 命令时返回 `FORBIDDEN` 或 `FEATURE_DISABLED`。
|
||||
|
||||
各 owner 命令版本校验要求:
|
||||
|
||||
| Owner 命令 | `expectedSchemaVersion` | `expectedProjectionVersion` | `expectedDataRevision` | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| `PUT /blocks/{blockId}` | 可选(正文保存不依赖动态字段 Schema) | 不要求 | 必须(即 `expectedRevision`) | 正文保存以 Block revision 为乐观锁 |
|
||||
| `PUT /works/{workId}/planning/{sectionKey}` | 必须 | 必须 | 必须 | 规划保存必须确保 Schema 和投影未过期 |
|
||||
| `POST /knowledge-drafts/{draftId}/confirm` | 可选 | 不要求 | 必须(即 draft version) | 知识确认以 draft 状态和来源为准 |
|
||||
| `POST /works/{workId}/agent-slots/{slotKey}/bind` | 不要求 | 不要求 | 必须(即 `expectedSlotRevision`) | 槽位绑定以 slot revision 为乐观锁 |
|
||||
| `PATCH /works/{workId}` | 必须(若修改动态字段) | 必须(若修改动态字段) | 必须 | 作品基础信息修改涉及动态字段时校验 |
|
||||
| `POST /agents/{agentId}/versions` | 不要求 | 不要求 | 不要求 | Agent 版本创建不涉及动态字段 |
|
||||
|
||||
规则:
|
||||
|
||||
- 涉及 MetaSchema 管控的动态字段写入时,`expectedSchemaVersion` 和 `expectedProjectionVersion` 必须校验;不匹配时分别返回 `SCHEMA_STALE` 和 `PROJECTION_STALE`。
|
||||
- 所有写入命令必须校验目标对象的 `expectedDataRevision`(或等价乐观锁字段);不匹配时返回 `REVISION_CONFLICT` 或 `DATA_REVISION_CONFLICT`。
|
||||
- 不涉及动态字段的纯正文或纯配置命令可以不要求 `expectedSchemaVersion`,但必须保留 `expectedRevision` 乐观锁。
|
||||
|
||||
### 4.4 作品规划
|
||||
|
||||
作品规划台面向作品设定、章节大纲、世界设定、角色关系、情节节拍和文风检查。规划正式数据由用户确认后进入 `content` owner;AI 只能产生 Planning Candidate,不直接写正式规划。
|
||||
@ -405,12 +462,10 @@ Accept 请求语义:
|
||||
| `expectedRevision` | 目标 Block revision |
|
||||
| `acceptMode` | `accept_as_is` / `merge_after_edit` |
|
||||
| `finalContent` | 修改后合并时必填 |
|
||||
| `candidateDecisionEnvelopeId` | 调用方持有的 Candidate Decision Envelope;后端必须消费或重算 |
|
||||
| `decisionEnvelopeVersion` | envelope 版本,防止 stale 决策进入正文 |
|
||||
| `qualityResultVersion` | 候选质量结果版本 |
|
||||
| `outputComplianceResultId` | 输出合规结果 |
|
||||
| `staticCheckResultId` | 静态检查结果 |
|
||||
| `sourceSnapshotId` / `sourceVersion` | 候选来源快照和来源版本 |
|
||||
| `sourceSnapshotId` / `sourceVersion` | 候选来源快照和来源版本;接受时实时对比当前来源版本 |
|
||||
| `authorizationSnapshotId` | 接受时使用的授权快照 |
|
||||
| `workAssetUsePrecheckId` | 使用市场作品资产作为参考或上下文时必填;feature gate 未开启默认返回 `FEATURE_DISABLED` |
|
||||
| `auditReason` | 用户接受、修改后合并或覆盖原因 |
|
||||
@ -419,7 +474,7 @@ Accept 响应语义:
|
||||
|
||||
- Block 新 revision。
|
||||
- Suggestion 归档结果。
|
||||
- Candidate Decision Archive 引用和 envelope 消费结果。
|
||||
- Candidate Decision Archive 引用。
|
||||
- Block Source Attribution 写入结果,包含 source status、authorization snapshot、lineage 和许可限制。
|
||||
- Knowledge Draft 结果:原样接受保持待确认;修改后合并让旧草稿失效。
|
||||
- followup task:投影刷新或重新提取。
|
||||
@ -465,7 +520,7 @@ Accept / Merge 失败必须返回 `blockedReasons`、`sourceStatusReasons`、`re
|
||||
|
||||
知识绑定预检和绑定写入都属于 Knowledge owner。Market 只能提供来源侧 handoff token、授权摘要和跳转审计;Knowledge 预检接口必须重新校验 work owner、目标对象、来源版本、授权快照、来源状态、许可范围和幂等键,生成 `kbBindPrecheckId` 或签名消费凭证。知识绑定命令必须消费 `kbBindPrecheckId`,并显式传入 `commandId`、`workId`、`targetOwner=knowledge`、`targetId`、`sourceType`、`sourceId`、`sourceVersion`、`authorizationSnapshotId` 和 `expectedBindingRevision`。
|
||||
|
||||
资料上传、删除、重建索引、停用、恢复和发布提交都必须写审计。资料处理任务失败时返回 `jobId`、`retryable`、`failedStage`、`blockedReason` 和 `nextActions`;删除或停用资料必须触发来源事件,让绑定、检索、生成、导出和个人中心摘要进入 blocked 或 needs_recheck。
|
||||
资料上传、删除、重建索引、停用、恢复和发布提交都必须写审计。资料处理任务失败时返回 `jobId`、`retryable`、`failedStage`、`blockedReason` 和 `nextActions`;删除或停用资料必须触发来源事件,让绑定、检索、生成、导出和个人中心摘要进入 blocked 或 stale 状态。
|
||||
|
||||
资料上传必须带 owner、用途、文件名、大小、MIME、hash 和幂等键;服务端必须写扫描状态、存储引用、保留期和清理策略。扫描 blocked / failed 或 MIME、大小、扩展名不匹配时,资料不得进入切块、索引、AI 上下文或市场发布。
|
||||
|
||||
@ -483,6 +538,37 @@ Accept / Merge 失败必须返回 `blockedReasons`、`sourceStatusReasons`、`re
|
||||
|
||||
用户只能替换开放槽位,不能替换输入输出合规、拆分切块、入 RAG、语义安全围栏、静态检查、质量门控等保护节点。
|
||||
|
||||
智能体试用接口(`POST /app-api/muse/agents/{agentId}/test`)详情:
|
||||
|
||||
试用请求字段:
|
||||
|
||||
| 字段 | 类型 | 要求 |
|
||||
|---|---|---|
|
||||
| `workId` | string | 可选,关联作品上下文;不传时使用沙箱上下文 |
|
||||
| `contextScope` | enum | `none` / `work` / `chapter`;决定试用时可读取的上下文范围 |
|
||||
| `usagePolicy` | enum | `charge` / `free_trial`;决定本次试用是否计费 |
|
||||
| `outputTarget` | enum | `preview_only` / `shadow`;`preview_only` 只返回预览不落库,`shadow` 写入 Shadow Candidate 供后续决策 |
|
||||
| `input` | object | 试用输入内容,包含 prompt 或指令 |
|
||||
| `commandId` | string | 幂等键 |
|
||||
|
||||
试用响应字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `trialSessionId` | string | 本次试用会话 ID,用于关联后续查询和审计 |
|
||||
| `outputPreview` | object | 智能体输出预览内容 |
|
||||
| `usageCharged` | boolean | 本次试用是否实际计费 |
|
||||
| `outputDestination` | string | 输出实际落点:`preview_only` / `shadow_candidate` |
|
||||
| `jobId` | string | 若异步执行,返回任务 ID 供轮询 |
|
||||
|
||||
约束:
|
||||
|
||||
- `contextScope=work` 或 `chapter` 时,必须校验用户对 `workId` 的访问权限。
|
||||
- `usagePolicy=free_trial` 受账户免费试用额度限制;额度耗尽时返回 `QUOTA_EXCEEDED`。
|
||||
- `outputTarget=shadow` 时,输出进入 Shadow Candidate 状态,用户可后续接受或丢弃。
|
||||
- 试用不写正文 Canonical、Local KB 或正式规划。
|
||||
- Runtime Permission Envelope 由服务端按试用场景生成,scope 受限于试用上下文。
|
||||
|
||||
槽位绑定命令必须显式声明:
|
||||
|
||||
| 字段 | 要求 |
|
||||
@ -503,6 +589,7 @@ Accept / Merge 失败必须返回 `blockedReasons`、`sourceStatusReasons`、`re
|
||||
|---|---|---|
|
||||
| GET | `/app-api/muse/marketplace/assets` | 市场资产列表 |
|
||||
| GET | `/app-api/muse/marketplace/categories` | 分类曝光、推荐位、排序和可见性摘要 |
|
||||
| GET | `/app-api/muse/marketplace/recommendations` | 个性化推荐资产列表 |
|
||||
| GET | `/app-api/muse/marketplace/assets/{assetId}` | 资产详情 |
|
||||
| POST | `/app-api/muse/marketplace/assets/{assetId}/favorite` | 收藏资产 |
|
||||
| DELETE | `/app-api/muse/marketplace/assets/{assetId}/favorite` | 取消收藏 |
|
||||
@ -510,8 +597,8 @@ Accept / Merge 失败必须返回 `blockedReasons`、`sourceStatusReasons`、`re
|
||||
| POST | `/app-api/muse/marketplace/assets/{assetId}/install` | 安装智能体或知识库 |
|
||||
| POST | `/app-api/muse/marketplace/assets/{assetId}/bind-precheck` | 创建来源侧授权摘要和 handoff 准备,不返回目标 owner 写入凭证 |
|
||||
| POST | `/app-api/muse/marketplace/handoffs` | 创建市场 handoff,只返回短期 handoff 和目标 owner 消费入口 |
|
||||
| GET | `/app-api/muse/marketplace/handoffs/{handoffId}` | 查询 handoff 状态、过期时间和目标 owner |
|
||||
| POST | `/app-api/muse/marketplace/handoffs/{handoffId}/cancel` | 取消市场 handoff |
|
||||
| GET | `/app-api/muse/marketplace/handoffs/{handoffToken}` | 查询 handoff 状态、过期时间和目标 owner |
|
||||
| POST | `/app-api/muse/marketplace/handoffs/{handoffToken}/cancel` | 取消市场 handoff |
|
||||
| POST | `/app-api/muse/marketplace/publish-drafts` | 保存发布草稿 |
|
||||
| POST | `/app-api/muse/marketplace/publish-drafts/{draftId}/checks` | 发布检查,生成 marketPublishCheckId |
|
||||
| POST | `/app-api/muse/marketplace/publish-requests` | 提交发布申请,消费 marketPublishCheckId 和发布快照 |
|
||||
@ -524,6 +611,27 @@ Accept / Merge 失败必须返回 `blockedReasons`、`sourceStatusReasons`、`re
|
||||
|
||||
作品资产 feature gate 未开启前,只允许阅读、收藏和授权记录,不允许模板化、参考写入或进入 AI 上下文;相关 target owner 预检和绑定/使用命令默认返回 `FEATURE_DISABLED`,直到 Content / AI owner、API、Schema、lineage 和导出限制闭合。
|
||||
|
||||
市场资产列表查询(`GET /app-api/muse/marketplace/assets`)排序和筛选参数:
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `sortBy` | enum | `popularity` / `newest` / `rating` / `relevance`;默认 `relevance` |
|
||||
| `assetType` | enum | `work` / `agent` / `knowledge_base`;可选筛选 |
|
||||
| `category` | string | 分类筛选 |
|
||||
| `keyword` | string | 关键词搜索 |
|
||||
| `pageNo` / `pageSize` | int | 分页参数 |
|
||||
|
||||
个性化推荐接口(`GET /app-api/muse/marketplace/recommendations`)参数:
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `recommendationContext` | enum | 可选,`home` / `after_install` / `similar_to_asset` / `work_context`;决定推荐策略 |
|
||||
| `referenceAssetId` | string | 可选,`similar_to_asset` 时必填,基于该资产推荐相似资产 |
|
||||
| `workId` | string | 可选,`work_context` 时可填,基于作品上下文推荐适配的智能体或知识库 |
|
||||
| `limit` | int | 推荐数量上限,默认 10 |
|
||||
|
||||
推荐响应返回 `assets` 列表和 `recommendationId`(用于后续点击归因和推荐效果追踪)。推荐不暴露用户私有正文或知识内容作为推荐依据。
|
||||
|
||||
市场接口的返回必须区分 `licenseStatus`、`installStatus`、`bindStatus`、`sourceStatus` 和 `nextAction`。购买或安装成功只表示账户可用资产变化;绑定或使用必须由目标 owner 自己生成并消费预检后完成。
|
||||
|
||||
Market 只负责资产、授权、安装记录、发布申请、申诉、来源侧授权摘要、handoff token 和跳转审计。Market API 可以生成、查询、取消 handoff,但不能写作品正文、正式规划、Local KB、Agent Slot Binding、目标 precheck/session 或动态字段数据;目标 owner API 必须基于 handoff token 或授权摘要自行生成并消费 `kbBindPrecheckId`、`agentSlotPrecheckId`、`workAssetUsePrecheckId` 或签名消费凭证,并重新校验 owner、目标对象、来源版本、授权快照、状态机和幂等键。
|
||||
@ -569,6 +677,8 @@ Import task、import file 和 chapter context owner 是 `content`;Parse Job
|
||||
| GET | `/app-api/muse/account/licenses` | 授权记录 |
|
||||
| GET | `/app-api/muse/account/publish-records` | 发布记录 |
|
||||
| GET | `/app-api/muse/account/security-events` | 安全事件摘要 |
|
||||
| GET | `/app-api/muse/account/security-events/{eventId}` | 安全事件详情,返回事件类型、发生时间、来源 IP、设备信息、影响范围和处理建议 |
|
||||
| POST | `/app-api/muse/account/security-events/{eventId}/acknowledge` | 确认/处理安全事件,标记用户已知晓或已采取措施 |
|
||||
| POST | `/app-api/muse/account/export-tasks` | 创建个人资料、账户记录或安全事件导出任务 |
|
||||
| GET | `/app-api/muse/account/export-tasks/{taskId}` | 查询个人中心导出任务 |
|
||||
| GET | `/app-api/muse/account/downloads/{credentialId}` | 下载个人中心导出包 |
|
||||
@ -577,6 +687,37 @@ Import task、import file 和 chapter context owner 是 `content`;Parse Job
|
||||
|
||||
个人中心账户接口只返回当前用户可见的摘要和下载凭证,不暴露 New-API token、provider authority、供应商路由、底层成本账本、完整 Prompt/Response 或私有审计字段。`correlationId` 查询只能查本人可见调用,重复请求必须返回同一重试组和归属状态,不能重复扣减、重复补偿或重复归属。
|
||||
|
||||
安全事件详情接口(`GET /app-api/muse/account/security-events/{eventId}`)响应字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `eventId` | string | 安全事件 ID |
|
||||
| `eventType` | enum | `login_anomaly` / `credential_expired` / `sensitive_export` / `access_denied_burst` / `device_change` / `permission_escalation` |
|
||||
| `severity` | enum | `info` / `warning` / `critical` |
|
||||
| `occurredAt` | datetime | 事件发生时间 |
|
||||
| `sourceIp` | string | 来源 IP 地址 |
|
||||
| `deviceInfo` | object | 设备信息摘要(UA、平台、地理位置) |
|
||||
| `affectedScope` | string | 影响范围描述 |
|
||||
| `description` | string | 事件描述 |
|
||||
| `suggestedActions` | array | 建议处理措施列表 |
|
||||
| `acknowledgedAt` | datetime | 用户确认时间,未确认为空 |
|
||||
| `acknowledgedAction` | string | 用户确认时选择的处理措施 |
|
||||
|
||||
安全事件确认接口(`POST /app-api/muse/account/security-events/{eventId}/acknowledge`)请求字段:
|
||||
|
||||
| 字段 | 类型 | 要求 |
|
||||
|---|---|---|
|
||||
| `commandId` | string | 幂等键 |
|
||||
| `action` | enum | `acknowledged` / `password_changed` / `session_revoked` / `false_positive` |
|
||||
| `note` | string | 可选,用户备注 |
|
||||
|
||||
约束:
|
||||
|
||||
- 安全事件只能由事件所属用户查看和确认。
|
||||
- 确认操作是 append-only,不删除安全事件记录。
|
||||
- `action=session_revoked` 时,后端应联动 session 管理服务使相关会话失效。
|
||||
- 安全事件确认写审计。
|
||||
|
||||
## 5. 通用错误码
|
||||
|
||||
| 错误码 | 语义 | 前端建议 |
|
||||
@ -586,6 +727,9 @@ Import task、import file 和 chapter context owner 是 `content`;Parse Job
|
||||
| `RESOURCE_NOT_FOUND` | 资源不存在或不可见 | 返回列表或刷新 |
|
||||
| `VALIDATION_ERROR` | 请求字段不合法 | 定位字段并提示 |
|
||||
| `REVISION_CONFLICT` | Block revision 冲突 | 展示冲突恢复信息和当前 revision |
|
||||
| `DATA_REVISION_CONFLICT` | 动态字段数据 revision 冲突(expectedDataRevision 不匹配),语义覆盖所有 owner 命令中的 expectedRevision / expectedDataRevision 冲突场景 | 展示当前 dataRevision 和冲突字段,引导用户刷新后重试 |
|
||||
| `QUOTA_EXCEEDED` | 账户配额已用尽,例如 AI 调用次数、存储空间、知识库数量等 | 展示当前配额和升级/购买入口 |
|
||||
| `BUDGET_EXCEEDED` | 单次任务或会话预算超限,例如 token 预算、调用次数预算 | 展示预算限制和调整建议 |
|
||||
| `SCHEMA_STALE` | 调用方持有的 MetaSchema 版本已过期 | 刷新 Schema 和投影后重试 |
|
||||
| `FIELD_DEPRECATED` | 动态字段已废弃或不再允许保存 | 显示迁移提示或隐藏保存入口 |
|
||||
| `PROJECTION_STALE` | 用户可见投影版本已过期 | 重新拉取投影和字段数据 |
|
||||
@ -602,6 +746,7 @@ Import task、import file 和 chapter context owner 是 `content`;Parse Job
|
||||
| `TASK_FAILED` | 异步任务失败 | 展示失败原因、重试或取消 |
|
||||
| `PARTIAL_FAILURE` | 批量操作部分成功、部分失败 | 展示逐项结果和可重试项 |
|
||||
| `UPSTREAM_UNAVAILABLE` | New-API、检索、文件或通知服务不可用 | 展示稍后重试,不暴露密钥或内部响应 |
|
||||
| `API_VERSION_DEPRECATED` | 请求的 API 版本已废弃(X-API-Version header 指定的版本已过期) | 展示迁移指引,升级到最新版本 |
|
||||
|
||||
错误响应 `data` 可以按场景携带 `currentRevision`、`currentState`、`currentSchemaVersion`、`currentProjectionVersion`、`currentDataRevision`、`requiredPrecheckType`、`sourceStatus`、`actionPolicy`、`reasonAttributions`、`correlationStatus`、`retryable`、`jobId`、`partialResults`、`nextActions` 等可恢复字段,但不得返回密钥、完整 Prompt/Response、私有正文全文或越权来源全文。
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 架构-01:系统全貌与边界上下文
|
||||
|
||||
- 版本:v8
|
||||
- 版本:v9
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:架构 / 后端 / 前端 / 产品 / 测试
|
||||
- 阅读时间:25-35 分钟
|
||||
@ -29,7 +29,7 @@ Muse 是面向长篇小说创作的多角色 AI 创作与资产流通系统。
|
||||
|
||||
| 产品空间 | 使用角色 | 架构定位 | 禁止承担的职责 |
|
||||
|---|---|---|---|
|
||||
| 管理员控制台(Admin Console) | 管理员 | 系统治理入口,调用 Admin/Governance、Identity/Auth、Marketplace/Asset、Account/Usage/Audit、Integration 等能力 | 替用户修改私有作品、用户智能体、用户知识库或确认作品事实 |
|
||||
| 管理员控制台(Admin Console) | 管理员 | 系统治理入口,调用 Admin/Governance、MetaSchema、Identity/Auth、Marketplace/Asset、Account/Usage/Audit、Integration 等能力 | 替用户修改私有作品、用户智能体、用户知识库或确认作品事实 |
|
||||
| 用户工作区(User Workspace) | 普通用户 | 我的作品和作品工作台入口,调用 Work/Content、Knowledge、AI Orchestration、Agent、Account/Usage/Audit | 系统后台配置、全局授权治理、市场审核、保护节点配置 |
|
||||
| 智能体工作台(Agent Workspace) | 管理员 / 普通用户 | 智能体资产和槽位配置入口,调用 Agent BC、Marketplace BC、Admin/Governance 的保护节点注册表 | 替换系统保护节点、扩大工具权限、绕过输出合同 |
|
||||
| 知识库工作台(Knowledge Workspace) | 管理员 / 普通用户 | 全局知识、用户知识库、已安装知识库、处理状态和作品绑定入口,调用 Knowledge BC 和 Marketplace BC | 把绑定知识自动写入局域知识库;让普通用户治理全局知识 authority |
|
||||
@ -40,7 +40,7 @@ Muse 是面向长篇小说创作的多角色 AI 创作与资产流通系统。
|
||||
|
||||
| 产品空间 | 主要调用 BC | 关键协作点 |
|
||||
|---|---|---|
|
||||
| 管理员控制台 | Identity/Auth、Admin/Governance、Knowledge、Agent、Marketplace/Asset、Account/Usage/Audit、Integration | 分权校验、配置版本、影响预览、高危复核、审计 |
|
||||
| 管理员控制台 | Identity/Auth、Admin/Governance、MetaSchema、Knowledge、Agent、Marketplace/Asset、Account/Usage/Audit、Integration | 分权校验、配置版本、影响预览、高危复核、审计 |
|
||||
| 用户工作区 | Identity/Auth、Work/Content、Knowledge、AI Orchestration、Agent、Marketplace/Asset、Account/Usage/Audit | 作品 owner、来源状态、候选决策、知识确认、导出预检 |
|
||||
| 智能体工作台 | Identity/Auth、Agent、Marketplace/Asset、Admin/Governance、Account/Usage/Audit | 智能体版本、工具授权、槽位合同、安装授权、运行记录 |
|
||||
| 知识库工作台 | Identity/Auth、Knowledge、Marketplace/Asset、Work/Content、Account/Usage/Audit | 用户知识库、资料处理、安装授权、作品绑定、来源传播 |
|
||||
@ -54,12 +54,13 @@ Muse 是面向长篇小说创作的多角色 AI 创作与资产流通系统。
|
||||
| BC | 核心职责 | 主写入边界 | 对外输出 |
|
||||
|---|---|---|---|
|
||||
| Identity/Auth BC | 登录认证、角色权限、权限组、菜单/页面/操作/数据范围、会话、安全事件 | 账户、角色、权限组、会话、安全状态 | 鉴权结果、数据范围、风险状态 |
|
||||
| Admin/Governance BC | MetaSchema、模板、系统功能编排、保护节点注册表、系统级 Prompt、系统级智能体默认链路、质量策略、全局治理规则 | MetaSchema authority、系统级配置版本、保护节点 allowlist、开放槽位合同、质量策略版本 | 配置快照、影响预览、可回滚版本、治理决策 |
|
||||
| Admin/Config BC | 系统级配置、租户管理、权限管理、审计日志(注:MetaSchema 已独立为 MetaSchema BC,Protection Node 和 Quality Policy 已归入 AI BC,市场治理已归入 Market BC) | 系统级配置版本、保护节点 allowlist、开放槽位合同 | 配置快照、影响预览、可回滚版本、治理决策 |
|
||||
| MetaSchema BC | 元结构定义(字段类型、校验、枚举、引用、领域、范围、目标类型、可见性、AI 上下文、导出语义) | MetaSchema authority、MetaSchema 版本 | MetaSchema 投影、字段定义快照;admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费 |
|
||||
| Work/Content BC | 作品、章节、文本块、正文版本、正文来源归因、导入正文、作品级正式规划、作品导出任务 | Work / Chapter / Block 的 Canonical 正文、Block Source Attribution、规划正式项、作品导出任务 | 正文事实、章节结构、修订号、来源归因、导入状态 |
|
||||
| Knowledge BC | 局域知识库、用户知识库、全局知识资料处理、知识草稿、知识来源绑定、投影和索引状态 | Local KB、User KB、Knowledge Draft、Knowledge Source Binding、投影事件 | 已确认作品知识、授权知识来源、用户知识资产、检索输入 |
|
||||
| Agent BC | 系统智能体版本、用户智能体版本、智能体资产、安装智能体、作品智能体组合、开放槽位绑定、工具授权上限 | Agent、Agent Version、Tool Grant、Agent Set、Agent Slot Binding、Installed Agent、Agent Runtime Permission Envelope authority | 可运行智能体快照、槽位兼容结果、运行权限上限、运行记录输入 |
|
||||
| AI Orchestration BC | 系统功能链路编排、上下文组装、生成/分析/检测任务、全书解析任务、章节解析结果、质量门控、候选、风险标记 | AI Task、Parse Job、Chapter Parse Result、Suggestion、Planning Candidate、Risk Marker、Quality Result | 待审对象、候选解释、章节解析结果、任务状态、质量结果;只消费运行权限包,不自授权 |
|
||||
| Marketplace/Asset BC | 市场资产、发布草稿、发布检查快照、审核提交、许可、购买/获取、安装、绑定 handoff、下架、召回、申诉、治理结果 | Marketplace Asset、Publish Draft、Publish Check Snapshot、Review Submission、Listing、License、Purchase、Install、Governance Action | 授权快照、安装记录、治理状态、来源状态事件 |
|
||||
| AI Orchestration BC | 系统功能链路编排、上下文组装、生成/分析/检测任务、全书解析任务、章节解析结果、质量门控、候选、风险标记、Protection Node(约束 AI 行为)、Quality Policy(AI 质量门控配置) | AI Task、Parse Job、Chapter Parse Result、Suggestion、Planning Candidate、Risk Marker、Quality Result、Protection Node、Quality Policy | 待审对象、候选解释、章节解析结果、任务状态、质量结果;只消费运行权限包,不自授权 |
|
||||
| Marketplace/Asset BC | 市场资产、发布草稿、发布检查快照、审核提交、许可、购买/获取、安装、绑定 handoff、下架、召回、申诉、治理结果、市场治理(下架/召回/申诉) | Marketplace Asset、Publish Draft、Publish Check Snapshot、Review Submission、Listing、License、Purchase、Install、Governance Action | 授权快照、安装记录、治理状态、来源状态事件 |
|
||||
| Account/Usage/Audit BC | 用量归属、调用归属、账户权益快照、个人中心聚合、业务审计、接口调用日志、下载凭证和下载审计 | Usage Record、Entitlement Snapshot、Personal Center Summary、Audit Log、Download Credential、Download Audit | 用量视图、权益视图、审计视图、异常归属、个人中心聚合 |
|
||||
| Integration BC | New-API、模型网关、RAG / 向量检索、文件存储、通知等外部服务执行适配 | 外部绑定、凭据引用、correlationId、idempotencyKey、重试组、外部调用摘要 | 外部调用结果、归属待处理状态、失败原因、可重试信号 |
|
||||
|
||||
@ -78,28 +79,30 @@ Muse 是面向长篇小说创作的多角色 AI 创作与资产流通系统。
|
||||
| BC | 目标后端 owner | 聚合 / 模型 owner | Facade / API 分组 | 异步 worker | 审计 owner |
|
||||
|---|---|---|---|---|---|
|
||||
| Identity/Auth | `muse-auth` | 用户、角色、权限组、会话、安全事件 | Auth / Admin Permission / Personal Security | 会话清理、安全事件通知 | Account/Usage/Audit |
|
||||
| Admin/Governance | `muse-admin` | MetaSchema、保护节点、系统功能链路、质量策略、全局治理配置 | Admin Console | 配置影响预览、质量评估 | Account/Usage/Audit |
|
||||
| Admin/Governance | `muse-admin` | 保护节点注册表(仅注册,实例归 AI)、系统功能链路、全局治理配置 | Admin Console | 配置影响预览 | Account/Usage/Audit |
|
||||
| MetaSchema | `muse-meta-schema` | MetaSchema 全局定义、字段类型、校验、枚举、引用、领域、范围、目标类型、可见性、AI 上下文、导出语义;admin 写入全局定义,用户可在作品级覆盖扩展字段 | Admin Console(全局定义)/ facade-api(只读消费) | MetaSchema 版本影响预览 | Account/Usage/Audit |
|
||||
| Work/Content | `muse-content` | Work、Chapter、Block、Block Source Attribution、Planning Item、Narrative State、Work Export Job | User Workspace / Work Workspace | 导入、作品导出、正文投影 | Account/Usage/Audit |
|
||||
| Knowledge | `muse-knowledge` | Local KB、User KB、Knowledge Draft、Knowledge Source Binding、Knowledge Export Job、投影和索引任务 | Knowledge Workspace / Work Knowledge | 资料处理、入 RAG、投影、知识导出 | Account/Usage/Audit |
|
||||
| Agent | `muse-agent` | Agent、Agent Version、Tool Grant、Agent Runtime Permission Envelope authority、Agent Slot Binding、Installed Agent | Agent Workspace / Security Facade | 试用、槽位重验、运行权限包签发、运行记录归属 | Account/Usage/Audit |
|
||||
| AI Orchestration | `muse-ai` | AI Task、Suggestion、Planning Candidate、Parse Job、Chapter Parse Result、Quality Result、Runtime Execution Record | AI / Work Workspace | 生成、分析、检测、全书解析、质量门控;只消费运行权限包 | Account/Usage/Audit |
|
||||
| Marketplace/Asset | `muse-marketplace` | Marketplace Asset、Publish Draft、Publish Check Snapshot、Review Submission、Listing、License、Purchase、Install、Governance Action | Marketplace / Admin Marketplace | 发布检查、召回传播、申诉通知 | Account/Usage/Audit |
|
||||
| AI Orchestration | `muse-ai` | AI Task、Suggestion、Planning Candidate、Parse Job、Chapter Parse Result、Quality Result、Runtime Execution Record、Protection Node(grant 包,约束 AI 行为)、Quality Policy(AI 质量门控配置) | AI / Work Workspace | 生成、分析、检测、全书解析、质量门控;只消费运行权限包;grant 包只暴露给 admin-api 调用链路,runtime 包只读 | Account/Usage/Audit |
|
||||
| Marketplace/Asset | `muse-marketplace` | Marketplace Asset、Publish Draft、Publish Check Snapshot、Review Submission、Listing、License、Purchase、Install、Governance Action(admin 包:下架/召回/申诉) | Marketplace / Admin Marketplace | 发布检查、召回传播、申诉通知、市场治理 | Account/Usage/Audit |
|
||||
| Account/Usage/Audit | `muse-account` | Usage Record、Entitlement Snapshot、Personal Center Summary、Audit Log、Download Credential、Download Audit | Personal Center / Audit | 用量归属、审计导出、下载凭证失效 | Account/Usage/Audit |
|
||||
| Integration | `muse-integration` | External Binding、Credential Reference、Integration Call Log、correlationId、idempotencyKey | Internal Integration Facade | New-API 归属、外部重试、通知回执 | Account/Usage/Audit |
|
||||
|
||||
物理落点兼容规则:
|
||||
|
||||
- 逻辑 owner 优先于物理表或代码模块。阶段 7 如因 yudao-cloud fork 过渡,把 MetaSchema 物理表暂放 `muse-content` 或旧 Content 模块,也不能改变 Admin/Governance 的逻辑 authority。
|
||||
- MetaSchema 写入只能通过 Admin/Governance facade、治理版本、影响预览和审计发布;Content 只能承载或消费 MetaSchema 投影,不能把 MetaSchema 当普通内容字段管理。
|
||||
- 逻辑 owner 优先于物理表或代码模块。阶段 7 如因 yudao-cloud fork 过渡,把 MetaSchema 物理表暂放 `muse-content` 或旧 Content 模块,也不能改变 MetaSchema BC 的逻辑 authority。
|
||||
- MetaSchema 写入只能通过 MetaSchema facade-api、治理版本、影响预览和审计发布;Content 只能承载或消费 MetaSchema 投影,不能把 MetaSchema 当普通内容字段管理。admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费。
|
||||
- Agent、Tool Grant 和 Agent Runtime Permission Envelope 的逻辑 authority 归 Agent BC 与安全 facade。即使执行代码或物理表暂落 `yudao-module-ai` / `muse-ai`,AI runtime 也只能消费服务端签发的权限包,不能给自己授权、扩权或绕过 owner 校验。
|
||||
- Source / Authorization 是横切架构契约,不是某个后端表的私有实现。来源 owner 发事件,目标 owner 消费快照和状态,Account/Usage/Audit 记录传播与审计。
|
||||
- AI 模块 Protection Node 和 Quality Policy 采用包级隔离 + ArchUnit 强制:grant 包只暴露给 admin-api 调用链路,runtime 包只读消费。
|
||||
- Source / Authorization 是横切架构契约,不是某个后端表的私有实现。来源 owner 发事件,目标 owner 消费快照和状态,Account/Usage/Audit 记录传播与审计。Source Snapshot 存储在独立 `source_snapshot` 表,各模块分散写入,DDL 放 infra 层统一管理。
|
||||
|
||||
## 4. 关键权威归属
|
||||
|
||||
| 对象 / 能力 | 权威 BC | 允许写入入口 | 不能发生什么 |
|
||||
|---|---|---|---|
|
||||
| MetaSchema / 字段可见性 | Admin/Governance | 管理员控制台治理 facade;必要时由 Content 承载只读投影 | 普通用户、市场资产、Content 普通内容接口不能修改系统元结构 |
|
||||
| 保护节点注册表 | Admin/Governance | 管理员控制台高危发布 | 不能把输入输出合规、权限过滤、拆分切块、入 RAG、语义围栏、静态检查、Shadow -> Canonical、质量门控开放为用户槽位 |
|
||||
| MetaSchema / 字段可见性 | MetaSchema BC | admin 通过 MetaSchema facade 写入全局定义;用户可在作品级覆盖扩展字段;业务模块通过 facade-api 只读消费 | 普通用户、市场资产、Content 普通内容接口不能修改系统元结构全局定义 |
|
||||
| 保护节点注册表 | Admin/Governance(注册)+ AI Orchestration(实例,grant 包) | 管理员控制台高危发布注册;AI 模块 grant 包管理实例 | 不能把输入输出合规、权限过滤、拆分切块、入 RAG、语义围栏、静态检查、Shadow -> Canonical、质量门控开放为用户槽位 |
|
||||
| 正文 Canonical | Work/Content | 用户保存正文、接受候选、导入正文初始化 | AI 或市场资产不能直接写正文事实 |
|
||||
| 规划 Canonical | Work/Content | 用户确认规划、手动保存规划 | 规划候选不能自动进入后续生成上下文 |
|
||||
| 局域知识库(Local KB) | Knowledge | 用户确认知识草稿或手动知识修正 | 全书解析章节确认、知识库绑定、市场授权不能直接写 Local KB |
|
||||
@ -121,13 +124,14 @@ Muse 是面向长篇小说创作的多角色 AI 创作与资产流通系统。
|
||||
|
||||
### 4.1 Source / Authorization 横切 owner
|
||||
|
||||
Source / Authorization 是贯穿市场、知识、智能体、作品、AI 任务、导出和个人中心的横切 owner 契约。
|
||||
Source / Authorization 是贯穿市场、知识、智能体、作品、AI 任务、导出和个人中心的横切 owner 契约。采用事件驱动 + 各模块自治模式:来源 owner 发出状态变化事件,各消费模块监听事件并自行处理反应逻辑,预留集中式演进路径。不需要独立 source 模块。
|
||||
|
||||
- 来源 owner 负责发出 Source Status Event,事件必须包含 source id、source version、事件类型、原因、幂等键和影响范围。
|
||||
- Marketplace/Asset 负责市场资产的 listing、license、install 和治理事件,但不替源作品、源智能体或源知识库改事实。
|
||||
- Authorization Snapshot 在每次生成、绑定、导出、确认、安装或工具运行前固化;下游对象必须保存快照 id 或不可变指纹,不能只保存“授权通过”。
|
||||
- Work/Content、Knowledge、Agent、AI Orchestration、导出任务和 Personal Center 只消费来源状态和授权快照,并把本地对象标记为 active、stale、needs_recheck、revoked、recalled、delisted、blocked 或 owner_missing。
|
||||
- Authorization Snapshot 在每次生成、绑定、导出、确认、安装或工具运行前固化;下游对象必须保存快照 id 或不可变指纹,不能只保存”授权通过”。
|
||||
- Work/Content、Knowledge、Agent、AI Orchestration、导出任务和 Personal Center 只消费来源状态和授权快照,并把本地对象标记为 active、stale、revoked、recalled、delisted、blocked 或 owner_missing。来源变化时各模块直接决策 active 或 disabled,不使用中间 needs_recheck 状态。
|
||||
- SourceStatus 变化不得自动污染或回滚 Canonical,只能限制后续使用、作废未确认对象、要求重验、失效下载凭证或暴露治理入口。
|
||||
- Source Snapshot 存储:独立 `source_snapshot` 表,各模块分散写入,DDL 放 infra 层统一管理。
|
||||
|
||||
## 5. 系统输入与输出
|
||||
|
||||
@ -135,7 +139,7 @@ Source / Authorization 是贯穿市场、知识、智能体、作品、AI 任务
|
||||
|
||||
| 来源 | 输入 | 进入边界 |
|
||||
|---|---|---|
|
||||
| 管理员 | MetaSchema、系统功能编排、保护节点、系统智能体、全局知识、质量策略、市场治理、权限、New-API 权益配置请求 | Admin/Governance、Knowledge、Agent、Marketplace/Asset、Account/Usage/Audit、Integration |
|
||||
| 管理员 | MetaSchema、系统功能编排、保护节点、系统智能体、全局知识、质量策略、市场治理、权限、New-API 权益配置请求 | Admin/Governance、MetaSchema、Knowledge、Agent、AI Orchestration(Protection Node / Quality Policy)、Marketplace/Asset、Account/Usage/Audit、Integration |
|
||||
| 普通用户 | 正文编辑、作品规划、导入文稿、AI 请求、候选决策、知识确认、智能体配置、知识库绑定、市场获取、导出请求 | Work/Content、Knowledge、AI Orchestration、Agent、Marketplace/Asset、Account/Usage/Audit |
|
||||
| 系统任务 | 资料处理、索引、质量评估、来源传播、召回传播、导出、用量归属、重试和补偿 | 对应 owner BC + Account/Usage/Audit |
|
||||
| 外部服务 | 模型结果、网关日志、检索结果、文件处理结果、通知结果 | Integration、AI Orchestration、Knowledge、Account/Usage/Audit |
|
||||
@ -159,7 +163,7 @@ Source / Authorization 是贯穿市场、知识、智能体、作品、AI 任务
|
||||
| Sa-Token | 登录认证、会话、RBAC 基座 | 负责认证授权基座;作品 owner、知识来源、市场授权、Shadow -> Canonical 仍由 Muse 业务规则强制校验 |
|
||||
| New-API | 外部 LLM Gateway | 权威负责模型供应商路由、网关调用和底层成本日志;Muse 只保存绑定、配置请求、调用归属、correlationId、幂等和异常状态。New-API 服务凭据必须只保存为密钥管理引用,按环境隔离和最小权限配置,禁止进入日志、Prompt、候选、导出包或用户可见错误 |
|
||||
| RAG / 向量检索服务 | 检索增强生成基础设施 | 消费 Muse 授权后的投影或索引任务;不是 Canonical 事实源 |
|
||||
| 图查询 / GraphRAG 服务 | 关系查询和一致性检查基础设施 | 只能读取授权投影和快照;不得反向覆盖作品事实 |
|
||||
| 图查询 / GraphRAG 服务 | 关系查询和一致性检查基础设施(依赖 RAGFlow GraphRAG,不自建图存储) | 只能读取授权投影和快照;不得反向覆盖作品事实 |
|
||||
| 文件存储 | 导入文件、资料文件、导出包和临时下载凭证 | 必须受 owner、来源授权、导出许可、短期凭证和下载审计约束;导出包必须加密、按 owner 隔离、通过服务端代理下载,并在过期、撤权、取消或销毁策略触发时失效或删除 |
|
||||
| 通知服务 | 任务结果、市场治理、来源异常和安全事件通知 | 只发送状态和摘要;不承载事实写入或权限判断 |
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 架构-02:核心数据结构与双轨模型
|
||||
|
||||
- 版本:v7
|
||||
- 版本:v8
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:架构 / 后端 / 前端 / 产品 / 测试
|
||||
- 阅读时间:35-50 分钟
|
||||
@ -14,7 +14,7 @@
|
||||
|---|---|---|---|
|
||||
| 规范数据 | Canonical | 用户确认、用户保存或 owner 规则明确写入后的正式事实 | 正文、正式规划项、局域知识库事实、用户知识库资料、智能体版本、市场授权记录 |
|
||||
| 待审层 | Shadow | AI、解析、检测、外部资产或系统处理产生的待确认对象,默认不可信 | AI 候选、规划候选、知识草稿、解析结果、风险标记、质量结果 |
|
||||
| 归档层 | Archive | 待审对象或版本对象进入终态后的历史记录 | 已接受候选、已丢弃候选、已过期草稿、已停用版本、失败任务摘要 |
|
||||
| 归档层 | Archive | 待审对象或版本对象进入终态后的历史记录。存储策略:先同表 + status 过滤,后续按数据量到阈值再分离归档表,预留分离路径 | 已接受候选、已丢弃候选、已过期草稿、已停用版本、失败任务摘要 |
|
||||
|
||||
一句话:AI 和外部资产只能产生候选、草稿、风险、快照或任务结果;正式作品事实必须由用户确认、用户保存或目标 owner 的显式规则写入。
|
||||
|
||||
@ -45,12 +45,13 @@
|
||||
| 模型分区 | 归属 BC | 负责什么 | 不负责什么 |
|
||||
|---|---|---|---|
|
||||
| 账号、权限与安全 | Identity/Auth | 用户、管理员、角色、权限组、菜单、操作、数据范围、会话、安全事件 | 作品事实、市场授权事实、外部网关权威日志 |
|
||||
| 系统治理配置 | Admin/Governance | MetaSchema、系统功能链路、保护节点、开放槽位、系统 Prompt、系统智能体默认链路、质量策略 | 用户私有作品内容和用户私有资产内容 |
|
||||
| 系统治理配置 | Admin/Governance | 系统功能链路、开放槽位、系统 Prompt、系统智能体默认链路 | 用户私有作品内容和用户私有资产内容 |
|
||||
| 元结构定义 | MetaSchema BC | MetaSchema 全局定义、字段类型、校验、枚举、引用、领域、范围、目标类型;admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费 | 用户私有作品内容和用户私有资产内容 |
|
||||
| 作品内容 | Work/Content | 作品、章节、文本块、正文版本、正文来源归因、导入正文、正式规划项、叙事状态和作品导出任务 | 系统配置、市场资产记录、用户知识库资料 |
|
||||
| 知识体系 | Knowledge | 局域知识库、用户知识库、全局知识资料处理、知识草稿、知识来源绑定、索引和投影 | 市场授权交易、智能体槽位、正文编辑事实 |
|
||||
| 智能体体系 | Agent | 智能体、版本、工具授权(Tool Grant)、权限上限、试用、安装、作品槽位绑定、运行权限包 authority | 系统保护节点的最终 authority、作品正文写入、运行时自授权 |
|
||||
| AI 编排与待审对象 | AI Orchestration | 生成、分析、检测、上下文组装、质量门控、候选、风险标记、运行执行记录 | Canonical 事实写入、市场治理、账户安全、智能体运行权限签发 |
|
||||
| 市场资产 | Marketplace/Asset | 市场对象、发布、审核、许可、获取、安装、治理、申诉、来源状态事件 | 源作品、源智能体、源知识库的事实 owner |
|
||||
| AI 编排与待审对象 | AI Orchestration | 生成、分析、检测、上下文组装、质量门控、候选、风险标记、运行执行记录、Protection Node(grant 包,约束 AI 行为)、Quality Policy(AI 质量门控配置) | Canonical 事实写入、市场治理、账户安全、智能体运行权限签发 |
|
||||
| 市场资产 | Marketplace/Asset | 市场对象、发布、审核、许可、获取、安装、治理(admin 包:下架/召回/申诉)、来源状态事件 | 源作品、源智能体、源知识库的事实 owner |
|
||||
| 账户用量与审计 | Account/Usage/Audit | 用量归属、权益快照、个人中心聚合、业务审计、接口调用日志、下载凭证和下载审计 | 业务事实写入、owner 导出内容和外部网关权威成本 |
|
||||
| 外部集成 | Integration | New-API、文件、检索、通知等外部绑定、幂等、重试、correlation | Muse 内部事实 owner |
|
||||
|
||||
@ -109,9 +110,9 @@
|
||||
| 模型 | 说明 |
|
||||
|---|---|
|
||||
| Source Lineage | 原始来源、派生路径、用户动作、AI 候选、市场资产、知识库、版本和许可链路 |
|
||||
| Source Snapshot | 生成候选或草稿时的正文、规划、资料、授权和版本快照 |
|
||||
| Source Snapshot | 生成候选或草稿时的正文、规划、资料、授权和版本快照。存储:独立 `source_snapshot` 表,各模块分散写入,DDL 放 infra 层统一管理 |
|
||||
| Authorization Snapshot | 某次生成、绑定、导出或确认时的许可、用途、权限、状态和限制 |
|
||||
| Source Status | active、stale、needs_recheck、revoked、recalled、delisted、blocked、owner_missing 等统一来源状态 |
|
||||
| Source Status | active、stale、revoked、recalled、delisted、blocked、disabled、owner_missing 等统一来源状态;来源变化时直接决策 active 或 disabled,不使用中间 needs_recheck 状态 |
|
||||
| Source Status Event | 来源状态变化事件 | 由来源 owner 或 Marketplace/Asset 发起,带幂等键、来源版本、影响范围和传播原因 |
|
||||
| Source Propagation Job | 来源状态传播任务 | 按目标对象记录 pending / applied / failed / skipped,失败时默认禁用新使用 |
|
||||
| Risk Marker | 冲突、重复、低置信、权利不清、隐私、安全、合规或来源不可用风险 |
|
||||
@ -124,10 +125,11 @@ Source Status Event 由来源 owner 发出,Source Propagation Job 负责传播
|
||||
|
||||
横切责任边界:
|
||||
|
||||
- Source 传播采用事件驱动 + 各模块自治模式:来源 owner 发出状态变化事件,各消费模块监听事件并自行处理反应逻辑,预留集中式演进路径。不需要独立 source 模块。
|
||||
- Source owner 负责发出来源状态事件;Marketplace/Asset 只对市场 listing、license、install、governance action 发权威事件,不接管源作品、源智能体或源知识库事实。
|
||||
- Authorization Snapshot 由目标 owner 或 Security facade 在使用时固化;Work/Content、Knowledge、Agent、AI Orchestration、导出和个人中心只能消费快照。
|
||||
- Source Status Event 和 Authorization Snapshot 可以物理落在不同 owner 表、事件表或审计表,但语义上必须保留 owner、版本、状态、用途和不可变指纹。
|
||||
- 来源状态传播不得自动改写 Canonical,只能限制后续使用、标记需重验、作废未确认对象或失效下载凭证。
|
||||
- 来源状态传播不得自动改写 Canonical,只能限制后续使用、标记需重验、作废未确认对象或失效下载凭证。来源变化时各模块直接决策 active 或 disabled,不使用中间 needs_recheck 状态。
|
||||
|
||||
## 5. 智能体体系模型
|
||||
|
||||
@ -225,7 +227,7 @@ Handoff 不能成为绕过权限、预检、确认、审计和 owner 写入边
|
||||
|
||||
## 9. MetaSchema 与配置模型
|
||||
|
||||
MetaSchema 是管理员治理的结构定义,不是作品事实,也不是 UI 面板模型。MetaSchema 的逻辑 owner 固定为 Admin/Governance;后端阶段如因 yudao-cloud fork 或旧模块兼容把物理表落到 Content,也只能通过治理 facade 写入,Content 只承载/消费投影,不能把 MetaSchema 当普通内容 owner。
|
||||
MetaSchema 是独立模块管理的结构定义,不是作品事实,也不是 UI 面板模型。MetaSchema 的逻辑 owner 固定为 MetaSchema BC(独立模块);admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费。后端阶段如因 yudao-cloud fork 或旧模块兼容把物理表落到 Content,也只能通过 MetaSchema facade-api 写入,Content 只承载/消费投影,不能把 MetaSchema 当普通内容 owner。
|
||||
|
||||
MetaSchema 负责:
|
||||
|
||||
@ -275,7 +277,8 @@ MetaSchema 不负责:
|
||||
|
||||
1. 对象存在、未过期、未被替代、未撤权、未召回。
|
||||
2. actor、owner、对象、动作、版本和授权快照匹配。
|
||||
3. 来源快照仍匹配当前来源,或用户选择了允许的独立确认路径。
|
||||
3. 候选记录创建时的来源版本,接受时实时对比当前来源状态;来源不匹配时阻断或要求用户选择允许的独立确认路径。不使用独立 Envelope 概念封装决策。
|
||||
<!-- 说明:此处去掉的是 Candidate Decision Envelope(候选接受决策封装)。Agent Runtime Permission Envelope(AI 运行时权限信封)仍保留,两者是不同概念。 -->
|
||||
4. 写入目标 owner BC 的前置条件满足。
|
||||
5. 成功后待审对象迁出活跃区,进入 Archive 或保留为已处理历史。
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 架构-03:关键决策与原则(架构决策记录(ADR))
|
||||
|
||||
- 版本:v7
|
||||
- 版本:v8
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:架构/前端/后端/产品
|
||||
- 阅读时间:30-45 分钟
|
||||
@ -76,12 +76,12 @@
|
||||
- 后果(Consequences):检索质量与灵活性提升;代价是新增外部依赖,必须有降级和重建投影路径。
|
||||
- 参考落地:`doc/dev/03-S1-RAGFlow集成与知识检索基座.md`
|
||||
|
||||
### ADR-006:Neo4j vs RAGFlow GraphRAG 职责分工(待 S1-B 后补完)
|
||||
### ADR-006:图查询依赖 RAGFlow GraphRAG,不自建图存储(已决策)
|
||||
|
||||
- 上下文(Context):需要判断 RAGFlow GraphRAG 是否足以覆盖时间线、因果链、实体演变等查询。
|
||||
- 决策(Decision):暂不把 Neo4j 固定为必选事实;S1-B benchmark 后决定是否引入独立图查询 provider。
|
||||
- 替代方案(Alternatives):现在直接引入 Neo4j 会增加运维和同步复杂度;完全放弃图查询会削弱长篇一致性检查。
|
||||
- 后果(Consequences):保留条件交付空间;正式决策必须由 benchmark 支撑。
|
||||
- 决策(Decision):依赖 RAGFlow GraphRAG 提供图查询能力,不自建 Neo4j 或其他独立图存储。
|
||||
- 替代方案(Alternatives):引入 Neo4j 会增加运维和同步复杂度;完全放弃图查询会削弱长篇一致性检查。
|
||||
- 后果(Consequences):减少运维复杂度和外部依赖;代价是图查询能力受限于 RAGFlow GraphRAG 的演进节奏。如未来 RAGFlow GraphRAG 能力不足,可重新评估独立图存储方案。
|
||||
- 参考落地:`doc/dev/03-S1-RAGFlow集成与知识检索基座.md`
|
||||
|
||||
### ADR-007:Block 使用 UUID
|
||||
@ -146,7 +146,7 @@
|
||||
- 上下文(Context):阶段 7 需要承接后台工程结构、权限基座、代码生成、审计、任务和通用管理能力。yudao-cloud fork 可以降低基础设施成本,但其通用后台模块不等于 Muse 的产品领域边界。
|
||||
- 决策(Decision):允许以 yudao-cloud fork 作为工程基座和过渡物理模块来源;Muse 的逻辑 owner、facade、状态机和写入边界仍以 `架构-01/02/04` 定义的 BC 为准。物理表或代码暂落 `yudao-module-ai`、`yudao-module-system`、Content 旧模块时,必须写明过渡映射,不能改变 MetaSchema、Agent、Handoff、Parse Job、Source / Authorization 的 authority。
|
||||
- 替代方案(Alternatives):完全不用 yudao-cloud 会增加基础能力建设成本;反向让 Yudao/RuoYi 通用后台模型接管 Muse 领域,会制造普通后台表 owner 与 Muse 创作领域 owner 的冲突。
|
||||
- 后果(Consequences):后端文档必须区分“物理模块落点”和“逻辑 owner”。MetaSchema 仍归 Admin/Governance;Agent、Tool Grant、Runtime Permission Envelope 仍由 Agent authority 与 Security facade 控制;AI runtime 不得自授权;Market 只发起来源侧 handoff;Parse Job / Chapter Parse Result 归 AI Orchestration;Knowledge Draft 只在章节审阅确认后由 Knowledge 创建。
|
||||
- 后果(Consequences):后端文档必须区分”物理模块落点”和”逻辑 owner”。MetaSchema 独立为 MetaSchema BC(见 ADR-016);Agent、Tool Grant、Runtime Permission Envelope 仍由 Agent authority 与 Security facade 控制;AI runtime 不得自授权;Market 只发起来源侧 handoff;Parse Job / Chapter Parse Result 归 AI Orchestration;Knowledge Draft 只在章节审阅确认后由 Knowledge 创建。
|
||||
- Supersedes:仅 supersede ADR-013 中“避免引入 Yudao / RuoYi full backend”的工程基座取舍,不 supersede Sa-Token、Shadow -> Canonical 和系统任务服务身份约束。
|
||||
|
||||
### ADR-015:逻辑 owner 优先于物理表、代码模块和页面入口
|
||||
@ -156,9 +156,30 @@
|
||||
- 替代方案(Alternatives):按物理表所在模块决定 owner 会让 Content 接管 MetaSchema、AI runtime 自批 Tool Grant、Market 持有目标 Precheck、Personal Center 反写资产事实,最终形成多事实源。
|
||||
- 后果(Consequences):所有跨 BC 写入必须走 owner facade。Source / Authorization 必须通过事件、快照和传播状态连接各 BC;来源状态变化不得自动改写 Canonical。后端阶段如采用过渡模块,必须在 Schema/API 文档中标注逻辑 owner、写入 facade、消费方和迁移路径。
|
||||
|
||||
### ADR-016:Governance 拆散——按消费者归属拆散,不保留 Governance 聚合模块
|
||||
|
||||
- 上下文(Context):原 Admin/Governance BC 聚合了 MetaSchema、保护节点、质量策略、市场治理等多种职责,消费者分散在不同模块。聚合导致模块边界模糊,变更影响面过大。
|
||||
- 决策(Decision):按消费者归属拆散原 Governance 聚合模块:MetaSchema 独立为 MetaSchema BC;Protection Node 和 Quality Policy 归入 AI Orchestration BC(grant 包);市场治理(下架/召回/申诉)归入 Marketplace/Asset BC(admin 包)。Admin/Governance 只保留系统功能链路、开放槽位和系统 Prompt 等纯系统配置职责。
|
||||
- 替代方案(Alternatives):保留 Governance 聚合模块会让不同消费者的变更耦合在一起,增加协调成本;完全打散到各消费者模块会丢失系统配置的统一治理入口。
|
||||
- 后果(Consequences):MetaSchema 有独立演进节奏,admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费。AI 模块通过包级隔离(grant 包 + ArchUnit)管理 Protection Node 和 Quality Policy,grant 包只暴露给 admin-api 调用链路,runtime 包只读。市场治理由 Marketplace/Asset 的 admin 包承载,与市场资产生命周期紧密关联。
|
||||
|
||||
### ADR-017:Source 传播模式——事件驱动各模块自治,预留集中式演进
|
||||
|
||||
- 上下文(Context):来源状态变化(撤权、下架、召回、版本变化等)需要传播到候选、草稿、绑定、安装、运行任务、导出和个人中心等多个消费方。需要选择传播架构。
|
||||
- 决策(Decision):采用事件驱动 + 各模块自治模式。来源 owner 发出 Source Status Event,各消费模块监听事件并自行处理反应逻辑(标记 disabled、作废未确认对象、失效凭证等)。不需要独立 source 模块。预留集中式 worker 演进路径。
|
||||
- 替代方案(Alternatives):集中式 worker 统一处理所有传播目标,优点是传播逻辑集中可观测,缺点是 worker 需要了解所有消费方的业务语义,形成上帝模块。独立 source 模块会增加模块间调用复杂度。
|
||||
- 后果(Consequences):各模块对来源变化的响应逻辑内聚在自身边界内,降低耦合。Source Snapshot 存储在独立 `source_snapshot` 表,各模块分散写入,DDL 放 infra 层统一管理。来源变化时各模块直接决策 active 或 disabled,不使用中间 needs_recheck 状态。未来如传播可观测性不足或一致性要求提高,可演进为集中式 worker + 事件溯源。
|
||||
|
||||
### ADR-018:Candidate Envelope 简化——去掉独立 Envelope 概念
|
||||
|
||||
- 上下文(Context):原设计中 Candidate Decision Envelope 封装了来源、权限、合规、质量和风险路由结果的决策快照,作为候选接受的硬闸门。实践中 Envelope 增加了概念复杂度和实现成本。
|
||||
- 决策(Decision):去掉独立 Candidate Decision Envelope 概念。候选表直接记录创建时的来源版本(source version、authorization snapshot),接受时实时对比当前来源状态即可。质量门控、输出合规、静态检查等校验在接受时同步执行,不需要预先封装为独立 Envelope 对象。
|
||||
- 替代方案(Alternatives):保留 Envelope 可以缓存决策结果避免重复计算,但增加了过期管理、版本匹配和重算逻辑的复杂度。
|
||||
- 后果(Consequences):候选接受流程简化为:校验候选存在且未过期 -> 实时对比来源版本与当前状态 -> 执行质量/合规/静态检查 -> 写入正文。减少一个中间概念和对应的状态管理。代价是每次接受都需要实时校验,不能复用缓存的决策结果。
|
||||
|
||||
## 3. 本次是否需要新增 ADR 的结论
|
||||
|
||||
需要。双角色入口、New-API 职责边界、全局/局域知识库分层、作品规划台模型复用、小说场景(Scene)暂不升一级模型、Sa-Token 认证授权基座、yudao-cloud fork 工程基座、逻辑 owner 优先原则,都会影响跨文档边界和后续实现,因此已补 ADR-008 到 ADR-015。
|
||||
需要。双角色入口、New-API 职责边界、全局/局域知识库分层、作品规划台模型复用、小说场景(Scene)暂不升一级模型、Sa-Token 认证授权基座、yudao-cloud fork 工程基座、逻辑 owner 优先原则,都会影响跨文档边界和后续实现,因此已补 ADR-008 到 ADR-015。Governance 拆散、Source 传播模式选择、Candidate Envelope 简化和图查询依赖 RAGFlow GraphRAG 的决策已补 ADR-016 到 ADR-018 并更新 ADR-006。
|
||||
|
||||
## 4. 关联阅读
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 架构-04:状态机与约束清单
|
||||
|
||||
- 版本:v5
|
||||
- 版本:v6
|
||||
- 更新日期:2026-05-24
|
||||
- 目标读者:架构 / 后端 / 前端 / 测试 / 产品
|
||||
- 阅读时间:45-60 分钟
|
||||
@ -29,8 +29,7 @@
|
||||
| 状态 | 含义 | 允许离开方式 | 约束 |
|
||||
|---|---|---|---|
|
||||
| queued | 已创建,等待执行 | running / canceled | 必须有 owner、任务类型、幂等键或去重上下文 |
|
||||
| running | 执行中 | succeeded / failed / canceled / needs_recheck | 必须记录配置快照和授权快照 |
|
||||
| needs_recheck | 权限、授权、来源、版本或 owner 状态变化,需重验 | running / failed / canceled | 重验前不得继续写事实或生成可下载结果 |
|
||||
| running | 执行中 | succeeded / failed / canceled | 必须记录配置快照和授权快照 |
|
||||
| partial_completed | 批量任务部分子任务完成 | running / succeeded / failed / canceled | 只允许作为父任务聚合视图;子任务仍必须有各自终态 |
|
||||
| succeeded | 成功完成 | 终态 | 必须满足对应后置条件 |
|
||||
| failed | 失败 | 终态或新任务重试 | 失败不得静默写 Canonical |
|
||||
@ -57,18 +56,20 @@
|
||||
| delisted | 市场下架 | 禁止新获取和新安装;已授权使用按治理策略限制 |
|
||||
| recalled | 召回 | 影响已安装、已绑定、运行中任务、导出和未确认对象 |
|
||||
| owner_missing | 源 owner 缺失或权限转移不明 | 禁止模板化、参考写入、AI 上下文绑定和高风险使用 |
|
||||
| needs_recheck | 版本、许可或权利状态变化 | 进入重验,不得继续消费旧快照 |
|
||||
| disabled | 来源变化后直接停用 | 禁止继续使用,等待恢复或终态 |
|
||||
| blocked | 合规、安全、侵权或隐私阻断 | 禁止继续使用,保留审计和申诉路径 |
|
||||
|
||||
来源变化时直接决策 active 或 disabled,不使用中间 needs_recheck 状态。
|
||||
|
||||
### 2.4 MetaSchema 与配置版本写入约束
|
||||
|
||||
MetaSchema 是 Admin/Governance 的治理版本,不是 Content 普通内容状态。
|
||||
MetaSchema 是 MetaSchema BC(独立模块)的治理版本,不是 Content 普通内容状态。
|
||||
|
||||
硬约束:
|
||||
|
||||
- MetaSchema 发布、回滚、停用和影响预览只能由 Admin/Governance facade 写入,并进入高危审计。
|
||||
- 如果物理表因 yudao-cloud fork 或旧模块兼容暂落 Content,Content 也只能承载/消费投影,不能绕过治理 facade 修改字段结构、可见性、AI 上下文或导出语义。
|
||||
- MetaSchema 版本变化只能让投影、任务、上下文组装、导出和知识确认进入 stale 或 needs_recheck,不能自动改写正文、知识、规划或 Narrative State Canonical。
|
||||
- MetaSchema 发布、回滚、停用和影响预览只能由 MetaSchema facade-api 写入,并进入高危审计。admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费。
|
||||
- 如果物理表因 yudao-cloud fork 或旧模块兼容暂落 Content,Content 也只能承载/消费投影,不能绕过 MetaSchema facade-api 修改字段结构、可见性、AI 上下文或导出语义。
|
||||
- MetaSchema 版本变化只能让投影、任务、上下文组装、导出和知识确认进入 stale 或 disabled,不能自动改写正文、知识、规划或 Narrative State Canonical。
|
||||
|
||||
## 3. 账号、权限和安全状态
|
||||
|
||||
@ -148,7 +149,7 @@ MetaSchema 是 Admin/Governance 的治理版本,不是 Content 普通内容状
|
||||
硬约束:
|
||||
|
||||
- 删除章节必须处理 Block、候选、知识草稿、章节解析结果、规划项、叙事状态和投影影响。
|
||||
- 已确认知识不自动回滚;如果来源章节被删除,相关来源快照进入 stale 或 needs_recheck,后续来源型确认和导出按来源状态限制。
|
||||
- 已确认知识不自动回滚;如果来源章节被删除,相关来源快照进入 stale 或 disabled,后续来源型确认和导出按来源状态限制。
|
||||
|
||||
### 4.3 正式规划项与叙事状态生命周期
|
||||
|
||||
@ -216,8 +217,7 @@ MetaSchema 是 Admin/Governance 的治理版本,不是 Content 普通内容状
|
||||
```text
|
||||
queued -> running -> succeeded -> terminal
|
||||
queued -> canceled -> terminal
|
||||
running -> failed / canceled / needs_recheck
|
||||
needs_recheck -> running / failed / canceled
|
||||
running -> failed / canceled
|
||||
```
|
||||
|
||||
硬约束:
|
||||
@ -345,9 +345,8 @@ parse_job:succeeded
|
||||
| 状态 | 含义 | 允许离开方式 |
|
||||
|---|---|---|
|
||||
| prechecking | 绑定前校验 | active / rejected / canceled |
|
||||
| active | 可作为作品知识来源 | disabled / needs_recheck / revoked |
|
||||
| needs_recheck | 来源版本、许可、处理状态或 owner 变化 | active / disabled / revoked |
|
||||
| disabled | 用户停用或系统停用 | active / revoked |
|
||||
| active | 可作为作品知识来源 | disabled / revoked |
|
||||
| disabled | 用户停用或系统停用(来源变化时直接决策) | active / revoked |
|
||||
| revoked | 授权撤销、下架或召回 | 终态或重新授权新绑定 |
|
||||
| rejected | 预检失败 | 终态 |
|
||||
| canceled | 用户取消 | 终态 |
|
||||
@ -386,10 +385,9 @@ parse_job:succeeded
|
||||
|---|---|---|
|
||||
| using_default | 使用系统默认子智能体 | prechecking_override |
|
||||
| prechecking_override | 校验用户智能体或市场智能体是否兼容槽位 | active_override / rejected / canceled |
|
||||
| active_override | 使用用户选择的子智能体 | needs_recheck / using_default / disabled |
|
||||
| needs_recheck | 授权、版本、工具、输出合同或来源状态变化 | active_override / using_default / disabled |
|
||||
| active_override | 使用用户选择的子智能体 | using_default / disabled |
|
||||
| rejected | 预检失败 | using_default |
|
||||
| disabled | 撤权、越权、输出不合约或安全阻断 | using_default |
|
||||
| disabled | 撤权、越权、输出不合约或安全阻断(来源变化时直接决策) | using_default |
|
||||
| canceled | 用户取消替换 | using_default |
|
||||
|
||||
硬约束:
|
||||
@ -408,7 +406,7 @@ parse_job:succeeded
|
||||
- Agent 版本只能声明需要的工具、上下文和外发范围;Tool Grant 由 Agent authority 与 Security facade 计算权限上限。
|
||||
- 运行任务启动时,Security facade 必须结合 actor、owner、slot、agentVersion、来源状态、授权快照、预算和风险状态签发不可变 Agent Runtime Permission Envelope。
|
||||
- AI Orchestration、Integration 和 tool broker 只能校验并消费运行时权限包,不能自行新增工具、扩大上下文、改变外发策略或复用旧权限包。
|
||||
- Tool Grant、授权快照、来源状态、槽位版本或保护节点规则变化后,相关运行任务和槽位绑定必须进入 needs_recheck、回退默认或阻断。
|
||||
- Tool Grant、授权快照、来源状态、槽位版本或保护节点规则变化后,相关运行任务和槽位绑定必须进入 disabled、回退默认或阻断。
|
||||
|
||||
## 9. 市场资产、授权、安装和治理状态
|
||||
|
||||
@ -447,10 +445,9 @@ parse_job:succeeded
|
||||
|---|---|---|
|
||||
| available | 可获取 | authorized / unavailable |
|
||||
| authorized | 用户已获得许可 | installed(仅智能体和知识库)/ revoked / expired |
|
||||
| installed | 智能体或知识库已加入账户可用资产 | linked_or_bound / disabled / revoked / needs_recheck |
|
||||
| linked_or_bound | 已关联作品槽位或绑定知识来源 | disabled / revoked / needs_recheck |
|
||||
| disabled | 用户停用或系统停用 | installed / revoked |
|
||||
| needs_recheck | 许可、版本、来源或 owner 变化 | installed / linked_or_bound / revoked |
|
||||
| installed | 智能体或知识库已加入账户可用资产 | linked_or_bound / disabled / revoked |
|
||||
| linked_or_bound | 已关联作品槽位或绑定知识来源 | disabled / revoked |
|
||||
| disabled | 用户停用或系统停用(来源变化时直接决策) | installed / revoked |
|
||||
| revoked | 授权撤销、下架或召回限制 | 终态或重新授权 |
|
||||
| expired | 授权到期 | 重新授权或终态 |
|
||||
| unavailable | 不可获取 | available |
|
||||
@ -509,11 +506,10 @@ parse_job:succeeded
|
||||
| 状态 | 含义 | 允许离开方式 |
|
||||
|---|---|---|
|
||||
| active | 目标空间落地 | prechecked / canceled / expired |
|
||||
| prechecked | 目标 owner 完成预检 | confirmed / rejected / needs_recheck / canceled |
|
||||
| prechecked | 目标 owner 完成预检 | confirmed / rejected / canceled |
|
||||
| confirmed | 用户确认,准备原子消费 | consumed / failed |
|
||||
| consumed | 写入目标 owner 事实成功 | 终态 |
|
||||
| needs_recheck | 权限、授权、对象、版本或来源变化 | prechecked / rejected / canceled |
|
||||
| rejected | 预检失败 | 终态 |
|
||||
| rejected | 预检失败或权限/授权/对象/版本/来源变化导致不可继续 | 终态 |
|
||||
| failed | 写入失败 | 终态或重新发起 |
|
||||
| canceled | 用户取消 | 终态 |
|
||||
| expired | 超时 | 终态 |
|
||||
@ -566,10 +562,10 @@ parse_job:succeeded
|
||||
| AI 候选 / 规划候选 | 标记来源不可用,禁用接受或确认 | 自动删除正文 |
|
||||
| 知识草稿 | 禁用来源型确认,保留只读摘要和 lineage | 删除 prior lineage |
|
||||
| 章节解析结果 | 标记需重验或阻断章节确认 | 部分确认 |
|
||||
| 作品知识来源绑定 | needs_recheck / disabled / revoked | 继续用于新生成 |
|
||||
| Agent Slot Binding | needs_recheck / 回退默认 / disabled | 扩大权限继续运行 |
|
||||
| 已安装智能体 / 知识库 | 停用、只读或需重验 | 自动迁移为用户自有资产 |
|
||||
| 运行中任务 | 取消、阻断或 needs_recheck | 继续消费旧授权快照 |
|
||||
| 作品知识来源绑定 | disabled / revoked | 继续用于新生成 |
|
||||
| Agent Slot Binding | 回退默认 / disabled | 扩大权限继续运行 |
|
||||
| 已安装智能体 / 知识库 | 停用、只读或 disabled | 自动迁移为用户自有资产 |
|
||||
| 运行中任务 | 取消或阻断 | 继续消费旧授权快照 |
|
||||
| 导出任务 / 下载凭证 | 失败、过滤、重验或失效 | 下载受限内容 |
|
||||
| 个人中心记录 | 展示异常、治理结果和 owner 跳转 | 替 owner 空间写事实 |
|
||||
| 市场记录和发布者记录 | 更新治理结果、申诉入口和影响摘要 | 隐藏审计 |
|
||||
@ -589,8 +585,7 @@ parse_job:succeeded
|
||||
| draft | 用户选择导出范围 | prechecking / canceled |
|
||||
| prechecking | 权限、owner、来源、许可、导出范围校验 | queued / rejected / canceled |
|
||||
| queued | 已创建导出任务 | running / canceled |
|
||||
| running | 生成导出包 | ready / failed / canceled / needs_recheck |
|
||||
| needs_recheck | 完成前状态变化 | running / failed / canceled |
|
||||
| running | 生成导出包 | ready / failed / canceled |
|
||||
| ready | 导出包生成,等待下载 | downloaded / expired / revoked |
|
||||
| downloaded | 用户已下载 | 终态 |
|
||||
| rejected | 预检失败 | 终态或重新选择范围 |
|
||||
@ -630,9 +625,8 @@ parse_job:succeeded
|
||||
|---|---|---|
|
||||
| unbound | Muse 用户未绑定网关用户 | binding_requested |
|
||||
| binding_requested | 绑定请求已发起 | bound / binding_failed |
|
||||
| bound | 绑定有效 | disabled / needs_recheck |
|
||||
| needs_recheck | 网关状态、权益、配额或归属异常 | bound / disabled / binding_failed |
|
||||
| disabled | 停用 | bound |
|
||||
| bound | 绑定有效 | disabled |
|
||||
| disabled | 停用(网关状态、权益、配额或归属异常时直接停用) | bound |
|
||||
| binding_failed | 绑定失败 | binding_requested |
|
||||
|
||||
调用归属状态:
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
6. 智能体、知识库和市场是增强路径,不能成为写作前置条件。
|
||||
7. 用户可替换的是开放槽位中的子智能体,不能替换系统保护节点。
|
||||
8. 市场资产获取不等于安装;安装不等于绑定作品;绑定不等于写入作品事实。
|
||||
9. 接受或合并 AI 候选前,系统必须消费或重算 Candidate Decision Envelope;来源撤权、召回、下架、阻断、owner 缺失或未授权时,候选不能进入正文规范数据(Canonical)。
|
||||
9. 接受或合并 AI 候选前,系统必须实时校验来源版本和授权状态;来源撤权、召回、下架、阻断、owner 缺失或未授权时,候选不能进入正文规范数据(Canonical)。
|
||||
|
||||
## 2. 普通用户总流程
|
||||
|
||||
@ -135,7 +135,7 @@
|
||||
| 修改后合并 | 编辑候选后合并 | 用户修改后的文本进入正文,旧草稿失效并重新提取 | 不继续使用旧知识草稿 |
|
||||
| 丢弃当前建议 | 点击丢弃 | 候选和关联草稿退出当前待处理视图 | 不改正文、不改知识 |
|
||||
|
||||
接受和修改后合并不是纯前端动作。用户点击后,系统必须重新确认输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、目标正文 `expectedRevision` 和幂等结果;任一硬闸门失败时,用户只看到需重验、已阻断或来源不可用,不会写入正文。
|
||||
接受和修改后合并不是纯前端动作。用户点击后,系统必须实时校验来源版本和授权状态,包括输出合规、静态检查、质量结果版本、来源状态、授权快照、作品资产 feature gate、目标正文 `expectedRevision` 和幂等结果;任一硬闸门失败时,用户只看到需重验、已阻断或来源不可用,不会写入正文。
|
||||
|
||||
辅助动作包括查看来源、展开质量详情、重新生成、取消生成。这些动作不改变正文或知识事实。
|
||||
|
||||
@ -165,10 +165,24 @@
|
||||
|
||||
### 6.1 处理待确认知识
|
||||
|
||||
1. 用户在写作台、候选详情、导入解析或知识与一致性中看到待确认知识提示。
|
||||
2. 打开知识草稿详情。
|
||||
3. 查看来源、上游来源链路、差异、风险、冲突、来源快照和授权状态。
|
||||
4. 用户选择确认来源事实、修改来源事实后确认、改写为用户自有事实、忽略或重新提取。
|
||||
知识草稿分为两条路径:
|
||||
|
||||
自动确认路径:
|
||||
|
||||
1. 系统对满足自动确认条件的草稿(来源为用户自有正文 + 无冲突 + 无外部来源 + 置信度超阈值)自动确认入库。
|
||||
2. 大部分来自用户正文保存的知识草稿会自动进入局域知识库,用户无需逐条处理。
|
||||
3. 用户可在知识面板查看自动确认记录,了解哪些知识被自动入库。
|
||||
4. 用户可随时撤回自动确认的知识。
|
||||
|
||||
手动确认路径:
|
||||
|
||||
1. 不满足自动确认条件的草稿(存在冲突、包含外部来源、置信度不足)进入待确认队列。
|
||||
2. 用户在写作台、候选详情、导入解析或知识与一致性中看到待确认知识提示。
|
||||
3. 打开知识草稿详情。
|
||||
4. 查看来源、上游来源链路、差异、风险、冲突、来源快照和授权状态。
|
||||
5. 用户选择确认来源事实、修改来源事实后确认、改写为用户自有事实、忽略或重新提取。
|
||||
|
||||
批量确认:低风险草稿(无冲突、无外部来源、置信度高)支持批量确认。
|
||||
|
||||
成功终态:用户确认后的知识进入正式作品知识,可参与检索、图查询、质量门控和后续生成。
|
||||
|
||||
|
||||
@ -20,13 +20,13 @@
|
||||
6. 市场授权、安装、绑定、用于生成和写入事实必须分层。
|
||||
7. 来源撤权、下架、召回、版本变化和 owner 缺失必须传播到所有引用位置。
|
||||
8. 跨空间 handoff 不能成为绕过权限、预检、确认和审计的通道。
|
||||
9. Accept / Merge 写入 Canonical 前必须消费或重算 Candidate Decision Envelope,硬闸门失败时不能只靠前端提示放行。
|
||||
9. Accept / Merge 写入 Canonical 前必须实时校验候选记录的 source_version 与当前来源状态,硬闸门失败时不能只靠前端提示放行。
|
||||
|
||||
## 2. 普通用户系统总链路
|
||||
|
||||
用户创作和资产使用的通用链路:
|
||||
|
||||
`认证会话 -> 对象权限校验 -> owner 校验 -> 授权快照 -> 来源状态校验 -> 任务或候选创建 -> Shadow 写入 -> 用户决策 -> 决策 Envelope 重验 -> Canonical / Archive 写入 -> 投影和记录 -> 用量归属 -> 失败反馈`
|
||||
`认证会话 -> 对象权限校验 -> owner 校验 -> 授权快照 -> 来源状态校验 -> 任务或候选创建 -> Shadow 写入 -> 用户决策 -> 来源版本实时校验 -> Canonical / Archive 写入 -> 投影和记录 -> 用量归属 -> 失败反馈`
|
||||
|
||||
系统处理分层:
|
||||
|
||||
@ -100,7 +100,9 @@
|
||||
|
||||
系统链路:
|
||||
|
||||
`用户意图 -> 权限校验 -> 来源状态校验 -> 上下文组装 -> 输入合规 -> 写作子智能体执行 -> 质量门控 -> 输出合规 -> Shadow 候选写入 -> 用量归属 -> 返回候选`
|
||||
`用户意图 -> 权限校验 -> 来源状态校验 -> 上下文组装 -> 输入合规 -> 写作子智能体执行 -> 质量门控 -> 输出合规 -> Shadow 候选写入(记录 source_version) -> 用量归属 -> 返回候选`
|
||||
|
||||
候选创建时必须记录当前使用的各来源版本(source_version),用于接受时实时校验来源是否已变化。
|
||||
|
||||
上下文只允许使用:
|
||||
|
||||
@ -135,14 +137,14 @@
|
||||
|
||||
系统链路:
|
||||
|
||||
`查询候选 -> 消费或重算 Candidate Decision Envelope -> 校验候选状态 -> 校验文本块 expectedRevision -> 校验来源状态和授权快照 -> 写 Canonical 正文 -> 候选进入 Archive -> 关联草稿保持待确认 -> 写记录和投影事件`
|
||||
`查询候选 -> 校验候选 source_version 与当前来源状态 -> 校验候选状态 -> 校验文本块 expectedRevision -> 校验来源状态和授权快照 -> 写 Canonical 正文 -> 候选进入 Archive -> 关联草稿保持待确认 -> 写记录和投影事件`
|
||||
|
||||
处理规则:
|
||||
|
||||
1. 接受只改变正文事实。
|
||||
2. 关联知识草稿不自动进入正式知识。
|
||||
3. 如果候选带有外部或市场来源,正文保存后的重提取必须继承 lineage。
|
||||
4. Candidate Decision Envelope 必须覆盖输出合规、静态检查、质量结果版本、SourceStatus、SourceEventType 影响、Action Policy、Authorization Snapshot、作品资产 feature gate、`expectedRevision` 和命令幂等结果。
|
||||
4. 接受时系统实时校验:候选记录的 source_version 与当前来源状态对比,同时校验输出合规、静态检查、质量结果版本、SourceStatus、Authorization Snapshot、作品资产 feature gate、`expectedRevision` 和命令幂等结果。如果来源已变化,返回错误,前端提示用户重新生成。
|
||||
5. 候选正文 lineage 中存在 revoked、recalled、delisted、blocked、owner_missing 或 unauthorized 来源时,必须阻断进入 Canonical。
|
||||
|
||||
失败处理:候选过期、文本冲突、来源失效或合规阻断时,接受禁用。
|
||||
@ -151,7 +153,7 @@
|
||||
|
||||
系统链路:
|
||||
|
||||
`用户编辑最终文本 -> 消费或重算 Candidate Decision Envelope -> 校验候选和文本块 expectedRevision -> 校验最终正文输出合规、静态检查、来源和授权 -> 写 Canonical 正文 -> 旧知识草稿失效 -> 发布重提取事件 -> 候选进入 Archive`
|
||||
`用户编辑最终文本 -> 校验候选 source_version 与当前来源状态 -> 校验候选和文本块 expectedRevision -> 校验最终正文输出合规、静态检查、来源和授权 -> 写 Canonical 正文 -> 旧知识草稿失效 -> 发布重提取事件 -> 候选进入 Archive`
|
||||
|
||||
处理规则:
|
||||
|
||||
@ -189,7 +191,26 @@
|
||||
3. 来源快照:生成草稿时的正文片段、版本、章节和授权状态。
|
||||
4. 风险标记:冲突、重复、低置信、来源不可用、合规风险。
|
||||
|
||||
确认规则:
|
||||
自动确认判定逻辑:
|
||||
|
||||
草稿生成后,系统立即执行自动确认判定:
|
||||
|
||||
| 条件 | 判定规则 |
|
||||
|---|---|
|
||||
| 来源为用户自有正文 | 草稿提取自当前作品用户保存的正文,lineage 中不包含外部来源 |
|
||||
| 无冲突 | 草稿内容与现有正式知识无矛盾或重复 |
|
||||
| 无外部来源 | 草稿 lineage 中不包含市场资产、授权知识库或其他外部来源 |
|
||||
| 置信度超阈值 | 系统提取置信度达到自动确认阈值 |
|
||||
|
||||
四个条件同时满足时,系统自动将草稿确认进入 Canonical 知识(局域知识库),标记确认方式为"自动确认"。不满足任一条件时,草稿进入待确认队列等待用户手动处理。
|
||||
|
||||
自动确认后的处理:
|
||||
- 写入 Canonical 知识,标记 `confirm_mode = auto`。
|
||||
- 用户可在知识面板查看自动确认记录。
|
||||
- 用户可随时撤回自动确认的知识,撤回后知识退出局域知识库,草稿回到已归档状态。
|
||||
- 自动确认不适用于包含外部来源 lineage 的草稿,这类草稿必须由用户手动确认。
|
||||
|
||||
手动确认规则:
|
||||
|
||||
| 用户动作 | 系统处理 | 限制 |
|
||||
|---|---|---|
|
||||
@ -390,8 +411,8 @@
|
||||
| 层级 | 含义 | 示例 |
|
||||
|---|---|---|
|
||||
| SourceStatus | 来源当前事实状态,由来源 owner 维护 | active、stale、revoked、delisted、recalled、owner_missing、blocked、unauthorized |
|
||||
| SourceEventType | 导致状态或策略变化的事件类型 | source_updated、source_revoked、asset_delisted、asset_recalled、asset_blocked、owner_missing、authorization_revoked、authorization_expired、license_changed、processing_failed、recheck_required |
|
||||
| Action Policy | 针对某个用途的动作结论,不是来源事实本身 | allowed、read_only、needs_recheck、blocked |
|
||||
| SourceEventType | 导致状态或策略变化的事件类型 | source_updated、source_revoked、asset_delisted、asset_recalled、asset_blocked、owner_missing、authorization_revoked、authorization_expired、license_changed、processing_failed |
|
||||
| Action Policy | 针对某个用途的动作结论,不是来源事实本身 | allowed、read_only、blocked |
|
||||
|
||||
同一 SourceStatus 在不同用途下可以得到不同 Action Policy。例如 delisted 可能允许已授权阅读记录继续展示,但阻断新获取、新生成、新绑定、来源型确认、受限导出和候选接受。
|
||||
|
||||
@ -410,21 +431,27 @@
|
||||
|
||||
| 目标 | 系统处理 | 事实影响 |
|
||||
|---|---|---|
|
||||
| 未确认 AI 候选 / 规划候选 | 标记来源不可用,禁用接受或确认,并让 Candidate Decision Envelope 失效或需重算 | 正式事实不变 |
|
||||
| 未确认 AI 候选 / 规划候选 | 标记来源不可用,禁用接受或确认 | 正式事实不变 |
|
||||
| 知识草稿 / Local KB 来源型确认 | 禁用来源型确认,保留只读摘要、lineage、授权快照和证明链 | 正式知识不变 |
|
||||
| 生成上下文 / Context Assembly Snapshot | 从后续上下文中剔除或要求重验 | 新生成受限 |
|
||||
| 作品知识来源绑定 | 进入需重验、停用或只读 | 新生成受限 |
|
||||
| 账户授权记录 / 安装记录 | 标记撤权、召回、下架或需重验 | 新安装、新绑定和新调用受限 |
|
||||
| 已安装智能体 / 知识库 | 停用安装、进入只读或需重验 | 已绑定槽位或知识来源待刷新 |
|
||||
| 作品智能体槽位绑定 | 进入需重验、停用或回退系统默认子智能体 | 新生成受限或回退默认能力 |
|
||||
| 知识库来源绑定 | 进入需重验、停用或只读 | 检索、生成和导出受限 |
|
||||
| 作品知识来源绑定 | 来源仍可用 → 保持 active;来源不可用 → 转 disabled | 新生成受限 |
|
||||
| 账户授权记录 / 安装记录 | 标记撤权、召回或下架 | 新安装、新绑定和新调用受限 |
|
||||
| 已安装智能体 / 知识库 | 来源仍可用 → 保持 active;来源不可用 → 停用安装 | 已绑定槽位或知识来源待刷新 |
|
||||
| 作品智能体槽位绑定 | 来源仍可用 → 保持 active;来源不可用 → 停用或回退系统默认子智能体 | 新生成受限或回退默认能力 |
|
||||
| 知识库来源绑定 | 来源仍可用 → 保持 active;来源不可用 → 转 disabled | 检索、生成和导出受限 |
|
||||
| 运行中任务 / 排队任务 | 取消、阻断或重新校验上下文 | 未完成任务不写事实 |
|
||||
| 导出任务 / download credential 下载凭证 | 重新校验导出范围和许可;已签发但未使用或未过期的下载凭证必须作废或进入需重验 | 导出包可能失败、过滤或禁止下载 |
|
||||
| 导出任务 / download credential 下载凭证 | 重新校验导出范围和许可;已签发但未使用或未过期的下载凭证必须作废 | 导出包可能失败、过滤或禁止下载 |
|
||||
| 个人中心记录 | 刷新授权和治理状态 | 只更新展示和跳转 |
|
||||
| 用户通知 / 治理结果投影 | 展示管理员治理结论、影响范围和可用动作 | 只更新用户可见状态 |
|
||||
|
||||
已确认 Canonical 不自动回滚;受限来源不得继续进入后续生成上下文、绑定、导出许可范围、已签发下载凭证、候选接受或新的来源型知识确认。
|
||||
|
||||
来源变化时的直接决策逻辑(不经过中间状态):
|
||||
|
||||
1. 来源变化事件到达时,查询所有依赖该来源的活跃绑定(知识来源绑定、智能体槽位绑定、安装记录等)。
|
||||
2. 对每个绑定直接判定:来源仍可用(授权有效、未下架、未召回、版本兼容)→ 保持 active;来源不可用 → 转 disabled。
|
||||
3. 通知用户受影响的绑定状态变化,展示具体原因和可用动作。
|
||||
|
||||
## 15. 个人中心、账户安全和用量归属链路
|
||||
|
||||
### 15.1 用量归属和 owner 跳转
|
||||
@ -476,7 +503,7 @@
|
||||
3. 导出任务必须生成 included/excluded manifest,列出包含内容、排除内容、排除原因、来源状态、授权快照和用户确认记录。
|
||||
4. 来源撤权、下架、召回、合规阻断或权限变化时,导出任务失败、过滤受限内容或要求用户重新选择范围;受限来源被过滤时不能静默导出。
|
||||
5. 用户取消导出只取消未完成任务;已经生成的导出包必须进入过期或作废状态。
|
||||
6. 已签发但未使用或未过期的下载凭证遇到权限、来源、任务状态或授权快照变化时必须 revoked / needs_recheck。
|
||||
6. 已签发但未使用或未过期的下载凭证遇到权限、来源、任务状态或授权快照变化时必须 revoked。
|
||||
7. 管理员只能看到脱敏导出摘要和失败原因,不能通过任务治理下载用户导出包。
|
||||
|
||||
失败处理:下载凭证过期、重复使用、actor 不匹配、任务已作废或授权快照不匹配时,拒绝下载并写安全审计。
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user