|
|
c3808ff38c
|
Merge pull request 'fix: 修复“设置”侧栏双重展开的问题' (#198) from develop into v2
Deploy / deploy (push) Successful in 29s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/198
|
2026-06-22 13:03:04 +08:00 |
|
|
|
2740bea755
|
Merge pull request 'fix: 修复“设置”侧栏双重展开的问题' (#197) from fix/frontend into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/197
|
2026-06-22 13:02:43 +08:00 |
|
|
|
69b9694cfe
|
fix: 修复“设置”侧栏双重展开的问题
|
2026-06-22 13:02:05 +08:00 |
|
|
|
70ee212ea2
|
Merge pull request 'fix: 修复前端侧边栏无法平滑弹出的问题' (#196) from develop into v2
Deploy / deploy (push) Successful in 28s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/196
|
2026-06-22 12:55:43 +08:00 |
|
|
|
f08f547e76
|
Merge pull request 'fix: 修复前端侧边栏无法平滑弹出的问题' (#195) from fix/frontend into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/195
|
2026-06-22 12:55:24 +08:00 |
|
|
|
03a19befe1
|
fix: 修复前端侧边栏无法平滑弹出的问题
|
2026-06-22 12:53:09 +08:00 |
|
|
|
c4b68b77d1
|
Merge pull request 'fix: 修复空会话返回 null 导致前端崩溃的问题' (#194) from develop into v2
Deploy / deploy (push) Successful in 43s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/194
|
2026-06-22 12:40:37 +08:00 |
|
|
|
f2a883bda8
|
Merge pull request 'fix: 修复空会话返回 null 导致前端崩溃的问题' (#193) from fix/frontend into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/193
|
2026-06-22 12:40:18 +08:00 |
|
|
|
4cc0713459
|
fix: 修复空会话返回 null 导致前端崩溃的问题
## 问题描述
当用户创建新会话但未发送任何消息就切换到其他会话时,前端控制台报错:
"TypeError: Cannot read properties of null (reading 'map')"
根本原因:Go 后端未初始化的切片序列化为 JSON 时会变成 `null` 而非 `[]`,
前端尝试对 `null` 调用 `.map()` 导致崩溃。
## 修复方案
采用多层防御策略,同时修复后端和前端:
### 后端修复(确保 API 契约正确)
1. message_pg.go:93 - 将 `var messages []StoredMessage` 改为
`messages := make([]StoredMessage, 0)`,确保空结果序列化为 `[]`
2. conversation.go - 在两个响应路径(PG 查询 + 内存回退)添加防御性 nil 检查
### 前端防御(多层保护)
1. useSessionList.ts - 在 loadMessages 和 loadSessions 中添加 null 合并操作
`(res.data.messages || [])` 确保即使后端退化也不会崩溃
## 影响范围
- 所有空会话(新建后未发送消息的对话)现在可以正常切换
- API 响应符合 JSON 最佳实践(数组字段永远是 `[]` 而非 `null`)
|
2026-06-22 12:39:37 +08:00 |
|
|
|
2180751a9b
|
fix: 修复前端侧边栏双重展开动画问题
移除条件渲染和 CSS animation 的冲突,改用纯 CSS transition 控制显示/隐藏。
**问题根源:**
- 组件使用 `if (!open) return null;` 条件渲染,导致挂载时立即出现
- CSS 同时使用 `animation: slideInLeft`,触发从 -100% 的二次滑入
- 两个独立显示机制叠加,造成双重动画闪烁
**修复方案:**
- SessionSidebar: 移除条件渲染,始终保持 DOM 存在,通过动态 className 控制状态
- App.css: 移除 `animation` 和 `@keyframes`,改用 `transition: transform`
- 新增 `.sidebar--collapsed` / `.sidebar--open` 类控制 `translateX`
- 新增 `.sidebar-backdrop--visible` 类控制背景遮罩淡入淡出
- 添加 `pointer-events: none` 确保隐藏状态不响应交互
影响范围:
- frontend/src/components/SessionSidebar/index.tsx
- frontend/src/App.css
|
2026-06-22 12:05:54 +08:00 |
|
|
|
964c5c967e
|
Merge pull request 'fix: 修复前端侧边栏弹出异常问题' (#192) from develop into v2
Deploy / deploy (push) Successful in 47s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/192
|
2026-06-22 11:20:01 +08:00 |
|
|
|
dcd08d031c
|
Merge pull request 'fix: 修复前端侧边栏弹出异常问题' (#191) from fix/frontend into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/191
|
2026-06-22 11:19:34 +08:00 |
|
|
|
6bca4e0d47
|
fix: 修复前端侧边栏弹出异常问题
|
2026-06-22 11:15:41 +08:00 |
|
|
|
881c3f9853
|
Merge pull request 'fix: 修复前端 TypeScript 编译错误' (#190) from develop into v2
Deploy / deploy (push) Successful in 23s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/190
|
2026-06-22 00:30:00 +08:00 |
|
|
|
2881941be6
|
Merge pull request 'fix: 修复前端 TypeScript 编译错误' (#189) from fix/frontend into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/189
|
2026-06-22 00:29:42 +08:00 |
|
|
|
1b99d24fc1
|
fix: 修复前端 TypeScript 编译错误
- 移除 App.tsx 中未使用的 activeScenario 变量
- 修复 ChatPanel 中 ReactNode 的 type-only import
- 移除 ChatPanel 中未使用的 onSelectScenario 参数
修复 CI 构建失败问题
|
2026-06-22 00:28:59 +08:00 |
|
|
|
f9e68b96b9
|
Merge pull request 'refactor: 重构视频面板 UI,情景选择改为卡片网格,控制按钮改为 SVG 图标' (#188) from develop into v2
Deploy / deploy (push) Failing after 11s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/188
|
2026-06-22 00:14:16 +08:00 |
|
|
|
c58c6b59a5
|
Merge pull request 'refactor: 重构视频面板 UI,情景选择改为卡片网格,控制按钮改为 SVG 图标' (#187) from feat/stylechange into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/187
|
2026-06-22 00:13:44 +08:00 |
|
|
|
e24fb2cc19
|
refactor: 将情景图标和设备选择器的 emoji 统一替换为 SVG 图标
- 新增 scenarioIcons.tsx 提取情景图标渲染逻辑
- 情景芯片、设备选择器、警告提示等 emoji 全部改为 Feather-style SVG
- 调整 CSS 确保 SVG 图标居中对齐
|
2026-06-21 23:50:27 +08:00 |
|
|
|
7a705744d0
|
Merge pull request 'feat: 实现日志追踪链路' (#186) from develop into v2
Deploy / deploy (push) Successful in 29s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/186
|
2026-06-21 23:24:17 +08:00 |
|
|
|
583c33727a
|
Merge pull request 'feat: 实现日志追踪链路' (#185) from feature/log-track into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/185
|
2026-06-21 23:23:22 +08:00 |
|
|
|
6cbabb63bb
|
refactor: 情景选择从卡片网格改为横向滚动芯片条
- 将 scenario-picker 网格布局改为 scenario-strip 横向滚动芯片条
- 新增「新建情景」快捷入口芯片(+按钮)
- 新增 scenario.createChip 三语言翻译键
|
2026-06-21 23:23:22 +08:00 |
|
|
|
b4fbf8625b
|
Merge pull request 'feat: 实现摄像头和麦克风设备选择功能' (#184) from develop into v2
Deploy / deploy (push) Successful in 39s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/184
|
2026-06-21 23:21:35 +08:00 |
|
|
|
239f8f9877
|
docs: 同步限流和鉴权文档的日志实现说明
- 更新限流文档:limiter 内部使用 trace.FromContext 自动记录日志
- 更新鉴权文档:Redis 降级策略使用 trace-aware 日志
- 引用 13-日志追踪.md 作为详细说明
- 移除过时的手动 logger.Log 调用示例
|
2026-06-21 23:19:11 +08:00 |
|
|
|
d430e6e5b2
|
docs: 补充存储层和限流器日志实现说明
添加 PostgreSQL、Redis、限流器三个模块的日志实现文档:
- PostgreSQL 4 个 repository 的日志策略和代码示例
- Redis 会话存储、缓存装饰器、限流器的日志级别选择
- 存储层日志查询示例(数据库错误、Redis 降级)
- 更新架构图,添加存储层节点
|
2026-06-21 23:11:17 +08:00 |
|
|
|
edc66625ba
|
feat: 为 redis_bucket.go 添加限流日志
添加 trace-aware 日志:
- Error: Redis 限流检查失败(fail-open 降级)
- Warn: 限流触发,记录 key 和 retry_after_sec
|
2026-06-21 23:08:00 +08:00 |
|
|
|
9dce107a84
|
feat: 升级 cached_user.go 日志为 trace-aware
替换 logger.Log 为 trace.FromContext(ctx):
- SaveRefreshToken: Redis 缓存写入失败降级日志
- FindRefreshToken: Redis 缓存读取失败降级日志
- DeleteRefreshToken: Redis 缓存删除失败降级日志
- DeleteUserRefreshTokens: Redis 批量删除失败降级日志
|
2026-06-21 23:07:49 +08:00 |
|
|
|
1c7dd708a0
|
feat: 升级 session/redis.go 日志为 trace-aware
替换 logger.Log 为 trace.FromContext(ctx):
- CreateWithID: session 创建日志
- Get: session 获取日志(新增错误日志)
- UpdateConfig: 配置更新日志
- UpdateTitle: 标题更新日志
- GetHistory: 无效历史条目警告日志
- Destroy: session 销毁日志
|
2026-06-21 23:07:02 +08:00 |
|
|
|
d0e4bdaeec
|
feat: 为 PostgreSQL store 层添加 trace 日志
为 4 个 PostgreSQL repository 添加 trace-aware 日志:
- session_pg.go: Save/Find/Update/Delete 操作日志
- user_pg.go: 用户 CRUD 和 refresh token 管理日志
- message_pg.go: 消息存储和查询日志
- user_scenario_repository.go: 自定义情景 CRUD 日志
日志策略:
- Error: 数据库操作失败
- Debug: 操作成功(避免 Info 级别噪音)
- NotFound (ErrNoRows) 不记录错误日志
|
2026-06-21 23:06:50 +08:00 |
|
|
|
949a707e0f
|
refactor: 重构视频面板 UI,情景选择改为卡片网格,控制按钮改为 SVG 图标
- 情景选择从 ChatPanel header 下拉菜单迁移至视频面板下方卡片网格
- 摄像头/麦克风按钮改为圆形 SVG 图标按钮
- 识别/中断/停止按钮改为药丸形状 SVG 图标按钮
- 设备选择器改为水平布局,优化空间利用
- 移除 ChatPanel 空状态中重复的情景卡片
- .gitignore 忽略 .claudian/ 和笔记目录
|
2026-06-21 22:58:02 +08:00 |
|
|
|
55f7f183a7
|
docs: 完善日志追踪文档
|
2026-06-21 22:51:14 +08:00 |
|
|
|
6b4b033df3
|
feat: 日志级别优化(Phase 7)
- nodes_stt.go: STT 识别开始降为 Debug
- nodes_history.go: 历史组装完成降为 Debug
- nodes_tts.go: TTS 流中断降为 Debug
- 保持关键里程碑为 Info:query completed、tts synthesis started/completed
- 中间步骤详情降为 Debug,减少生产环境日志噪音
|
2026-06-21 22:37:23 +08:00 |
|
|
|
76d331c885
|
feat: Eino nodes 迁移到 trace 包(Phase 6.2)
- nodes_stt.go 使用 trace.FromContext 替换 logger.Log
- nodes_history.go 使用 trace.FromContext
- nodes_tts.go 使用 trace.FromContext
- nodes_done.go 使用 trace.FromContext
- 移除所有 nodes 中的 request_id 手动字段(自动附加)
- 所有日志消息改为英文
|
2026-06-21 22:36:15 +08:00 |
|
|
|
ad700743ef
|
feat: Eino adapter 和 callback 迁移到 trace 包(Phase 6.1)
- 移除 adapter.go 中的 ctxKeySessionID 定义
- 移除 callback.go 中的 ctxKeyRequestID 定义
- 统一使用 trace.WithSessionID/WithRequestID
- adapter.go 使用 trace.FromContext 替换 logger.Log
- callback.go 使用 trace.FromContext
- 移除双重日志,SetActiveRequest 失败直接返回错误
- 更新测试文件导入 trace 包
|
2026-06-21 22:33:49 +08:00 |
|
|
|
6ab4776e08
|
feat: WebSocket 追踪集成(Phase 5)
- 在 WebSocket 升级后生成连接级 trace_id
- 为每个 query 注入 request_id 到 context
- 使用 trace.FromContext 替换所有 logger.Log
- trace_id 贯穿整个 WebSocket 生命周期
- 自动附加 trace_id/session_id/request_id 到所有日志
|
2026-06-21 22:31:45 +08:00 |
|
|
|
c17798ec67
|
feat: 添加 HTTP 请求日志中间件(Phase 4)
实现内容:
- 创建 trace/gin_logger.go,实现 GinLogger 和 GinRecovery 中间件
- GinLogger 自动记录所有 HTTP 请求的 method/path/status/latency/client_ip
- GinRecovery 使用 zap 记录 panic 恢复信息,替代 gin.Recovery()
- 修改 main.go 注册三层中间件:TraceMiddleware -> GinLogger -> GinRecovery
- 所有日志自动附加 trace_id 和 request_id 字段
日志示例:
{
"level": "info",
"ts": "2026-06-21T22:26:07.610+0800",
"msg": "request completed",
"trace_id": "01KVN964KSY6BFDKB9S932NXB8",
"request_id": "01KVN964KSY6BFDKB9S932NXB8",
"method": "GET",
"path": "/api/health",
"status": 200,
"latency_ms": 0,
"client_ip": "::1"
}
测试:已验证健康检查接口日志正常输出
|
2026-06-21 22:26:43 +08:00 |
|
|
|
8a43f4406a
|
feat: 添加限流触发日志
|
2026-06-21 22:16:38 +08:00 |
|
|
|
065673fae2
|
feat: 添加会话接口日志(创建/销毁)
|
2026-06-21 22:15:53 +08:00 |
|
|
|
03c27e7790
|
feat: 添加对话接口错误日志(CRUD 操作)
|
2026-06-21 22:14:41 +08:00 |
|
|
|
0a59173476
|
feat: 添加 JWT 鉴权拒绝日志
|
2026-06-21 22:13:15 +08:00 |
|
|
|
939e43acd0
|
feat: 添加认证接口日志(登录/注册/刷新/登出)
|
2026-06-21 22:12:21 +08:00 |
|
|
|
87c3e7a8dd
|
refactor: OpenAI TTS 使用 trace.FromContext 支持追踪
|
2026-06-21 22:08:27 +08:00 |
|
|
|
d6e9555a97
|
refactor: MiMo TTS 使用 trace.FromContext 支持追踪
|
2026-06-21 22:08:00 +08:00 |
|
|
|
9c763ec12a
|
feat: Redis 会话历史解析错误日志截断保护
|
2026-06-21 22:06:10 +08:00 |
|
|
|
1bab02ae84
|
feat: OpenAI TTS 错误日志截断敏感文本
|
2026-06-21 22:05:35 +08:00 |
|
|
|
89d7b7c17c
|
feat: MiMo TTS 错误日志截断敏感文本
|
2026-06-21 22:05:13 +08:00 |
|
|
|
34d498510e
|
feat: STT 敏感文本降级为 Debug 并截断保护
|
2026-06-21 22:04:50 +08:00 |
|
|
|
104b28efd3
|
feat: 实现字符串截断工具函数用于敏感内容保护
|
2026-06-21 22:02:08 +08:00 |
|
|
|
a02a8bc374
|
feat: 实现 Gin trace 中间件生成并注入 trace ID
|
2026-06-21 22:01:50 +08:00 |
|
|
|
0d99d06f06
|
test: 验证 Eino Graph 正确传递 context.Value
|
2026-06-21 22:01:27 +08:00 |
|