feat(frontend): 整章「再沟通/重写」面板——给意见流式重写整章,版本栈迭代,接受替换正文

WFW-8 整章级再沟通(前端)。底栏新增「整章重写」→ ChapterRewritePanel:
- 作者给意见 → useChapterRewrite 消费 POST .../rewrite 的 SSE 流(复用 lib/stream/sse
  帧解析),流式 live 展示新一版;
- 每轮完成压入版本栈,「再改一版」以最新版为 prior_draft + 新意见迭代(多轮对话式);
- 接受某版才「替换整章正文」落草稿(HITL,AI 绝不静默覆盖);停/错误/网络异常均归一处理。
四张 AI 结果卡(润色/续写/工具箱/整章重写)互斥。gen:api 重生成 TS 客户端。
门禁绿:tsc/lint/vitest 636(+7 useChapterRewrite)/build/coverage 95.36%。
This commit is contained in:
Yaojia Wang
2026-07-08 07:12:04 +02:00
parent 6ed9c89430
commit 542c2abac9
5 changed files with 567 additions and 1 deletions

View File

@@ -157,6 +157,29 @@ export interface paths {
patch?: never;
trace?: never;
};
"/projects/{project_id}/chapters/{chapter_no}/rewrite": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Stream Rewrite
* @description 整章再沟通/重写:组装记忆 + 当前草稿 + 作者意见 → 网关流 → 归一 SSE → event-stream。
*
* HITL新版停前端/草稿,接受才落库(不变量 #3rewrite 是工具非写节点,不破坏章
* 纯函数性(不变量 #7。项目不存在 → 404触网关前 fail-fast同 draftQA C1
*/
post: operations["stream_rewrite_projects__project_id__chapters__chapter_no__rewrite_post"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/chapters/{chapter_no}/review": {
parameters: {
query?: never;
@@ -1868,6 +1891,20 @@ export interface components {
/** Draft */
draft?: string | null;
};
/**
* RewriteStreamRequest
* @description POST /projects/:id/chapters/:no/rewrite整章再沟通/重写。
*
* `feedback` = 作者对本章的修改意见;`prior_draft` = 当前整章草稿(前端传入,据此 + 记忆
* 注入流式重写一版)。临时输入、不持久化、无迁移;只入 volatile守缓存前缀不变量 #9
* 新版停前端/草稿接受才落库HITL不变量 #3
*/
RewriteStreamRequest: {
/** Feedback */
feedback: string;
/** Prior Draft */
prior_draft: string;
};
/**
* RuleCreateRequest
* @description POST /projects/:id/rules新增一条规则。
@@ -2727,6 +2764,42 @@ export interface operations {
};
};
};
stream_rewrite_projects__project_id__chapters__chapter_no__rewrite_post: {
parameters: {
query?: never;
header?: never;
path: {
project_id: string;
chapter_no: number;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["RewriteStreamRequest"];
};
};
responses: {
/** @description Successful Response */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": unknown;
};
};
/** @description Validation Error */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["HTTPValidationError"];
};
};
};
};
review_chapter_projects__project_id__chapters__chapter_no__review_post: {
parameters: {
query?: never;