Commit Graph

562 Commits

Author SHA1 Message Date
peanut 77ab1aee85 feat(mini-program): ScriptView 恢复小说消息操作按钮组
- 为 kind === 'novel' 的消息添加折叠/展开、复制、播放按钮
- 复用已有函数:getMessageDisplayContent、toggleMessageCollapse、copyMessageContent、playMessageTts
- 折叠按钮条件改用 ASSISTANT_MESSAGE_PREVIEW_LENGTH 常量(替代硬编码 120)
- 添加 .collapse-toggle-row、.message-actions、.action-btn 样式
- 修复 openScriptChat:payload 只有 id 时从 store 获取完整 script 数据,避免 conversationId 缺失导致 loadMessages 不调用
- H5 验收通过:复制/播放/折叠/展开功能正常

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-28 21:45:13 +08:00
peanut 318596c67e docs: 添加小说消息操作按钮恢复实施计划 2026-07-28 19:37:13 +08:00
peanut 760c1445fe docs: 添加小说消息操作按钮恢复设计文档 2026-07-28 19:32:28 +08:00
peanut 9808e2eb93 docs: 详情页澄清选项卡显示不全修复实施计划 2026-07-26 23:10:25 +08:00
peanut 4e79e2150b docs: 详情页澄清选项卡显示不全修复设计 2026-07-26 22:34:52 +08:00
peanut 502586b64a fix(mini-program): 修复 ScriptLibraryView 章节数展示为 0 的问题
getChapterCount 优先从 plotJson.stages.outline.beats.length 获取真实章节数(新剧本),
fallback 根据 length 字段估算:short→1章, medium→2章, long→4章。
2026-07-26 18:21:58 +08:00
peanut 321246c96c docs: 章节数展示修复设计文档 2026-07-26 18:18:14 +08:00
peanut 872cf63c7c fix:调整用户心愿消息到聊天流首位
问题:DB 中 messageOrder 顺序导致用户心愿(order=8)显示在澄清卡片(order=2,4)之后,
但逻辑上用户心愿应该是第一条消息。

修复:
- 在 rebuildResultMessages 完成后,检测 user 类型的 chat 消息位置
- 如果不在首位(index > 0),移动到 resultMessages 数组开头
- ScriptView.vue 和 ScriptDetailView.vue 保持一致

显示顺序现在为:
1. 用户心愿(第一条)
2. 澄清卡片 1 + 答案
3. 澄清卡片 2 + 答案
4. 大纲
5. 正文
2026-07-26 17:15:22 +08:00
peanut e373cb344f fix:过滤未配对澄清答案(避免显示孤立 answer 如「love」)
问题:DB 中部分 clarification_answer 没有对应 question(如 messageOrder=1 的「love」),
原逻辑将其渲染为独立 user 文本消息,导致用户看到无法理解的孤立答案气泡。

修复:
- 未配对的 clarification_answer 不再展示为 user 文本消息,直接 return 跳过
- 原因:没有 question 上下文的 answer 无法正确渲染,只显示答案会造成用户困惑
- ScriptView.vue 和 ScriptDetailView.vue 保持一致

数据影响:
- 「十年后的来信」剧本 messageOrder=1 的「love」answer 将被过滤
- 正常配对的 answer(如「family」→「家人」「sibling」→「兄弟姐妹」)仍正常显示
2026-07-26 17:11:52 +08:00
peanut ed67739a47 fix:澄清问答配对逻辑修复(按 messageOrder 升序匹配)
问题:DB 中 clarification_answer 可能先于 question 存入(messageOrder 更小),
导致原「找最后一张 card」的匹配逻辑把 answer 错误渲染成独立 user 文本消息
(如截图中的「love」紫色气泡)。

修复:
- rebuildResultMessages 改用 messageOrder 升序配对策略:
  1. 先分别提取所有 clarification_question 和 clarification_answer,按 messageOrder 排序
  2. 为每个 question 配对它之后第一个未分配的 answer
  3. 遍历时 question 替换为含答案的 card 消息,已配对 answer 跳过,未配对 answer 作为独立 user 文本

影响:
- ScriptView.vue(chat-bubble 流程视图)
- ScriptDetailView.vue(详情页只读视图)

数据基础:后端 answer 仍只存 value(语义化),前端渲染时通过 options 映射 label。
2026-07-26 17:07:22 +08:00
peanut 7d19fa5898 fix:澄清卡片显示完整选项和中文答案
问题:详情页 chat-bubble 卡片视图显示「已回答:family」等英文 value,
而不是中文 label(如「家人」),且不展示所有可选选项。

修复:
- 新增 getAnswerLabel(msg) 函数,通过 card.options 查找 value 对应的中文 label
- rebuildResultMessages 增加 selectedValue 字段,与 answer 同时存原始 value
- 卡片已回答视图新增 card-options-list,渲染所有选项,已选加 .selected 样式并标 ✓
- submitClarification(实时模式)同步存 selectedValue,保持渲染逻辑一致

影响:
- ScriptView.vue(chat-bubble 流程视图)
- ScriptDetailView.vue(详情页只读视图)

数据基础未动,后端澄清问答 answers 仍存原始 value(语义化)。
全局约束:rpx 单位、代码注释中文、禁止 mock 数据。
2026-07-26 16:49:44 +08:00
peanut 50fb2404fd fix:修复 ScriptView 详情面板重复展示及列表预览行数据路径
- ScriptView.openScriptChat 移除重复 push wishTheme/novelContent,改为从 messages 真实数据按 type 映射为 chat-bubble(与 ScriptDetailView.rebuildResultMessages 一致)
- ScriptLibraryView.getOutlinePreview 增加多路径探测(plotJson.stages.outline.beats / fullPayload.outline.beats / plotJson.outline.beats),兼容老剧本数据
2026-07-26 16:30:33 +08:00
peanut d220b01ba4 feat:ScriptLibraryView 新增大纲预览行
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-26 15:39:49 +08:00
peanut 95a3864250 feat:ScriptDetailView 改造为 chat-bubble 流程视图复刻生成时展示 2026-07-26 15:31:01 +08:00
peanut d2a051a938 feat:novel_done 读取累积 stages 并传入 saveNovelResult 2026-07-26 15:16:45 +08:00
peanut 8c2fe249e7 feat:saveNovelResult 创建 clarification/outline 中间步骤 message 2026-07-26 15:12:50 +08:00
peanut 87d668db1c feat:followup 累积用户澄清回答到全局缓存 2026-07-26 15:06:49 +08:00
peanut fcf4bcd9e4 feat:clarification_card 与 outline_created 事件累积到全局缓存
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-26 15:01:26 +08:00
peanut 7de91dbbb4 feat:新增 SESSION_STAGES_ACCUMULATOR 跨流中间步骤累积器
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-26 14:51:19 +08:00
peanut fc0f5b88c5 fix:修复小说保存与列表刷新
- ShortNovelServiceImpl:累积 novel_delta 事件,novel_done 未携带 full_text 时用累积内容兜底
- ScriptLibraryView:onMounted 主动拉取最新剧本,解决生成后列表不刷新问题
2026-07-26 14:45:51 +08:00
peanut 88e3ec32ef docs:小说列表/详情页展示改造实施计划 2026-07-26 14:43:29 +08:00
peanut 6f4d9ba0d8 docs:小说列表页/详情页展示改造设计文档
修复详情页重复展示问题,列表页增加大纲预览,后端保存澄清问答消息。
详情页复刻生成时 ScriptView 的 chat-bubble 展示结构。
2026-07-26 14:37:57 +08:00
peanut b5af8b4ce8 feat: ScriptDetailView 增强展示用户心愿和大纲元数据 2026-07-26 11:54:12 +08:00
peanut 0f0ae08b7e feat: 前端 store 增加 sessionMeta 状态 + ScriptView 增强 originalQuery 兜底和可靠刷新 2026-07-26 11:53:20 +08:00
peanut c0df76566d fix: 列表查询移除隐性写操作 2026-07-26 11:50:53 +08:00
peanut 06605bfd0d fix: 修复小说生成保存链路(事务+originalQuery兜底+中间步骤累积) 2026-07-26 11:49:31 +08:00
peanut 4931005102 docs: 心愿实现小说保存与复现完整性修复实施计划 2026-07-26 11:37:26 +08:00
peanut 644b8b9d2d docs: 心愿实现小说保存与复现完整性修复设计 2026-07-26 11:34:26 +08:00
peanut 1cf75a2b40 fix: 修复微信开发者工具 60 秒超时错误处理问题
- abort() 只清理资源,不再触发 onError(避免正常流程误报错误)
- 真正的错误(超时、网络错误)通过 Promise.race 的 catch 正确传递给用户
- 修复微信开发者工具强制终止 fetch 时 onError 不被调用的问题
- 使用 errorHandled 标志防止 onError 重复调用
2026-07-23 22:21:46 +08:00
peanut 6eadbce6f2 fix: 修复微信开发者工具 60 秒超时问题
- 将 AbortController 方案改为 Promise.race + setTimeout 外部超时控制
- 解决微信开发者工具底层 fetch 不兼容 AbortController signal 的问题
- 保持 300 秒超时时间不变
- 简化 abort 接口,统一使用 cleanup 函数
2026-07-23 22:12:42 +08:00
peanut bd706e4a5b fix: 修复 H5 模式 stream 请求 60 秒超时问题
- 在 H5 环境使用 fetch + ReadableStream + AbortController
- 支持自定义 300 秒超时
- 小程序环境保持原有 uni.request 逻辑不变
- 添加 CRLF 兼容性、主动中止与超时区分、资源清理
2026-07-22 22:57:29 +08:00
peanut 81786495a6 docs: H5 模式 stream 超时修复实施计划 2026-07-22 22:32:55 +08:00
peanut c64bb4285a docs: H5 模式 stream 超时修复设计文档 2026-07-22 22:31:52 +08:00
peanut e0d9c4a84b fix:修复 ClarificationCard 选项无法切换的 bug(增强 toggleOption 容错性) 2026-07-22 21:50:38 +08:00
peanut 235b08e01d docs:ClarificationCard 选项切换修复设计 2026-07-22 21:49:21 +08:00
peanut 6bf726d6a0 小程序对话页面优化 2026-07-22 21:36:11 +08:00
peanut ef23f3f51b docs: 记录 SSE 流式传输修复的测试结果 2026-07-21 23:54:51 +08:00
peanut bc2f9538f0 docs: 记录 SSE 流式传输修复的部署验证 2026-07-21 23:50:08 +08:00
peanut 82b138280b fix: 移除 console.log 中的敏感信息(firstQuery 文本、payload 完整内容) 2026-07-21 23:47:17 +08:00
peanut 748fc18c84 feat: 前端添加 SSE 事件诊断日志,确认 originalQuery 传递 2026-07-21 23:43:48 +08:00
peanut adeaa7a506 fix: 修复 nginx SSE 配置(添加 HTTP/1.1,移除冗余配置) 2026-07-21 23:40:38 +08:00
peanut feaf8922c5 docs: 记录 nginx SSE 配置优化 2026-07-21 23:34:23 +08:00
peanut 406f9b77b4 feat: 优化 SSE 转发逻辑,使用严格行读取和显式 flush 2026-07-21 23:28:00 +08:00
peanut 2b6dc72744 docs:创建 SSE 流式传输与历史列表保存修复实施计划 2026-07-21 23:24:14 +08:00
peanut 0c9ab9b974 docs:补充前端代码完整示例,移除占位符 2026-07-21 23:19:40 +08:00
peanut 461f993ab1 docs:SSE 流式传输与历史列表保存修复设计 2026-07-21 23:18:18 +08:00
peanut 3d1cc24fc4 fix: SSE 流式转发从 RestTemplate 改用 OkHttp,支持真正的逐行流式读取,解决缓冲导致的一下子全出来问题 2026-07-21 22:48:52 +08:00
peanut b24e176579 feat: 标签顺序改为全部/短篇/中篇/长篇/收藏夹;增加SSE事件诊断日志定位novel_done未触发问题 2026-07-21 21:56:22 +08:00
peanut 3813f91b8d feat: 历史列表分类改为固定5标签(全部/中篇/短篇/长篇/收藏夹),移除状态筛选,后端保存length改为short 2026-07-21 21:15:31 +08:00
peanut 9b496bb42a fix: 撤回 typewriter 改动,novel 改用直接累加 delta 保证流式输出
之前用 useTypewriterStream.writer.push + 同步读 visibleText 有时序问题:
writer 的 visibleText 由内部 setInterval 异步推进,push 后立即同步读得到空串,
气泡一直空白。

撤回 typewriter 改动,恢复 novel_delta 直接 lastNovel.content += delta,
SSE 本身就是流式推送,每次到达即显示。

保留 confirmOutline / modifyOutline 的 pendingNextResponse = true 修复(loading)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 20:43:11 +08:00