feat(ux): B0 注入透明读端点 + F1 写作页右栏真面板

兑现「看到的=写章用的」信任牌(不变量 #6),替换写作页右栏过时假占位
(「M1 暂未接 / M2 开放」)。

后端:
- GET /projects/{id}/chapters/{no}/injection → InjectionResponse(selected
  实体 + 入选理由 + recent_n);调既有 assemble() 回放确定性 SelectionTrace,
  无 LLM / 无 commit / 无 DDL;项目不存在→404,无大纲→selected:[]。
- 新 schemas/injection.py;tests/test_injection.py(3 测)。

前端:
- gen:api 纳入端点;纯逻辑 lib/workbench/injection.ts(理由/类型→中文徽标
  + 4 vitest)+ useInjection 读 hook。
- ChapterAssistant 改 client 组件:列出选中实体 + 理由徽标 + 空/载/错三态,
  四审段指向审稿页;Workbench 传 projectId/chapterNo。

门禁:后端 ruff/format/mypy 159/alembic 无漂移/pytest 454;
前端 lint/typecheck/vitest 167/build。

B0 可控版(PUT override pin/排除/recent_n + selection 加参 + draft 同读
override + 持久化)+ F1 可控控件待后续。
This commit is contained in:
Yaojia Wang
2026-06-20 10:57:03 +02:00
parent 7e63534366
commit 8058cfb11a
12 changed files with 513 additions and 10 deletions

View File

@@ -0,0 +1,31 @@
"""本章注入透明B0的响应 schemaC 扩 / ARCH §3.4、§5.3)。
snake_case前端经 OpenAPI 生成 TS 类型消费。改字段 → 前端必须 `pnpm gen:api`。
读取无 LLM、无 commit——仅回放 assemble() 的确定性 SelectionTrace不变量 #6
"""
from __future__ import annotations
import uuid
from pydantic import BaseModel, Field
class InjectionEntity(BaseModel):
"""一个被注入本章上下文的实体 + 入选理由(喂给透明面板的徽标)。"""
kind: str = Field(description="character / world_entity")
name: str
reasons: list[str] = Field(
default_factory=list,
description="explicit_beat / main_character / recent_digest / foreshadow_window",
)
class InjectionResponse(BaseModel):
"""GET /projects/:id/chapters/:no/injection本章确定性注入留痕。"""
project_id: uuid.UUID
chapter_no: int
selected: list[InjectionEntity] = Field(default_factory=list)
recent_n: int = Field(description="近况摘要回看章数(确定性选择的默认参数)")