提交全维度文档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:
zizi 2026-05-24 04:28:52 +08:00
parent 9eacebb630
commit 33aad93bef
23 changed files with 3224 additions and 318 deletions

View File

@ -31,7 +31,7 @@
3. Market 只负责市场资产、授权、安装记录、来源侧 handoff、授权摘要和跳转审计。目标 owner 自己创建和消费 target precheck/sessionMarket 不写目标事实。
4. Import task/context 归 Work/ContentParse Job、Chapter Parse Result、Chapter Review 归 AI OrchestrationKnowledge 只在章节审阅确认后创建或更新 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 映射。

View File

@ -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-HaveP1

View File

@ -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. 关联阅读

View File

@ -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. 创作健康度

View File

@ -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 知识草稿详情

View File

@ -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 导入解析旅程

View File

@ -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 + TypeScriptSPA不使用 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. 实时通信策略
用户端使用 SSEServer-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`

View File

@ -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 安全网
- 每次编辑变化同步写入 IndexedDBkey 为 `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`

View File

@ -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 版本兼容和提交合同

View 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` | 资产状态机、授权状态机 |

File diff suppressed because it is too large Load Diff

View File

@ -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。

View File

@ -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 BCAgent、AgentVersion、Slot、SlotBinding
orchestration/ # AI Orchestration BCTask、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-apiGovernance 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 前缀、权限边界和事件合同保持不变。

View File

@ -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 DraftShadow
-> 用户在知识草稿入口确认
-> 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 DraftShadow不能直接写 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. 关联阅读

View File

@ -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` | infraDDL 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 facadeContent 只提供受控的 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. 物理外键策略。

View File

@ -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 模块)';

View File

@ -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` ownerAI 只能产生 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、私有正文全文或越权来源全文。

View File

@ -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 BCProtection 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 PolicyAI 质量门控配置) | 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 Nodegrant 包,约束 AI 行为、Quality PolicyAI 质量门控配置) | 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 Actionadmin 包:下架/召回/申诉) | 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 OrchestrationProtection 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 隔离、通过服务端代理下载,并在过期、撤权、取消或销毁策略触发时失效或删除 |
| 通知服务 | 任务结果、市场治理、来源异常和安全事件通知 | 只发送状态和摘要;不承载事实写入或权限判断 |

View File

@ -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 Nodegrant 包,约束 AI 行为、Quality PolicyAI 质量门控配置) | 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 EnvelopeAI 运行时权限信封)仍保留,两者是不同概念。 -->
4. 写入目标 owner BC 的前置条件满足。
5. 成功后待审对象迁出活跃区,进入 Archive 或保留为已处理历史。

View File

@ -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-006Neo4j 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-007Block 使用 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/GovernanceAgent、Tool Grant、Runtime Permission Envelope 仍由 Agent authority 与 Security facade 控制AI runtime 不得自授权Market 只发起来源侧 handoffParse Job / Chapter Parse Result 归 AI OrchestrationKnowledge Draft 只在章节审阅确认后由 Knowledge 创建。
- 后果(Consequences):后端文档必须区分”物理模块落点”和”逻辑 owner”。MetaSchema 独立为 MetaSchema BC见 ADR-016Agent、Tool Grant、Runtime Permission Envelope 仍由 Agent authority 与 Security facade 控制AI runtime 不得自授权Market 只发起来源侧 handoffParse Job / Chapter Parse Result 归 AI OrchestrationKnowledge 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-016Governance 拆散——按消费者归属拆散,不保留 Governance 聚合模块
- 上下文(Context):原 Admin/Governance BC 聚合了 MetaSchema、保护节点、质量策略、市场治理等多种职责消费者分散在不同模块。聚合导致模块边界模糊变更影响面过大。
- 决策(Decision):按消费者归属拆散原 Governance 聚合模块MetaSchema 独立为 MetaSchema BCProtection Node 和 Quality Policy 归入 AI Orchestration BCgrant 包);市场治理(下架/召回/申诉)归入 Marketplace/Asset BCadmin 包。Admin/Governance 只保留系统功能链路、开放槽位和系统 Prompt 等纯系统配置职责。
- 替代方案(Alternatives):保留 Governance 聚合模块会让不同消费者的变更耦合在一起,增加协调成本;完全打散到各消费者模块会丢失系统配置的统一治理入口。
- 后果(Consequences)MetaSchema 有独立演进节奏admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费。AI 模块通过包级隔离grant 包 + ArchUnit管理 Protection Node 和 Quality Policygrant 包只暴露给 admin-api 调用链路runtime 包只读。市场治理由 Marketplace/Asset 的 admin 包承载,与市场资产生命周期紧密关联。
### ADR-017Source 传播模式——事件驱动各模块自治,预留集中式演进
- 上下文(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-018Candidate 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. 关联阅读

View File

@ -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 或旧模块兼容暂落 ContentContent 也只能承载/消费投影,不能绕过治理 facade 修改字段结构、可见性、AI 上下文或导出语义。
- MetaSchema 版本变化只能让投影、任务、上下文组装、导出和知识确认进入 stale 或 needs_recheck,不能自动改写正文、知识、规划或 Narrative State Canonical。
- MetaSchema 发布、回滚、停用和影响预览只能由 MetaSchema facade-api 写入并进入高危审计。admin 写入全局定义,用户可在作品级覆盖扩展字段,业务模块通过 facade-api 只读消费
- 如果物理表因 yudao-cloud fork 或旧模块兼容暂落 ContentContent 也只能承载/消费投影,不能绕过 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 |
调用归属状态:

View File

@ -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. 用户选择确认来源事实、修改来源事实后确认、改写为用户自有事实、忽略或重新提取。
批量确认:低风险草稿(无冲突、无外部来源、置信度高)支持批量确认。
成功终态:用户确认后的知识进入正式作品知识,可参与检索、图查询、质量门控和后续生成。

View File

@ -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 不匹配、任务已作废或授权快照不匹配时,拒绝下载并写安全审计。