feat: v2 版本 #206

Merged
huanghaosheng merged 201 commits from v2 into main 2026-06-22 16:01:28 +08:00

201 Commits

Author SHA1 Message Date
d640b5b41b Merge pull request 'docs: 优化首页 README 文档' (#205) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 18s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/205
2026-06-22 15:47:39 +08:00
a16628119a Merge pull request 'docs: 优化首页部分内容重复' (#204) from docs/readme into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/204
2026-06-22 14:50:11 +08:00
hhs
3888941f85 docs: 优化首页部分内容重复 2026-06-22 14:49:52 +08:00
0a816049fa Merge pull request 'docs: 优化首页 README 项目部署指南' (#203) from docs/readme into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/203
2026-06-22 14:43:34 +08:00
hhs
31c1720c00 docs: 优化首页 README 项目部署指南 2026-06-22 14:42:56 +08:00
c6093c01c1 Merge pull request 'docs: 优化首页 README' (#202) from docs/readme into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/202
2026-06-22 14:37:50 +08:00
hhs
3267f35edb docs: 优化首页 README 2026-06-22 14:37:32 +08:00
a309c269e0 Merge pull request 'docs: 完善首页 README 文件' (#201) from docs/readme into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/201
2026-06-22 14:36:20 +08:00
hhs
22930f0080 docs: 完善首页 README 文件 2026-06-22 14:35:53 +08:00
c00b8a83d9 Merge pull request 'fix: 优化侧栏弹出延迟问题' (#200) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 28s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/200
2026-06-22 13:17:18 +08:00
36007babcb Merge pull request 'fix: 优化侧栏弹出延迟问题' (#199) from fix/frontend into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/199
2026-06-22 13:16:59 +08:00
hhs
f01c84d89e fix: 优化侧栏弹出延迟问题 2026-06-22 13:16:31 +08:00
c3808ff38c Merge pull request 'fix: 修复“设置”侧栏双重展开的问题' (#198) from develop into v2
All checks were successful
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
hhs
69b9694cfe fix: 修复“设置”侧栏双重展开的问题 2026-06-22 13:02:05 +08:00
70ee212ea2 Merge pull request 'fix: 修复前端侧边栏无法平滑弹出的问题' (#196) from develop into v2
All checks were successful
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
hhs
03a19befe1 fix: 修复前端侧边栏无法平滑弹出的问题 2026-06-22 12:53:09 +08:00
c4b68b77d1 Merge pull request 'fix: 修复空会话返回 null 导致前端崩溃的问题' (#194) from develop into v2
All checks were successful
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
hhs
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
hhs
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
All checks were successful
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
hhs
6bca4e0d47 fix: 修复前端侧边栏弹出异常问题 2026-06-22 11:15:41 +08:00
881c3f9853 Merge pull request 'fix: 修复前端 TypeScript 编译错误' (#190) from develop into v2
All checks were successful
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
hhs
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
Some checks failed
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
All checks were successful
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
All checks were successful
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
hhs
239f8f9877 docs: 同步限流和鉴权文档的日志实现说明
- 更新限流文档:limiter 内部使用 trace.FromContext 自动记录日志
- 更新鉴权文档:Redis 降级策略使用 trace-aware 日志
- 引用 13-日志追踪.md 作为详细说明
- 移除过时的手动 logger.Log 调用示例
2026-06-21 23:19:11 +08:00
hhs
d430e6e5b2 docs: 补充存储层和限流器日志实现说明
添加 PostgreSQL、Redis、限流器三个模块的日志实现文档:
- PostgreSQL 4 个 repository 的日志策略和代码示例
- Redis 会话存储、缓存装饰器、限流器的日志级别选择
- 存储层日志查询示例(数据库错误、Redis 降级)
- 更新架构图,添加存储层节点
2026-06-21 23:11:17 +08:00
hhs
edc66625ba feat: 为 redis_bucket.go 添加限流日志
添加 trace-aware 日志:
- Error: Redis 限流检查失败(fail-open 降级)
- Warn: 限流触发,记录 key 和 retry_after_sec
2026-06-21 23:08:00 +08:00
hhs
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
hhs
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
hhs
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
hhs
55f7f183a7 docs: 完善日志追踪文档 2026-06-21 22:51:14 +08:00
hhs
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
hhs
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
hhs
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
hhs
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
hhs
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
hhs
8a43f4406a feat: 添加限流触发日志 2026-06-21 22:16:38 +08:00
hhs
065673fae2 feat: 添加会话接口日志(创建/销毁) 2026-06-21 22:15:53 +08:00
hhs
03c27e7790 feat: 添加对话接口错误日志(CRUD 操作) 2026-06-21 22:14:41 +08:00
hhs
0a59173476 feat: 添加 JWT 鉴权拒绝日志 2026-06-21 22:13:15 +08:00
hhs
939e43acd0 feat: 添加认证接口日志(登录/注册/刷新/登出) 2026-06-21 22:12:21 +08:00
hhs
87c3e7a8dd refactor: OpenAI TTS 使用 trace.FromContext 支持追踪 2026-06-21 22:08:27 +08:00
hhs
d6e9555a97 refactor: MiMo TTS 使用 trace.FromContext 支持追踪 2026-06-21 22:08:00 +08:00
hhs
9c763ec12a feat: Redis 会话历史解析错误日志截断保护 2026-06-21 22:06:10 +08:00
hhs
1bab02ae84 feat: OpenAI TTS 错误日志截断敏感文本 2026-06-21 22:05:35 +08:00
hhs
89d7b7c17c feat: MiMo TTS 错误日志截断敏感文本 2026-06-21 22:05:13 +08:00
hhs
34d498510e feat: STT 敏感文本降级为 Debug 并截断保护 2026-06-21 22:04:50 +08:00
hhs
104b28efd3 feat: 实现字符串截断工具函数用于敏感内容保护 2026-06-21 22:02:08 +08:00
hhs
a02a8bc374 feat: 实现 Gin trace 中间件生成并注入 trace ID 2026-06-21 22:01:50 +08:00
hhs
0d99d06f06 test: 验证 Eino Graph 正确传递 context.Value 2026-06-21 22:01:27 +08:00
hhs
8b18953010 feat: 实现 context-aware logger 自动附加 trace 字段 2026-06-21 22:00:32 +08:00
hhs
0108ef2064 feat: 实现 trace context 注入与提取功能 2026-06-21 22:00:12 +08:00
hhs
e0dc8272a5 feat: 实现并发安全的 ULID trace ID 生成器 2026-06-21 21:59:43 +08:00
hhs
11c3955bd6 feat: 添加 ULID 依赖用于 trace ID 生成 2026-06-21 21:59:16 +08:00
hhs
a66ab764d9 docs: 统一文档风格 2026-06-21 19:31:17 +08:00
hhs
51117b43f6 fix: 修复 handler_test.go 中 ServeWS 缺少参数 2026-06-21 18:44:03 +08:00
hhs
492fb06c08 merge: 合并 feat/tokentime 到 develop,解决 limiter/scenarioRepo 参数冲突 2026-06-21 17:42:48 +08:00
6967dd7b2e feat: 实现摄像头和麦克风设备选择功能
- 新增 useDeviceList hook,枚举音视频输入设备并监听热插拔
- CameraManager/MicManager 的 startCamera/startMic 支持可选 deviceId 参数
- useVisionSession 集成设备选择:授权后自动枚举、切换设备时热重启
- 连接后显示设备下拉选择器,未连接时隐藏(避免未授权时空列表)
- SessionConfig 新增 cameraDeviceId/micDeviceId 持久化到 localStorage
2026-06-21 16:49:48 +08:00
eea5c07eaa refactor: 删除实时分析/按需识别/纯聊天三种模式切换
三种模式仅为前端 UI 区分,后端无感知,实际使用中价值不大:
- 纯聊天模式名不副实(VAD 仍附带摄像头帧)
- 实时分析增加 API 成本且体验不佳
- 按需识别已是默认且最自然的交互方式

删除后保留按需识别行为:语音带图 + 手动识别按钮,UI 更简洁。
2026-06-21 16:24:09 +08:00
1079e22699 feat: 实现自建情景功能
## 功能概述
- 用户可创建、编辑、删除自定义情景
- 支持自定义情景名称、图标、描述、Prompt、首句引导
- 完整的权限隔离,用户只能管理自己的情景
- 深度集成 Eino 框架,动态加载自建情景 Prompt

## 后端实现
### 数据库
- 新增 user_scenarios 表
- 支持用户配额(最多 20 个)
- 字段验证:description 可选,prompt 最小 10 字符

### API
- GET /api/scenarios - 获取用户情景列表
- POST /api/scenarios - 创建情景
- GET /api/scenarios/:id - 获取详情
- PATCH /api/scenarios/:id - 更新情景
- DELETE /api/scenarios/:id - 删除情景

### Eino 集成
- PipelineState 添加 UserID 字段
- nodes_history 动态加载用户自建情景
- GetScenarioPrompt 支持自建情景优先级

## 前端实现
### 组件
- CreateScenarioModal - 创建情景对话框
- EditScenarioModal - 编辑情景对话框
- ConfigPanel 改造 - 分组显示系统预置和自建情景

### Hook
- useScenarios - 合并系统和自建情景,提供 CRUD 接口

### 国际化
- 中文、英文、日文翻译支持

## 问题修复
- 修复 CORS 问题:使用 Vite 代理
- 统一验证规则:description 可选,prompt 最小 10 字符
- 修复数据库约束:使用 NULLIF 处理空字符串

## 文件变更
新增文件: 13 个
修改文件: 14 个

详见文档: docs/自建情景功能完整文档.md
2026-06-21 15:38:28 +08:00
ad5d90e344 Merge pull request 'docs: 重构文档结构,规范编号并整合冗余内容' (#182) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 26s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/182
2026-06-21 14:52:06 +08:00
c094fe0867 Merge pull request 'docs: 重构文档结构,规范编号并整合冗余内容' (#181) from docs/sync-docs into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/181
2026-06-21 14:50:59 +08:00
hhs
032de796c8 docs: 重构文档结构,规范编号并整合冗余内容
## 主要变更

### 文档重构(减少 1199 行,-23%)
- 01-架构设计.md: 503→369 行 (-27%),删除 DDL/配置示例,精简鉴权/存储描述
- 02-接口文档.md: 1313→570 行 (-57%),删除 Go 接口/Orchestrator 实现/配置管理
- 07-成本控制.md: 65→59 行 (-9%),代码块替换为文件引用

### 文档编号规范化
- 08-功能创意.md → 删除(内容整合到 README.md "功能扩展方向")
- 10-Eino框架与编排设计.md → 08-Eino框架与编排设计.md
- 情景切换.md → 09-情景切换.md
- 12-鉴权体系.md → 10-鉴权体系.md
- 13-令牌桶限流.md → 11-令牌桶限流.md

### 交叉引用更新
- 01-架构设计.md: 更新对鉴权体系/令牌桶限流的引用为新编号
- README.md: 更新文档索引表、推荐阅读顺序、新增功能扩展方向

### 删除过时文档
- 09-技术名词解释.md(内容已整合到 03-技术选型.md)
- 10-Eino重构方案.md(历史记录,已完成)
- 11-Eino框架技术文档.md(已合并到 08)
- 情景切换功能完整文档.md(已规范化为 09)

## 重构原则
- 架构文档聚焦系统结构,移除实现细节
- 接口文档保留纯契约,删除内部实现
- 编号连续(01-11),语义清晰
- 通过交叉引用连接相关文档,避免重复
2026-06-21 14:48:03 +08:00
8b4acb3ce7 Merge pull request 'docs: 统一更新配置文件路径引用' (#180) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 28s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/180
2026-06-21 13:32:20 +08:00
9e5f691056 Merge pull request 'docs: 统一更新配置文件路径引用' (#179) from feature/ratelimit into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/179
2026-06-21 13:32:03 +08:00
hhs
03127aa01a docs: 统一更新配置文件路径引用
将文档中所有 config.yaml 的路径引用更新为 backend/config/config.yaml,
与实际的配置文件组织结构保持一致。

变更文件:
- README.md: 更新配置文件位置说明
- docs/02-接口文档.md: 更新配置文件路径
- docs/13-令牌桶限流设计.md: 更新配置示例路径
2026-06-21 13:31:11 +08:00
hhs
99fcd6bc29 fix: 修复 Dockerfile 配置文件路径 2026-06-21 13:27:29 +08:00
d0f5f5c94d Merge pull request 'feat: 集成限流器到服务' (#178) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 4s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/178
2026-06-21 13:25:06 +08:00
361c5d07d3 Merge pull request 'docs: 规范文档对跨域处理的介绍' (#177) from feature/ratelimit into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/177
2026-06-21 13:11:16 +08:00
hhs
910e71b6f0 docs: 规范文档对跨域处理的介绍 2026-06-21 13:10:48 +08:00
19645be04e Merge pull request 'feat: 集成限流器到服务' (#176) from feature/ratelimit into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/176
2026-06-21 12:48:04 +08:00
hhs
d53265755a refactor: 移除生产环境配置文件中 CORS 配置 2026-06-21 12:39:33 +08:00
hhs
252cdcc8e7 refactor: 开发环境使用与生产环境相同的 AI 模型配置
- config.dev.yaml 补全 AI 服务配置(provider、model、endpoint)
- 保持开发环境超时时间较长(方便调试)
- 确保开发和生产环境使用相同的模型,避免环境差异导致的问题
2026-06-21 12:24:20 +08:00
hhs
515d7ae034 docs: 完善配置环境切换机制
- docker-compose.yml 添加 APP_ENV=prod 强制生产环境
- 更新 .env.example 的 APP_ENV 注释说明(开发/生产差异)
- CLAUDE.md 补充"配置环境切换"章节,说明本地开发和生产部署的配置切换方式
- 明确配置优先级:环境变量 > config.{env}.yaml > config.yaml > 默认值

配置差异:
- 开发环境:debug 日志、关闭限流、允许所有 CORS
- 生产环境:info/json 日志、启用限流、严格 CORS 白名单

验证通过:
- 本地开发:默认加载 config.dev.yaml(env=dev, debug 日志)
- 生产配置:APP_ENV=prod 加载 config.prod.yaml(env=prod, info 日志)
2026-06-21 01:14:29 +08:00
hhs
311330cea1 refactor: 重组配置文件到 config 目录
- 创建 backend/config/ 目录统一管理配置文件
- 移动 config.yaml 到 config/config.yaml
- 新增 config.dev.yaml 开发环境配置(debug 日志、关闭限流)
- 新增 config.prod.yaml 生产环境配置(info 日志、启用限流、严格 CORS)
- 更新配置加载逻辑,优先从 config/ 目录读取,兼容旧路径
- 更新 .gitignore,仅排除 .env,配置文件纳入版本控制
2026-06-21 01:07:47 +08:00
hhs
7adf81c6e5 feat: 集成限流器到服务
- main.go 初始化限流器(根据 Redis 可用性选择内存/Redis 实现)
- WebSocket handler 添加 query 消息限流(按 userID)
- Auth API 添加登录/注册限流(按 IP)
- refresh 和 logout 不限流(避免影响正常用户操作)
- 修复所有测试(传递 nil limiter 参数)
- 所有测试通过(包括 ws 和 api 集成测试)
2026-06-21 00:00:24 +08:00
hhs
ea00939c13 feat: 实现 Gin 限流中间件
- Middleware 函数返回 Gin 中间件
- keyFunc 参数支持灵活提取限流 key(IP/用户 ID 等)
- 限流触发时返回 HTTP 429 + Retry-After header
- 支持 nil limiter(跳过限流)和空 key(跳过限流)
- 完整单元测试(6 个测试用例,全部通过)
- 测试覆盖:允许、拒绝、nil limiter、空 key、keyFunc、Retry-After 舍入
2026-06-20 23:56:44 +08:00
hhs
b74fb3564d feat: 实现 Redis 令牌桶限流器
- RedisLimiter 基于 Lua 脚本保证原子性
- Lua 脚本实现完整令牌桶算法(填充、消耗、TTL)
- fail-open 策略:Redis 故障时允许请求通过
- FormatKey 辅助函数格式化限流 key
- 完整单元测试(10 个测试用例,使用 miniredis)
- 测试覆盖:首次请求、耗尽、不同用户、补充、容量上限、零速率、TTL、故障降级
2026-06-20 23:55:37 +08:00
hhs
3b6226394b feat: 实现内存令牌桶限流器
- Limiter 接口定义(Allow + Stop 方法)
- TokenBucket 实现(容量、填充速率、并发安全)
- MemoryLimiter 管理多用户令牌桶
- 后台 goroutine 定期清理不活跃桶(10 分钟)
- 完整单元测试覆盖(11 个测试用例,全部通过)
- 边界情况处理(rate=0、capacity=0、并发安全)
2026-06-20 23:53:36 +08:00
hhs
a6df8c9131 feat: 添加限流配置层
- Config 结构体新增 RateLimit 字段
- 新增 RateLimitConfig 和 BucketConfig 结构体定义
- config.yaml 新增 ratelimit 配置段(默认关闭)
- 设置默认值:query(10/0.2)、login(5/0.1)、register(3/0.05)
2026-06-20 23:51:45 +08:00
023c834074 Merge pull request 'feat:部署修改' (#175) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 28s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/175
2026-06-20 23:38:29 +08:00
3e00e39e8a Merge pull request 'feat:部署修改' (#174) from feat/tokentime into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/174
2026-06-20 23:36:33 +08:00
9ad486d117 feat:部署修改 2026-06-20 23:35:13 +08:00
6af26ffc91 Merge pull request 'feat: 优化情景切换功能' (#173) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 29s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/173
2026-06-20 23:28:37 +08:00
7ee6918015 Merge pull request 'feat: 优化情景切换功能' (#172) from feat/tokentime into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/172
2026-06-20 23:26:28 +08:00
2fb23852ef feat: 优化情景切换功能 2026-06-20 23:24:32 +08:00
ed95ce56a8 fix: 关闭摄像头后文本输入不再发送图像数据
修复了用户关闭摄像头后,使用文本输入时 AI 仍会分析黑色画面的问题。

变更:
- sendTextMessage: 只在摄像头开启时捕获画面
- 待发消息队列: 根据摄像头状态决定是否携带画面

效果:
- 摄像头关闭时纯文本对话,不提及画面
- 节省 token 消耗和网络带宽

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 22:21:03 +08:00
e151c5b665 Merge pull request 'fix: apk 使用阿里云镜像 mirrors.aliyun.com 加速下载' (#171) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 42s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/171
2026-06-20 22:04:05 +08:00
dffd8bd4a5 Merge pull request 'fix: apk 使用阿里云镜像 mirrors.aliyun.com 加速下载' (#170) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/170
2026-06-20 22:03:49 +08:00
hhs
3140a660e4 fix: apk 使用阿里云镜像 mirrors.aliyun.com 加速下载 2026-06-20 22:02:30 +08:00
23e0e22a12 Merge pull request 'fix: CI 环境安装 rsync + docker-cli + docker-cli-compose' (#169) from develop into v2
Some checks failed
Deploy / deploy (push) Has been cancelled
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/169
2026-06-20 21:47:57 +08:00
ba7c5ed5ea Merge pull request 'fix: CI 环境安装 rsync + docker-cli + docker-cli-compose' (#168) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/168
2026-06-20 21:47:45 +08:00
hhs
cc7a333b6d fix: CI 环境安装 rsync + docker-cli + docker-cli-compose 2026-06-20 21:46:25 +08:00
f8af2f0ccc Merge pull request 'fix: git clone 前清理残留的 /tmp/camtalk-deploy 目录' (#167) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 3m57s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/167
2026-06-20 21:39:17 +08:00
d6059ae397 Merge pull request 'fix: git clone 前清理残留的 /tmp/camtalk-deploy 目录' (#166) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/166
2026-06-20 21:39:02 +08:00
hhs
d4398e55fe fix: git clone 前清理残留的 /tmp/camtalk-deploy 目录 2026-06-20 21:38:30 +08:00
f5440c9e2d Merge pull request 'fix: 添加 rsync 安装,避免首次部署时 command not found' (#165) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 4m2s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/165
2026-06-20 21:33:39 +08:00
190f40908f Merge pull request 'fix: 添加 rsync 安装,避免首次部署时 command not found' (#164) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/164
2026-06-20 21:33:23 +08:00
hhs
ddb90c58ef fix: 添加 rsync 安装,避免首次部署时 command not found 2026-06-20 21:32:57 +08:00
340c26b7a6 Merge pull request 'fix: 统一使用 /opt/camtalk/.env 路径,act_runner 挂载宿主机目录后直接读取' (#163) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 1s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/163
2026-06-20 21:32:05 +08:00
ca07188eda Merge pull request 'fix: 统一使用 /opt/camtalk/.env 路径,act_runner 挂载宿主机目录后直接读取' (#162) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/162
2026-06-20 21:31:49 +08:00
hhs
15a50f855b fix: 统一使用 /opt/camtalk/.env 路径,act_runner 挂载宿主机目录后直接读取 2026-06-20 21:30:21 +08:00
e37dc7074d chore: 首页代码仓库链接改为 Gitea 地址 2026-06-20 21:12:06 +08:00
f86c2560cd Merge pull request 'fix: env_file 使用绝对路径 /root/camtalk/.env,确保 CI 容器内 docker compose 正确解析' (#161) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 12s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/161
2026-06-20 20:58:51 +08:00
90c5ad7724 Merge pull request 'fix: env_file 使用绝对路径 /root/camtalk/.env,确保 CI 容器内 docker compose 正确解析' (#160) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/160
2026-06-20 20:58:34 +08:00
hhs
45e2c4f37b fix: env_file 使用绝对路径 /root/camtalk/.env,确保 CI 容器内 docker compose 正确解析 2026-06-20 20:57:34 +08:00
b7d0edb6da Merge pull request 'docs: 更新架构设计和令牌桶限流相关文档' (#159) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 13s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/159
2026-06-20 20:54:51 +08:00
159bf278e6 Merge pull request 'docs: 添加令牌桶限流模块设计文档' (#158) from feature/ratelimite into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/158
2026-06-20 20:36:21 +08:00
542126df90 Merge pull request 'docs:更新文档' (#157) from feat/historychat into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/157
2026-06-20 20:20:59 +08:00
e56600e408 docs:更新文档 2026-06-20 20:17:16 +08:00
04215e7a53 Merge pull request 'feat: 优化对话历史功能、增加首页登录页面' (#156) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 32s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/156
2026-06-20 20:11:34 +08:00
9ba4eb4825 Merge pull request 'feat: 优化对话历史功能、增加首页登录页面' (#155) from feat/historychat into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/155
2026-06-20 20:06:39 +08:00
bc7eb7409c Merge pull request 'fix: 通过 docker run -v 桥接同步 /opt/camtalk/.env,每次部署自动获取最新配置' (#154) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 2m52s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/154
2026-06-20 20:05:28 +08:00
0a8a20f3f8 Merge pull request 'fix: 通过 docker run -v 桥接同步 /opt/camtalk/.env,每次部署自动获取最新配置' (#153) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/153
2026-06-20 20:05:11 +08:00
hhs
e20f58b4ae fix: 通过 docker run -v 桥接同步 /opt/camtalk/.env,每次部署自动获取最新配置 2026-06-20 20:04:46 +08:00
ab07e01adf feat: 优化对话历史功能 2026-06-20 19:57:36 +08:00
0447fdacac Merge pull request 'fix: git fetch 改用公网 URL 而非 origin,避免 Docker 内网地址不可达导致卡死' (#152) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 15s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/152
2026-06-20 19:48:04 +08:00
12cf59f1e8 Merge pull request 'fix: git fetch 改用公网 URL 而非 origin,避免 Docker 内网地址不可达导致卡死' (#150) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/150
2026-06-20 19:47:28 +08:00
hhs
4f735e6d29 fix: git fetch 改用公网 URL 而非 origin,避免 Docker 内网地址不可达导致卡死 2026-06-20 19:45:56 +08:00
32aea44f3b Merge pull request 'fix: env_file 改为相对路径,解决 CI 容器无法读取 /opt/camtalk/.env 的问题' (#149) from develop into v2
Some checks failed
Deploy / deploy (push) Has been cancelled
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/149
2026-06-20 19:31:24 +08:00
4d51bcefb0 Merge pull request 'fix: env_file 改为相对路径,解决 CI 容器无法读取 /opt/camtalk/.env 的问题' (#148) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/148
2026-06-20 19:31:10 +08:00
hhs
fe5ac20a1f fix: env_file 改为相对路径,解决 CI 容器无法读取 /opt/camtalk/.env 的问题 2026-06-20 19:29:12 +08:00
2a13ee9c89 Merge pull request 'fix: 精简 deploy.yml,checkout + ref + verify 三步确保拉取正确分支' (#147) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 2m12s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/147
2026-06-20 17:50:25 +08:00
df35ff73b5 Merge pull request 'fix: 精简 deploy.yml,checkout + ref + verify 三步确保拉取正确分支' (#146) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/146
2026-06-20 17:50:08 +08:00
hhs
92e6636d05 fix: 精简 deploy.yml,checkout + ref + verify 三步确保拉取正确分支 2026-06-20 17:49:36 +08:00
hhs
12e2d24f37 fix: checkout 后显式 git fetch 切换触发分支,避免始终部署 main 代码;Dockerfile 添加 BuildKit cache mount 加速构建 2026-06-20 17:43:32 +08:00
ae100c4a75 Merge pull request 'fix: 恢复 checkout action 拉取代码,仅添加 ref 参数指定触发分支' (#145) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 2m10s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/145
2026-06-20 17:35:46 +08:00
4a5905307c Merge pull request 'fix: 恢复 checkout action 拉取代码,仅添加 ref 参数指定触发分支' (#144) from fix/actions into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/144
2026-06-20 17:35:30 +08:00
2a7d4c74d4 feat:增加首页登录页面 2026-06-20 17:35:14 +08:00
hhs
6bb4773e07 fix: 恢复 checkout action 拉取代码,仅添加 ref 参数指定触发分支 2026-06-20 17:33:59 +08:00
97e125234b Merge pull request 'fix: 完善鉴权模块,修复 CI/CD 中 dubious ownership 错误' (#143) from develop into v2
Some checks failed
Deploy / deploy (push) Has been cancelled
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/143
2026-06-20 17:24:06 +08:00
hhs
39073b7673 fix: 添加 git safe.directory 配置,修复 CI/CD 中 dubious ownership 错误 2026-06-20 17:21:40 +08:00
hhs
85d47c1fc4 docs: 添加令牌桶限流模块设计文档
- 新建 docs/13-令牌桶限流设计.md,覆盖算法原理、内存/Redis 双实现、配置设计、接入点、测试用例等
- 更新 docs/01-架构设计.md Rate Limiter 模块行链接至新文档
- 更新 docs/README.md 文档索引和推荐阅读顺序
2026-06-20 17:08:23 +08:00
hhs
4ff8cec312 docs: 添加鉴权体系设计文档,更新认证相关文档
- 新增 12-鉴权体系设计.md,详细描述 JWT 双 token 轮转认证机制
- 更新架构设计文档,补充认证设计章节的安全机制和配置说明
- 更新接口文档,补充 Refresh Token Rotation 安全机制和前端集成示例
- 更新文档索引,添加新文档的推荐阅读顺序
2026-06-20 16:51:03 +08:00
3572b867c0 Merge pull request 'feat: 完善鉴权模块' (#142) from fix/auth into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/142
2026-06-20 16:34:47 +08:00
dfed964f76 Merge pull request 'fix: CI/CD 改用 git clone 直接拉取代码,避免 rsync 同步失败' (#141) from develop into v2
Some checks failed
Deploy / deploy (push) Has been cancelled
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/141
2026-06-20 16:25:23 +08:00
hhs
4651ae185b fix: CI/CD 改用 git clone 直接拉取代码,避免 rsync 同步失败 2026-06-20 16:23:59 +08:00
1c65433d40 Merge pull request 'fix: checkout 指定触发分支,避免始终拉取 main 代码' (#140) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 16s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/140
2026-06-20 15:51:41 +08:00
hhs
590c4592ea fix: checkout 指定触发分支,避免始终拉取 main 代码 2026-06-20 15:51:14 +08:00
15cd157f45 Merge pull request 'feat: 对话场景优化' (#139) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 24s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/139
2026-06-20 15:18:38 +08:00
hhs
970f10a274 fix: 修复前端 lint 错误 — 移除 ref 模式,用 useEffect 依赖注入回调
- api.ts: 移除 catch 中未使用的 err 变量
- auth.tsx: 去掉 useRef 模式,直接在 useEffect 中注册回调并声明依赖
2026-06-20 15:07:09 +08:00
hhs
d78cdb509d feat: 前端 401 拦截器 — access token 过期时自动刷新并重试原请求
api.ts:
- 增加 setAuthCallbacks 回调注入机制(避免 api/auth 循环依赖)
- request() 对非公开路径自动附加 Authorization header
- 收到 401 时自动触发 refresh token 刷新,成功后重试原请求
- 并发保护:多个 401 只触发一次 refresh,其余等待同一 Promise
- refreshTokenDirect 内部方法绕过 401 拦截避免递归

auth.tsx:
- 用 ref 保存 persistAuth/scheduleRefresh 最新引用(避免闭包陈旧)
- 初始化时调用 setAuthCallbacks 注入认证回调
2026-06-20 14:57:27 +08:00
hhs
ea70d2efc6 feat: main.go 注入 Redis 到 CachedUserRepository,启用 refresh token 二级缓存
- 将 rdb 变量提升到外层作用域,供 session 和 auth 共用
- Redis 启用时用 CachedUserRepository 包装 userRepo
- backfillTTL 使用 cfg.Auth.RefreshTTL 与 token 实际过期时间一致
2026-06-20 14:54:08 +08:00
hhs
a2a28a9f56 feat: CachedUserRepository — refresh token 的 Redis 缓存装饰器
- 装饰 UserRepository,仅缓存 refresh token 相关操作
- SaveRefreshToken: Write-Through,先写 DB 再写 Redis(SET + SADD)
- FindRefreshToken: Read-Through,Redis miss 时查 DB 并回填
- DeleteRefreshToken: 双删 DB + Redis
- DeleteUserRefreshTokens: 通过 Redis Set 批量清理缓存后删 DB
- Redis 操作失败时降级到纯 DB,不阻断主流程
2026-06-20 14:53:10 +08:00
hhs
898e30b526 feat: Refresh Token 复用检测 — 检测到已 rotation 的 token 被复用时吊销用户全部 refresh token
- Refresh 方法中 FindRefreshToken 返回 not found 时,检查 JWT 是否有效
- JWT 有效但 DB 不存在 → 判定为复用,调用 DeleteUserRefreshTokens 吊销该用户所有 token
- 增加 TestRefresh_ReuseDetectedRevokesAllTokens 测试覆盖复用场景
2026-06-20 14:51:34 +08:00
hhs
87c54b80c0 feat: JWT Claims 增加 TokenType 字段,ValidateAccess/ValidateRefresh 区分校验类型
- Claims 新增 TokenType 字段("access" / "refresh")
- GeneratePair 为 access/refresh token 分别设置 token_type
- ValidateAccess 校验后检查 token_type == "access"
- ValidateRefresh 校验后检查 token_type == "refresh"
- 增加 token 类型交叉校验测试
2026-06-20 14:50:19 +08:00
7288f443f1 Merge pull request 'feat: 对话场景优化' (#138) from fea/models into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/138
2026-06-20 14:49:22 +08:00
488b1e62ba docs: 更新前端三态会话模型,新增结束视频保留对话设计文档 2026-06-20 14:47:25 +08:00
50c84fce88 fix: 修复新对话首次打字出现两个输入框
根因:sendTextMessage 断开状态时立即 setMessages 添加用户消息到 UI,
同时 connect() 触发连接成功后 flush useEffect 再次 setMessages 添加同一条消息,
导致消息重复、ChatPanel 渲染出两个输入区域。

修复:断开状态时只入队不立即显示,由 flush 统一处理。
2026-06-20 14:32:40 +08:00
ae09fba400 fix: 修复聊天输入框 flex 布局导致重复渲染
- chat-input__field 增加 min-width: 0 防止 flex 项溢出
- chat-input__send 增加 flex-shrink: 0 防止按钮被挤压换行
2026-06-20 14:24:52 +08:00
f8a79a3b0b fix: 修复文字对话态误显「正在初始化语音检测」
ChatPanel VAD 初始化提示条件增加 isCameraOn 判断,
视频结束后不再显示语音检测初始化提示。
2026-06-20 14:04:20 +08:00
ae9a27c300 feat: 结束视频后保留对话,支持继续文字聊天
- useVisionSession 新增 stopVideo 回调(停媒体流,保持连接和消息)
- App.tsx 控制区从二态改为三态(initial/video/textOnly)
- 文字对话态显示「重新开始视频」和「结束会话」按钮
- 新增 CSS 样式(video-ended-hint、btn--outline)
- 新增 i18n key(stopVideo/endSession/resumeVideo/video.ended)
- 新增设计方案文档
2026-06-20 13:48:26 +08:00
1f7cd407a8 Merge pull request 'fix: CI 环境安装 rsync 依赖' (#137) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 1m56s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/137
2026-06-20 13:37:27 +08:00
6f81212997 Merge pull request 'fix: CI 环境安装 rsync 依赖' (#136) from fix/config into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/136
2026-06-20 13:37:14 +08:00
hhs
402ad8c949 fix: CI 环境安装 rsync 依赖 2026-06-20 13:36:44 +08:00
52015fa6c6 Merge pull request 'fix: CI/CD 部署固定到 /root/camtalk 目录,确保 compose 能正确管理容器生命周期' (#135) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 4s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/135
2026-06-20 13:34:50 +08:00
97706ea197 Merge pull request 'fix: CI/CD 部署固定到 /root/camtalk 目录,确保 compose 能正确管理容器生命周期' (#134) from fix/config into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/134
2026-06-20 13:33:59 +08:00
hhs
d53de4f33f fix: CI/CD 部署固定到 /root/camtalk 目录,确保 compose 能正确管理容器生命周期 2026-06-20 13:33:05 +08:00
3dc2015a91 docs: 更新技术文档,同步 Eino 重构和默认 provider 变更
- 架构设计:更新为 Eino Graph 声明式编排,增加三级存储架构说明
- 接口文档:AI 编排器章节重写为 Eino Graph,更新 LLM 服务接口
- 技术选型:新增 Eino 框架选型章节,修正 STT/LLM/TTS 默认方案
- 语音交互:Pipeline 描述改为 Eino Graph
- 成本控制:模型引用修正为 qwen3-vl-plus
- 技术名词解释:新增 Eino 框架相关术语
- README:增加 10/11/12 Eino 文档索引
- 10-Eino重构方案:状态更新为已实施
- CLAUDE.md:同步所有变更
2026-06-20 13:24:53 +08:00
de78d60959 Merge pull request 'refactor: 用 Eino 框架重构编排层' (#133) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 2m4s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/133
2026-06-20 12:01:03 +08:00
93d5a90495 Merge pull request 'ci: deploy 工作流增加 main 分支触发' (#132) from fix/redis-use into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/132
2026-06-20 11:59:35 +08:00
hhs
5910e02a66 ci: deploy 工作流增加 main 分支触发 2026-06-20 11:59:07 +08:00
88ee1e2548 Merge pull request 'fix: 修复 TieredManager 创建 session 时 L1/L2 ID 不一致导致 Redis 写入失败的问题' (#131) from fix/redis-use into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/131
2026-06-20 11:55:43 +08:00
hhs
b8fd6a9330 fix: 修复 TieredManager 创建 session 时 L1/L2 ID 不一致导致 Redis 写入失败的问题 2026-06-20 11:54:21 +08:00
c2c9a6d392 Merge pull request 'fix: 统一 docker-compose 环境变量注入方式,修复 postgres/redis 配置读取问题' (#130) from feature/add-redis-docker into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/130
2026-06-20 00:28:18 +08:00
795ace75d6 Merge pull request 'fix: 统一 docker-compose 环境变量注入方式,修复 postgres/redis 配置读取问题' (#129) from feature/add-redis-docker into v2
All checks were successful
Deploy / deploy (push) Successful in 16s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/129
2026-06-20 00:27:20 +08:00
hhs
dd846876ba fix: 统一 docker-compose 环境变量注入方式,修复 postgres/redis 配置读取问题
- postgres 和 redis 服务添加 env_file,统一从 /opt/camtalk/.env 读取配置
- 移除 postgres 中多余的 ${POSTGRES_USER/PASSWORD} 透传(env_file 已直接注入)
- 移除 backend 中多余的 CAMTALK_STORAGE_DSN 和 CAMTALK_REDIS_PASSWORD 透传
- postgres healthcheck 改用 $$POSTGRES_USER(容器内 shell 变量)替代 ${POSTGRES_USER}(compose 变量替换)
- 根本原因:environment 中的 ${VAR} 在 compose 解析时读取 shell 环境,为空时会覆盖 env_file 的值
2026-06-20 00:26:03 +08:00
898d1474ec Merge pull request 'feat: 重构用eino框架' (#128) from fea/newcode into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/128
2026-06-19 23:28:55 +08:00
582f68f68b Merge pull request 'fix: 修复 Dockerfile 运行阶段缺少 config.yaml 导致容器启动 panic' (#127) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 15s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/127
2026-06-19 23:24:45 +08:00
7d328f2552 Merge pull request 'fix: 修复 Dockerfile 运行阶段缺少 config.yaml 导致容器启动 panic' (#126) from feature/add-redis-docker into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/126
2026-06-19 23:24:29 +08:00
eb1b90445f fix: 修复 Eino Graph 类型不匹配和多模态消息问题
- 添加 msg2str 转换节点解决 ChatModel 输出 *schema.Message 与 Splitter 期望 string 的类型不匹配
- 将多模态图片内容从 system 消息移到 user 消息(DashScope API 仅支持 user/tool 角色的多模态内容)
- 修复 Content 和 UserInputMultiContent 不能同时设置的问题
- Splitter 输出改为 StreamReader[string](单句),TTS 改为 TransformableLambda 流式消费
- 修复 .env 中 PostgreSQL DSN 和 Redis ADDR 的 http:// 前缀问题
2026-06-19 23:24:01 +08:00
hhs
e5537aaa1e fix: 修复 Dockerfile 运行阶段缺少 config.yaml 导致容器启动 panic 2026-06-19 23:23:30 +08:00
556666c046 Merge pull request 'fix: 修复 Redis 密码为空时容器启动失败的问题' (#125) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 21s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/125
2026-06-19 23:19:23 +08:00
4235c5cae0 Merge pull request 'fix: 修复 Redis 密码为空时容器启动失败的问题' (#124) from feature/add-redis-docker into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/124
2026-06-19 23:19:01 +08:00
hhs
41f393c09d fix: 修复 Redis 密码为空时容器启动失败的问题
当 CAMTALK_REDIS_PASSWORD 为空时,--requirepass 缺少参数导致
Redis 解析失败退出,healthcheck 无法执行,后端依赖启动失败。

改为 shell 脚本根据密码是否为空动态决定是否启用认证。
2026-06-19 23:18:30 +08:00
04dac0b673 Merge pull request 'feat: 添加 Redis Docker 容器编排及三级存储架构' (#123) from develop into v2
Some checks failed
Deploy / deploy (push) Failing after 5m12s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/123
2026-06-19 23:09:39 +08:00
4c7430d6f4 Merge pull request 'feat: 添加 Redis Docker 容器编排及三级存储架构' (#122) from feature/add-redis-docker into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/122
2026-06-19 23:08:12 +08:00
hhs
765cb34019 feat: 添加 Redis Docker 容器编排及三级存储架构
- docker-compose.yml 新增 Redis 服务及 camtalk-net 桥接网络
- 实现 TieredManager 三级存储(L1 内存 → L2 Redis → L3 PostgreSQL)
- config.go 新增 Redis/Persistence 配置类型及环境变量绑定
- 修复 CAMTALK_REDIS_ADDR 环境变量未被 Viper 绑定的问题
- .env.example 更新为三级存储配置并标注开发/部署地址差异
2026-06-19 22:53:06 +08:00
9576884619 docs: 新增 Eino 框架技术文档和重构实施记录
- docs/11-Eino框架技术文档.md: 框架简介、技术选型对比、核心概念(Lambda/Graph/ChatModel/StreamReader/Callback/State)、CamTalk Graph 设计、目录结构、注意事项
- docs/12-Eino重构实施记录.md: 重构背景、架构变更、四阶段实施详情、代码统计、遗留事项

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 22:09:07 +08:00
4ffd84510e refactor: 清理旧编排代码,新增 eino 包单元测试
删除旧代码:
- orchestrator/pipeline.go: 旧 STT→LLM→TTS 手写 goroutine 管道
- orchestrator/splitter.go: 旧句子切分器
- orchestrator/pipeline_test.go: 旧 Pipeline 测试
- ai/llm/openai.go: 旧 LLM OpenAI 实现(被 eino-ext ChatModel 替代)
- ai/llm/openai_test.go: 旧 LLM 测试

保留的接口和工具:
- orchestrator/orchestrator.go: Orchestrator 接口(ws/handler 依赖)
- orchestrator/sender.go: Sender 接口(eino/callback 依赖)
- ai/llm/llm.go: Request/Chunk/TokenUsage 类型定义
- ai/llm/prompt.go: BuildSystemPrompt(eino/nodes_history 依赖)
- ai/llm/scenarios.go: GetScenarioPrompt(eino/nodes_history 依赖)

新增测试:
- eino/graph_test.go: 13 个测试覆盖类型构建、State 并发安全、
  Context 注入、延迟计算、接口实现检查等

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 22:04:39 +08:00
4b731b5ac0 feat: 实现 Eino Graph 构建与 Orchestrator 适配器,切换 main.go
- graph.go: 构建 Graph 拓扑 START→STT→History→ChatModel→Splitter→TTS→Done→END
  - 创建 eino-ext ChatModel 对接 DashScope OpenAI 兼容接口
  - 统一使用值类型(PipelineInput/PipelineOutput)
  - Callback 在运行时通过 Stream option 传入
- adapter.go: EinoOrchestrator 实现 orchestrator.Orchestrator 接口
  - 解码 base64 音频/图片,注入 context 值
  - 调用 Graph.Stream() 触发惰性执行并消费输出
  - 追加用户/助手消息到历史
- main.go: 移除旧 llmService + orchestrator.New()
  替换为 eino.NewPipelineGraph() + eino.NewEinoOrchestrator()
- 各节点统一使用值类型,State 传递请求元数据

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 21:58:17 +08:00
fd5c7712f8 feat: 引入 Eino 框架并实现 AI 编排层基础设施与节点
- 引入 cloudwego/eino v0.9.9 和 eino-ext/components/model/openai v0.1.13
- 新增 internal/eino/ 包:
  - types.go: PipelineInput/Output、STTOutput、TokenUsage 类型定义
  - state.go: PipelineState 跨节点状态收集(线程安全)
  - callback.go: ChatModel OnEndWithStreamOutput 回调,逐 token 推送 llm_chunk
  - nodes_stt.go: STT Lambda,支持文本/语音输入模式
  - nodes_history.go: 历史组装 Lambda,含多模态图片支持
  - nodes_splitter.go: 句子分割 Transform Lambda
  - nodes_tts.go: TTS Lambda,逐句合成推送音频
  - nodes_done.go: Done Lambda,发送 llm_done 并追加历史

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 21:49:28 +08:00
f38fbf0527 Merge pull request 'refactor: 统一配置文件系统并重构项目设计文档' (#121) from develop into v2
All checks were successful
Deploy / deploy (push) Successful in 11s
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/121
2026-06-19 19:46:06 +08:00
b10a508356 Merge pull request 'refactor: 统一配置文件系统并重构项目设计文档' (#120) from docs/complete-doc into develop
Reviewed-on: http://8.161.227.145:3000/XEngineers/CamTalk/pulls/120
2026-06-19 19:43:02 +08:00
hhs
c0b4eeda46 refactor: 统一配置文件系统
- 补全 backend/config.yaml 所有非敏感配置项并添加中文注释
- 重写 config.go:Load(workDir) 显式传参,BindEnv 绑定敏感字段,删除 AutomaticEnv
- setDefaults 默认值与 config.yaml 保持一致(mimo/dashscope)
- backend/.env.example 重写为纯敏感信息模板
- .env 固定在 /opt/camtalk/.env,docker-compose 通过绝对路径加载
- deploy.sh 统一使用 --env-file,移除硬编码 IP
- deploy.yml 删除 CI 写入 .env 的步骤
- Dockerfile 移除 COPY config.yaml
- 修复 deploy.yml 中 POSTGRES_PASSWORD 的 &{{ 拼写错误
2026-06-19 18:41:35 +08:00
hhs
e6481e0faa docs: 添加 Eino 重构代码计划文档 2026-06-19 17:45:41 +08:00
hhs
a04275cc76 docs: 按功能模块重构文档结构
- 新建 01-架构设计.md:合并项目概述+系统架构+持久化设计,含 Mermaid 架构图、模块图、时序图、ER 图、部署图
- 新建 02-接口文档.md:合并接口文档+持久化 API+用户模块 API,统一格式去重
- 重编号 03~09,去掉状态标注,规划中功能标记为待实现
- 删除 PLAN_BACKEND.md、PLAN_USER_MODULE.md 及冗余文档
2026-06-19 15:31:52 +08:00
hhs
dca37f3e48 docs: 同步文档与代码实现状态
- 02-系统架构: Redis/PostgreSQL 标注已实现,模块表新增 Auth/Store/Migrations,更新表设计和前端组件
- 03-接口文档: config 新增 scenario 字段,Manager 接口补全 UpdateTitle/ListByUser,配置结构体同步,扩展接口替换为实际 Repository
- 04-技术选型: 持久化层标注已实现
- 06-语音交互: TTS Voice 更正为 mimo_default
- 11-持久化与用户系统设计: 所有 Phase 标记完成
- PLAN_BACKEND/PLAN_USER_MODULE: 标记完成状态
- README: 新增实现状态总览,补充文档索引
2026-06-19 14:58:43 +08:00
hhs
16302af7d2 docs: 添加 Eino 框架参考文档 2026-06-19 14:35:06 +08:00