feat(frontend): 五类交互接入 AI 对话留痕 + Workbench 抽屉入口(AC-3)
- RefinePanel/ChapterRewritePanel:结束后 append [author(意见/答复), ai(产出)];
clarify buffer-until-concluded——澄清 Q&A(原意见→反问→答复)缓冲,随最终产出批
一起落库同 thread;纯放弃不记。refine ai 行 meta 存 version_no+原选段(每版重锚)。
- ContinuePanel:ai-only(续写无作者输入),每候选一条 ai 气泡 meta{candidate_index}。
- GeneratorRunner:成功后 append [author(字段摘要, meta{tool_key,input_fields}),
ai(渲染预览, meta{tool_key,output_kind})];空产物不记。lib/toolbox/aiSummary.ts 纯助手+单测。
- InlineToolbox→GeneratorRunner 透传 append+本章号;ToolboxPage 用 silent 直投项目级(chapter_no=null)。
- Workbench:挂 useAiConversation 单实例 + AiConversationDrawer + 底栏「AI 对话」入口(flag 灰度),
三个 DRAFT-only 再接受回调(替换整章/插入正文/回填选段),成功关抽屉+toast、漂移不盲替换。
This commit is contained in:
@@ -11,11 +11,16 @@ import { GeneratorRunner } from "@/components/toolbox/GeneratorRunner";
|
||||
import type { ToolDescriptorView } from "@/lib/api/types";
|
||||
import { isLegacyTool } from "@/lib/toolbox/toolbox";
|
||||
import { useToolboxTools } from "@/lib/toolbox/useToolboxTools";
|
||||
import type { AiTurnInput } from "@/lib/workbench/useAiConversation";
|
||||
|
||||
interface InlineToolboxProps {
|
||||
projectId: string;
|
||||
// 当前章号:内联工具箱生成留痕挂本章(chapter_no=current)。
|
||||
chapterNo: number;
|
||||
// 把生成结果插入正文(追加到章末)。
|
||||
onInsertText: (text: string) => void;
|
||||
// 留痕:生成成功后 append 一批(透传给 GeneratorRunner)。
|
||||
appendMessages: (turn: AiTurnInput) => void;
|
||||
// 当前正文(编辑器 text)。透传给 GeneratorRunner,供 book-title 等据正文反推 brief。
|
||||
manuscriptText?: string;
|
||||
onClose: () => void;
|
||||
@@ -26,7 +31,9 @@ interface InlineToolboxProps {
|
||||
// 人设/大纲)仍走各自更丰富的独立页,不塞进内联面板。
|
||||
export function InlineToolbox({
|
||||
projectId,
|
||||
chapterNo,
|
||||
onInsertText,
|
||||
appendMessages,
|
||||
manuscriptText,
|
||||
onClose,
|
||||
}: InlineToolboxProps) {
|
||||
@@ -52,6 +59,8 @@ export function InlineToolbox({
|
||||
projectId={projectId}
|
||||
tool={active}
|
||||
manuscriptText={manuscriptText}
|
||||
appendMessages={appendMessages}
|
||||
logChapterNo={chapterNo}
|
||||
onClose={() => setActive(null)}
|
||||
onInsertText={(text) => {
|
||||
if (text.trim().length > 0) onInsertText(text);
|
||||
|
||||
Reference in New Issue
Block a user