|
|
ddb90c58ef
|
fix: 添加 rsync 安装,避免首次部署时 command not found
|
2026-06-20 21:32:57 +08:00 |
|
|
|
15a50f855b
|
fix: 统一使用 /opt/camtalk/.env 路径,act_runner 挂载宿主机目录后直接读取
|
2026-06-20 21:30:21 +08:00 |
|
|
|
45e2c4f37b
|
fix: env_file 使用绝对路径 /root/camtalk/.env,确保 CI 容器内 docker compose 正确解析
|
2026-06-20 20:57:34 +08:00 |
|
|
|
e20f58b4ae
|
fix: 通过 docker run -v 桥接同步 /opt/camtalk/.env,每次部署自动获取最新配置
|
2026-06-20 20:04:46 +08:00 |
|
|
|
4f735e6d29
|
fix: git fetch 改用公网 URL 而非 origin,避免 Docker 内网地址不可达导致卡死
|
2026-06-20 19:45:56 +08:00 |
|
|
|
fe5ac20a1f
|
fix: env_file 改为相对路径,解决 CI 容器无法读取 /opt/camtalk/.env 的问题
|
2026-06-20 19:29:12 +08:00 |
|
|
|
92e6636d05
|
fix: 精简 deploy.yml,checkout + ref + verify 三步确保拉取正确分支
|
2026-06-20 17:49:36 +08:00 |
|
|
|
12e2d24f37
|
fix: checkout 后显式 git fetch 切换触发分支,避免始终部署 main 代码;Dockerfile 添加 BuildKit cache mount 加速构建
|
2026-06-20 17:43:32 +08:00 |
|
|
|
6bb4773e07
|
fix: 恢复 checkout action 拉取代码,仅添加 ref 参数指定触发分支
|
2026-06-20 17:33:59 +08:00 |
|
|
|
39073b7673
|
fix: 添加 git safe.directory 配置,修复 CI/CD 中 dubious ownership 错误
|
2026-06-20 17:21:40 +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 |
|
|
|
4651ae185b
|
fix: CI/CD 改用 git clone 直接拉取代码,避免 rsync 同步失败
|
2026-06-20 16:23:59 +08:00 |
|
|
|
590c4592ea
|
fix: checkout 指定触发分支,避免始终拉取 main 代码
|
2026-06-20 15:51:14 +08:00 |
|
|
|
970f10a274
|
fix: 修复前端 lint 错误 — 移除 ref 模式,用 useEffect 依赖注入回调
- api.ts: 移除 catch 中未使用的 err 变量
- auth.tsx: 去掉 useRef 模式,直接在 useEffect 中注册回调并声明依赖
|
2026-06-20 15:07:09 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
402ad8c949
|
fix: CI 环境安装 rsync 依赖
|
2026-06-20 13:36:44 +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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
e5537aaa1e
|
fix: 修复 Dockerfile 运行阶段缺少 config.yaml 导致容器启动 panic
|
2026-06-19 23:23:30 +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 |
|
|
|
41f393c09d
|
fix: 修复 Redis 密码为空时容器启动失败的问题
当 CAMTALK_REDIS_PASSWORD 为空时,--requirepass 缺少参数导致
Redis 解析失败退出,healthcheck 无法执行,后端依赖启动失败。
改为 shell 脚本根据密码是否为空动态决定是否启用认证。
|
2026-06-19 23:18:30 +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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|