oudecheng
|
4e74d66a7c
|
fix(web): 修复流式期间消息重渲染、WebSocket 无谓重连与新消息计数错误
- MessageBubble 用 React.memo 包裹,流式 delta 只追加到最后一条消息,
其余消息引用不变可被 memo 跳过,避免 N-1 条历史消息无谓重渲染
- useWebSocket 用 useRef 存储回调最新引用,connect 不再依赖回调引用,
避免调用方回调变化触发 disconnect+connect 重连
- MessageList 用 prevMessageCountRef 追踪消息条数变化,仅当真正新增
消息条数时才累加 newMessageCount;流式 delta 不增加条数不再误计数,
滑到底部按钮触发的清零路径与时序经审查覆盖各种边界场景
|
2026-08-05 08:10:44 +08:00 |
|
oudecheng
|
2e4b1931a6
|
feat(tokens): 添加 topic 维度 token 消耗与上下文窗口占用统计
后端:
- openai provider 流式响应启用 stream_options.include_usage,从 SSE 末帧捕获 usage
- ChatMessage 新增 MessageUsage(prompt/completion/total/context_window_tokens)
- agent_loop 三处 LLM 调用点持久化 usage,含 context_window_tokens
- storage 新增 context_window_tokens 列及 migration,batch_session_token_stats 聚合查询
- last_prompt_tokens 查询过滤 prompt_tokens IS NOT NULL,跳过 error/cancel 消息
- build_topic_summaries 简化签名,context_window_tokens 从消息记录读取
- protocol 扩展 TopicTokenStats,按 session_id 聚合天然隔离子代理
前端:
- protocol.ts 新增 TopicTokenStats 类型
- useTopics 映射 token_stats 到 Topic
- TopicList 展示总 token 消耗与上下文占用百分比(绿/黄/红三色)
测试:outbound_dispatcher 4 个测试修复(drop(bus) 不关闭 bus,改用 abort)
|
2026-08-04 17:01:54 +08:00 |
|
oudecheng
|
14d903e067
|
fix: Agent 执行与显示层解耦,修复锁屏冻结根因
浏览器锁屏导致 WebSocket 半死,ws_sender.send().await 永久阻塞,
级联阻塞 dispatcher → MessageBus → Agent Loop,后端停止执行直到解锁。
基于第一性原理建立"执行-显示解耦"原则:agent 执行只依赖 SQLite
持久化,实时广播是可丢弃的最佳努力通道。
核心改动:
- MessageBus::publish_outbound 由 send().await 改为 try_send(),
bus 满时丢弃消息并告警,agent 不再被显示层阻塞
- WebSocket writer task 包裹 30s 超时,使用每连接独立的
CancellationToken(非共享 CliChannel 级 token),避免一个连接
超时关闭所有连接;writer 退出时 cancel 通知主 loop 退出
- CliChannel::send 由 send().await 改为 try_send(),避免 dispatcher
单线程被卡住的 writer 阻塞 37s
- 全仓 13 处 publish_outbound 调用统一区分 Dropped(warn)/Closed(error)
- scheduler 3 处 ? 改为 warn,避免 Dropped 触发 misfire 重试风暴
- 前端 WebSocket 添加 25s ping + 指数退避重连(3s→60s封顶)
- 前端 session_list 区分重连恢复/首次连接,重连时保留 messages
并刷新 topic 列表
经五轮对抗性审查验证,修复了共享 cancel token、dispatcher 阻塞、
load_chat_messages 跨 topic 污染、原 session 删除后状态不一致等
回归问题。
同时升级版本号至 0.3.0 并更新 CHANGELOG。
验证:cargo clippy --all-targets --all-features ✓
npm run build ✓ | useChat.test.ts 13 passed ✓
|
2026-08-04 10:55:52 +08:00 |
|
oudecheng
|
c724bbf864
|
chore(web): prettier 一次性格式化并在 CI 启用 format:check
对 47 个前端文件统一执行 npm run format,消除存量格式差异。
随后在 CI 与 Makefile check 中启用 format:check,确保后续提交强制遵守 prettier 风格。
|
2026-08-03 23:25:22 +08:00 |
|
oudecheng
|
2a5a0277c0
|
feat(web): 添加话题重命名功能
新增 RenameTopic 命令与 TopicRenamed 协议消息,复用存储层已有的
update_topic_title 方法。后端响应携带刷新后的完整 topic 列表,
前端零额外往返即可同步侧边栏。
前端 TopicList 侧边栏增加内联编辑入口:悬停显示铅笔图标,点击进入
编辑模式,Enter 提交 / Esc 取消 / blur 取消;通过 onMouseDown
preventDefault 防止按钮点击时 input 提前失焦。
包含 5 个单元测试覆盖成功、空标题、不存在、标题未变跳过写入、
can_handle 等场景。
|
2026-08-03 22:10:25 +08:00 |
|
oudecheng
|
7c578af0bc
|
refactor: 重写 useChat 为组合根,消除上帝 Hook
将 1290 行的 useChat 重写为 360 行组合根:handleServerMessage 从 462 行降为 80 行纯路由分发(Tier1 调度器→Tier2 子智能体→Tier3 主视图),消除组合根层 5 个跨域 ref 同步 effect。UseChatReturn 接口零变更,App.tsx 无需改动。对抗式审查修复 1 个 Critical 项(todo_write 自动刷新的 topic_id 检查)。
|
2026-07-08 11:28:51 +08:00 |
|
oudecheng
|
f3e3ebf55f
|
test: 添加 useChat handleServerMessage 特征测试
新增 13 条特征测试,覆盖 handleServerMessage 全部 20 个 case 与 3 层路由(调度器→子智能体→主视图),锚定行为基线以保护后续组合根重写的回归风险。
|
2026-07-08 11:28:28 +08:00 |
|
oudecheng
|
7038d58207
|
refactor: 抽取 useChat 的领域子 hook 与 messageMappers
将原上帝 Hook 的状态域拆分为 7 个职责单一的子 hook:useConnection/useSessions/useTopics/useMessages/useSubAgentView/useSchedulerView/useSideData,并将消息映射纯函数提取到 messageMappers.ts。各子 hook 自管 ref 同步 effect,跨域依赖通过 options 注入,为组合根重写奠定基础。
|
2026-07-08 11:24:42 +08:00 |
|
oudecheng
|
f8d5f0253a
|
refactor: 清理 P1 类型债与 React key 债
- 消除 useChat.ts 中 13 处 (message as any).timestamp,改用已收窄变量的 .timestamp
- 给 ExecutionCancelled 接口补 timestamp?: number 字段,与后端对齐
- 修复 MessageInput 附件列表 key={index}: 给 FileAttachment 加 id 字段(crypto.randomUUID())
- 修复 ConfigPage TagEditor key={i} → key={t}(tag 值唯一)
- 修复 ConfigPage SourceEditor customPaths key={i} → key={p}(路径值唯一)
|
2026-07-07 17:53:53 +08:00 |
|
oudecheng
|
7eb2933ca5
|
chore: 清理 P0 技术债
- 删除 web/src/components/Sidebar/.deprecated 目录(死代码)
- 清理 useChat.ts/useWebSocket.ts 中 13 条调试 console.log
- 修复 load_task_messages.rs 硬编码 task 状态: 新增 TaskSessionState::Unknown,
DB 重建时返回 Unknown 而非误报 Completed, 前端显示"未知"
|
2026-07-07 17:45:07 +08:00 |
|
oudecheng
|
b9c880d823
|
fix: 同步前置 subAgentViewRef/subAgentStackRef,消除子智能体视图间歇性丢消息
根因: subAgentViewRef.current 在 setSubAgentStack updater 内部更新,updater 在 React render 阶段才执行,不是同步的。从 enterSubAgentView() 返回到 React render 之间存在竞态窗口,WebSocket 消息读到过时的 ref 被错误路由到主视图并丢弃。
修复: ref 赋值从 updater 内部移到 setSubAgentStack 之前同步执行。新增 subAgentStackRef 供 exit/navigate 在空依赖闭包中读取最新栈计算新栈顶。selectTopic/selectChannel/selectSession 清空栈时也同步设置 ref。updater 变纯函数,StrictMode 双调用无副作用。
Plan: fix-subagent-view-ref-race
|
2026-07-07 14:12:21 +08:00 |
|
oudecheng
|
6df87fe399
|
fix: 子智能体工具消息去重改为按 id+type,修复工具状态卡在执行中
后端为同一次工具调用的 tool_call/tool_result/tool_pending 生成相同的 id(= tool_call_id),上一提交的去重逻辑仅按 id 判断,导致 tool_result 被 tool_call 误判为重复而跳过,App.tsx 合并逻辑收不到 tool_result,工具永远停留在 calling 状态。
改为按 id + type 去重:同类型消息不会重复(解决 load_task_messages 并发重复),不同类型消息(tool_call vs tool_result)不会被误伤(修复工具状态卡死)。
同时修复 appendToSubAgentViewMessage 和 appendToSubAgentLayerMessage 两处。
|
2026-07-07 11:22:48 +08:00 |
|
oudecheng
|
fc050c5074
|
fix: 前端子智能体视图消息显示与刷新修复
protocol.ts: ExecutionCompleted/WsError 类型增加 subagent_task_id 字段。
useChat.ts 核心修复:
- getSubagentTaskId 识别 execution_completed/error 消息类型
- task_messages_loaded 处理增加 task_id 校验,避免快速切换视图时状态污染
- 主视图 execution_completed/error case 防护,子智能体事件不操作主视图
- 新增 appendToSubAgentLayerMessage,非栈顶子智能体消息遍历栈匹配层而非丢弃
- appendToSubAgentViewMessage 对 tool_call/tool_result/tool_pending 按 id 去重
- execution_completed/error 路由到匹配层更新 status
- exitSubAgentView/navigateToSubAgentLevel 返回 load_task_messages 命令重新拉取
Spec: fix-subagent-message-refresh-on-exit (Task 3-8)
|
2026-07-06 18:11:37 +08:00 |
|
oudecheng
|
994db87f11
|
feat: 新增 ExecutionCompleted 信号修复发送按钮状态
- 后端 OutboundEventKind/WsOutbound 新增 ExecutionCompleted 变体
- processor 在 handle_message 完成后发送该信号
- 飞书/微信通道过滤该信号(不发送)
- 前端 useChat 移除 stream_delta/assistant_response 的 isLoading=false
- 改由 execution_completed 事件统一设置 isLoading=false,确保智能体迭代期间按钮保持停止态
|
2026-07-03 19:32:14 +08:00 |
|
oudecheng
|
c72853c79d
|
feat: 添加 user_message_id 字段以支持用户消息的关联和同步
|
2026-06-24 15:13:36 +08:00 |
|
oudecheng
|
4efc8b51e7
|
feat(todo): 添加待办项关联的创建消息ID并支持消息高亮
- 在待办相关数据结构和存储中新增 created_by_message_id 字段
- 记录待办项创建时对应的消息ID,支持追溯来源
- 在前端待办列表项增加点击事件,点击后滚动并高亮对应消息
- 在消息列表组件中实现高亮动画及自动滚动功能
- 更新相关工具、协议和数据库查询,确保新字段正确传递和存储
- 增加 CSS 动画实现待办对应消息的高亮闪烁效果
- 优化前端状态管理,支持设置与获取高亮消息ID
|
2026-06-22 14:50:37 +08:00 |
|
oudecheng
|
606fcbcd29
|
feat(agent): 注入并传递 tool_call_id 实现任务与工具调用精准关联
- 在 agent_loop 执行上下文中注入 tool_call_id,确保执行时传递该字段
- 在 agent_factory、ws、todo_read、todo_write 等多处构造对象时添加 tool_call_id 字段初始化
- 扩展协议定义及序列化,支持 tool_call_id 字段传递
- 在工具调用任务运行时传递 tool_call_id,便于事件追踪和层级关联
- 在前端 useChat hook 增加 tool_call_id 关联逻辑,实现 task_started 事件精准匹配和跳转
- 增加 pendingTaskNavs 缓存处理,解决 task_started 事件先于 tool_call 到达的顺序问题
- 调整消息渲染逻辑,根据 tool_call_id 进行优先匹配,提升用户交互体验
|
2026-06-22 10:22:36 +08:00 |
|
oudecheng
|
82eab7ad8d
|
fix(useChat): 修复 task_started 事件过滤及日志输出
- 增加 task_started 消息的调试日志,输出 task_id、topic_id、parent_task_id 和当前选中的话题
- 对 topic_id 不匹配的 task_started 消息进行过滤,并打印日志提示
- 对带有 parent_task_id 的孙智能体 TaskStarted 消息进行过滤,避免回填主视图,并打印日志
- 在更新消息状态时添加日志,记录查找 task tool_call 消息的数量及索引
- 处理未找到匹配 task tool_call 的情况并打印对应日志
|
2026-06-18 17:50:44 +08:00 |
|
oudecheng
|
9ea5849f22
|
refactor(task): 子智能体相关字段重命名及导航逻辑调整
- 将 runtime 中的 sub_session_id 字段重命名为 task_id,作为持久化的 scope_key
- 调整持久化 todo_write 结果使用 task_id 代替 session_id 作为 scope_key
- 重命名前端消息中的 subagentTaskId 为 navigateToTaskId,增强导航表达
- 修改 MessageBubble 组件中子智能体任务导航相关的字段名和条件判断
- 优化 useChat 中 task tool_call 消息的 navigateToTaskId 设置逻辑,确保正确导航孙智能体任务
- 移除无用的 getTopicId 辅助方法,简化消息处理逻辑
- 在协议类型定义中新增 navigateToTaskId 字段,明确导航用途与关系
|
2026-06-18 17:09:42 +08:00 |
|
oudecheng
|
e585ec71b1
|
refactor(todo): 统一子代理 scope_key 为全局唯一的 task_id
- 修改 list_todos 处理器,子代理使用 task_id 作为 scope_key,替代原先的 sub:{parent_session_id}:{task_id}
- 调整 todo_write 的 scope_key_from_context 函数,子/孙代理使用 task_id 隔离,避免与父代理污染
- 修正子任务消息的 task_id 传递逻辑,在 useChat hook 中为子代理视图的孙子任务回填正确的 task_id
- 清理 MessageBubble 组件中多余的 isSubAgent 变量声明
|
2026-06-18 16:44:54 +08:00 |
|
oudecheng
|
301506a3b1
|
feat(chat): 支持子智能体导航添加子智能体类型参数
- 扩展 enterSubAgentView 方法,新增 subagentType 可选参数
- 更新相关回调 onNavigateToSubAgent,添加 subagentType 参数支持
- 调整 MessageBubble 组件触发子智能体导航时传递 subagentType
- 优化 MessageList 组件显示新消息计数及底部导航按钮交互
- 美化底部浮动导航按钮样式,增加新消息数字提示和动画
- TodoPanel 添加状态点样式,消息内容排版更紧凑
- 维护滚动位置状态,改进滚动时新消息计数逻辑
|
2026-06-18 15:34:27 +08:00 |
|
oudecheng
|
bf724b133c
|
feat(chat): 支持子智能体栈和面包屑导航功能
- 引入子智能体栈结构以支持多层子智能体导航
- 替换原有单一子智能体视图为子智能体栈管理消息和状态
- 添加navigateToSubAgentLevel方法,支持通过面包屑快速跳转子智能体层级
- 调整子智能体面包屑条UI,显示完整层级的描述、类型和状态
- 优化子智能体消息流和状态更新逻辑,保持栈顶视图同步
- 更新退出子智能体视图逻辑以支持栈弹出操作
- 添加主会话入口和各层子智能体的切换按钮及状态颜色显示
|
2026-06-18 14:53:05 +08:00 |
|
oudecheng
|
e506ffd539
|
feat(agent): 支持子孙智能体的父任务链路传递
- 在 agent_factory 和子代理相关结构体中新增 parent_task_id 字段
- 协议层序列化、反序列化及 WebSocket 适配器支持 parent_task_id 信息传递
- todo_read 与 todo_write 工具添加 parent_task_id 以保持任务层级一致
- 在 DefaultSubAgentRuntime 中实现从 session_id 提取 parent_task_id 的逻辑
- 子智能体创建孙智能体时,正确设置并传递 parent_task_id 元数据
- 前端 useChat 钩子过滤孙智能体的 TaskStarted 事件,避免视图串扰
|
2026-06-18 11:30:47 +08:00 |
|
oudecheng
|
e842ae0608
|
feat(chat): 实现todo_write完成后自动刷新待办列表
- 在useChat中添加sendMessage引用,支持从handleServerMessage内部发送命令
- 在App.tsx中通过useEffect将sendMessage注入useChat
- 子代理todo_write完成后自动发送请求刷新对应待办列表命令
- 主视图todo_write完成后自动刷新待办列表,支持子代理和主任务区分
- 优化消息处理逻辑,避免不同子代理消息混淆
|
2026-06-17 14:33:02 +08:00 |
|
oudecheng
|
027e8661bc
|
feat(todo): 实现待办事项列表的动态刷新和状态管理
- 在 runtime 中为待办事项添加基于系统时间的时间戳
- 修复前端 TodoPanel 组件的数据刷新逻辑
- 添加 setTodos 状态更新函数以支持待办事项清空操作
- 实现根据当前视图动态选择请求命令的功能
- 优化待办事项数据的过滤和映射处理流程
|
2026-06-15 16:20:40 +08:00 |
|
|
|
b67848180b
|
feat(stream): 添加子代理消息流增量处理功能
- 在 runtime 模块中新增 handle_stream_delta 方法,支持子代理消息流的增量和结束事件处理
- 为流消息新增 stream_message_id,用于标识和管理消息流状态
- 修改 ConversationContext 初始化,加入 stream_message_id 互斥锁字段
- 更新 web 端 Chat 组件,添加对流增量内容的条件渲染,避免空字符串渲染
- 在 useChat 钩子内增加对 stream_delta 和 stream_end 类型消息的识别和处理逻辑
- 实现流增量消息的累积更新,合并多次流增量内容和推理文本
- 处理流结束消息时的无操作逻辑,确保消息流完整性
- 对 assistant_response 消息进行替换更新,修正流消息的最终呈现内容
|
2026-06-14 12:51:26 +08:00 |
|
|
|
fc7df67474
|
feat(streaming): 支持流式文本增量与结束信号功能
- 新增 StreamDelta 和 StreamEnd 类型,支持流式数据增量传输
- 扩展 LLMProvider trait,添加带回调的 chat_with_streaming 接口
- 修改 OpenAI Provider 实现,支持流式聊天回调传输增量数据
- Agent 流处理改为异步消费增量消息并传递给前端
- 保证流式增量和最终消息使用相同消息 ID 以便前端替换
- 修改消息总线和协议层,支持携带和识别流式消息的消息 ID
- 客户端 CLI 通过增量输出实现交互式流式响应显示
- Web 前端接收流式增量消息,追加到对应消息,实现实时显示
- 各通道(飞书、微信)支持转发流式增量和结束消息
- 任务工具运行时添加消息 ID 支持,保持消息一致性
- 统一消息构造函数新增流式增量和结束信号的构建方法
|
2026-06-14 10:24:52 +08:00 |
|
oudecheng
|
43cea50df8
|
feat: 添加连接设置弹窗,支持动态配置 WebSocket 连接
|
2026-06-12 19:17:50 +08:00 |
|
oudecheng
|
24bbd5f8c9
|
feat: 子代理 todo 列表支持 — 进入子代理视图时显示子代理的待办
- SubAgentEmitter 添加 todo_write 持久化(照搬 BusToolCallEmitter 模式)
- DefaultSubAgentRuntime 加 store 字段,透传给 emitter
- Command::ListTodos 加 task_id 参数
- list_todos handler: 当 task_id 存在时,scope_key = sub:{parent}:{task_id}
- 前端: 子代理视图下自动带 task_id 请求子代理的 todo
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-12 18:01:57 +08:00 |
|
oudecheng
|
3f32079f92
|
feat: 添加 Todo 面板,支持待办事项的展示与管理
|
2026-06-12 15:17:49 +08:00 |
|
oudecheng
|
cedd8b2a69
|
feat: 添加 topic_id 字段到消息结构,优化消息处理逻辑
|
2026-06-12 12:22:21 +08:00 |
|
oudecheng
|
6ff5907616
|
feat: 添加 reasoning_content 字段到多个消息结构,支持思考过程展示
|
2026-06-11 14:33:29 +08:00 |
|
oudecheng
|
0ce89a0e4e
|
feat: 添加 reasoning_content 字段到多个消息结构,支持思考过程展示
|
2026-06-11 12:04:52 +08:00 |
|
oudecheng
|
a4cdb31ba0
|
feat: 优化话题描述生成逻辑,增加空描述回退机制;更新话题创建命令以自动聚焦新话题
|
2026-06-10 11:26:35 +08:00 |
|
oudecheng
|
f470affb2f
|
feat: 添加技能列表功能,支持列出所有技能并在前端展示
|
2026-06-08 14:13:54 +08:00 |
|
|
|
cca913b610
|
feat: 添加记忆 CRUD 功能,支持创建、更新和删除记忆,优化记忆面板交互
|
2026-06-07 20:16:54 +08:00 |
|
|
|
7708112649
|
feat: 添加记忆功能,支持列出所有记忆并在前端展示,优化记忆面板
|
2026-06-07 19:50:46 +08:00 |
|
|
|
eeea7d44d0
|
feat: 添加 topic_id 支持,确保消息按话题隔离
|
2026-06-07 17:49:22 +08:00 |
|
|
|
3a623cc8a3
|
fix: 修复话题描述更新逻辑的竞态条件和语义错误,前端自动刷新描述
- topic_description.rs: LLM 返回空字符串时返回 Err 而非 Ok(""),防止空值写回 DB 触发循环生成
- processor.rs: 添加 Arc<Mutex<HashSet>> 生成中守卫防止重复触发,改用 DB 中真正第一条用户消息生成描述
- useChat.ts: assistant_response 时检测当前话题描述为空则递增刷新信号
- App.tsx: 监听刷新信号,500ms 防抖后自动发送 list_topics 获取新描述
|
2026-06-07 16:52:44 +08:00 |
|
|
|
b5e2886068
|
feat: 添加删除话题功能,包括命令处理器和前端交互
|
2026-06-07 14:09:14 +08:00 |
|
|
|
bf66c00950
|
feat: 为 WebSocket 消息添加时间戳字段,确保消息的时间信息可用
|
2026-06-07 09:18:15 +08:00 |
|
|
|
6f33ec7604
|
feat: 多通道消息支持与 Session 选择器
后端:
- list_channels 从 ChannelManager 动态查询通道列表(合并 websocket + 所有已注册通道)
- build_channel_list 移至 ChannelManager,网关层直接依赖领域层
- get_current_topic 自动创建默认话题(修复微信等通道无话题的问题)
- is_channel_writable: 仅 websocket 可写,其余通道只读
前端:
- 右上角通道选择器 + Session 选择器(Portal 渲染,固定宽度居中)
- 只读通道显示刷新按钮替代新建按钮
- 话题列表时间戳修复(秒→毫秒)
- 移除冗余的 SessionInfo、AI Ready、所属会话等 UI
- 修复 scheduler view 路由无条件拦截消息的 bug
|
2026-06-06 22:25:10 +08:00 |
|
|
|
e8a3a47ac7
|
feat: 添加 TaskStarted 事件,支持任务开始通知功能
|
2026-06-03 21:53:37 +08:00 |
|
oudecheng
|
1b571e943f
|
feat: 添加停止当前执行的 Agent 功能,支持通过 /stop 命令取消执行
|
2026-06-03 16:49:29 +08:00 |
|
oudecheng
|
9f2eedf313
|
feat: 更新消息处理逻辑,仅接受带有匹配 subagent_task_id 的消息
|
2026-06-02 19:34:11 +08:00 |
|
oudecheng
|
5f2bc950b1
|
feat: 添加定时任务和聊天消息加载功能,增强调度管理
|
2026-06-02 17:04:00 +08:00 |
|
oudecheng
|
4d6d989247
|
feat: 添加工具执行时长字段,增强消息处理功能
|
2026-06-02 16:52:47 +08:00 |
|
oudecheng
|
f8fc0f7d0f
|
feat: 添加工具结果处理功能,支持执行时长记录和显示
|
2026-06-02 16:15:05 +08:00 |
|
|
|
7d9355fd78
|
feat: WebSocket 媒体文件处理优化
- 后端 ws.rs: 处理前端上传的 base64 内容,保存到本地文件并更新路径
- 后端 ws.rs: 历史消息加载时从文件读取内容填充 base64,过滤 media_refs_json
- 前端 App.tsx: 传递 attachments 给 handleMessage 实现实时显示
- 前端 useChat.ts: handleMessage 支持 attachments 参数
- 前端 MessageInput.tsx: 支持剪贴板粘贴文件/图片
- 前端 MessageInput.tsx: 修复拖拽文件时闪烁问题
- 测试 test_request_format.rs: 补充缺失的 attachments 字段
|
2026-05-30 10:22:30 +08:00 |
|
|
|
3d9c981c2a
|
feat: 前端输入框体验优化
- AI 响应完成后自动聚焦输入框
- 输入框和发送按钮居中对齐
- 隐藏输入框滚动条
- 新建话题无需输入名称,自动生成默认标题
|
2026-05-29 23:12:53 +08:00 |
|