兑现「看到的=写章用的」信任牌(不变量 #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 可控控件待后续。
32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
"""本章注入透明(B0)的响应 schema(C 扩 / 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="近况摘要回看章数(确定性选择的默认参数)")
|