From 29e77c2b6ad165d647b3929ce8233b1712f6620f Mon Sep 17 00:00:00 2001 From: gongzhiyong Date: Tue, 14 Apr 2026 02:43:55 +0800 Subject: [PATCH] fix: resolve TypeScript errors in main.tsx and MessageBubble --- --full-page | Bin 0 -> 129594 bytes .DS_Store | Bin 6148 -> 8196 bytes .claude/agents/soc-deploy-agent.md | 2 + .claude/agents/soc-frontend-agent.md | 2 + .claude/agents/soc-llm-engineer-agent.md | 127 ------ .claude/agents/soc-product-agent.md | 147 ------- .omc/project-memory.json | 146 +++++++ ...cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl | 48 +++ .../checkpoint-2026-04-13T17-37-35-986Z.json | 16 + .../checkpoint-2026-04-13T17-38-06-542Z.json | 16 + .../checkpoint-2026-04-13T17-38-47-140Z.json | 16 + .../checkpoint-2026-04-13T17-39-28-469Z.json | 16 + .../checkpoint-2026-04-13T17-41-59-168Z.json | 16 + .../checkpoint-2026-04-13T18-29-50-564Z.json | 16 + .omc/state/hud-stdin-cache.json | 1 + .omc/state/idle-notif-cooldown.json | 5 + .omc/state/last-tool-error.json | 7 + .omc/state/mission-state.json | 399 ++++++++++++++++++ .../hud-state.json | 6 + .omc/state/subagent-tracking.json | 254 +++++++++++ CLAUDE.md | 78 +++- Makefile | 84 ---- doc/test-report-2026-04-13.md | 71 ++++ docker-compose.yml | 4 +- langgraph/.omc/project-memory.json | 176 ++++++++ ...cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl | 7 + .../checkpoint-2026-04-13T18-16-36-381Z.json | 16 + langgraph/.omc/state/idle-notif-cooldown.json | 5 + langgraph/.omc/state/last-tool-error.json | 7 + langgraph/.omc/state/mission-state.json | 109 +++++ langgraph/.omc/state/subagent-tracking.json | 43 ++ .../enterprise/search-result/index.tsx | 1 + langgraph/src/components/MessageBubble.tsx | 2 +- langgraph/src/main.tsx | 12 +- 34 files changed, 1479 insertions(+), 376 deletions(-) create mode 100644 --full-page delete mode 100644 .claude/agents/soc-llm-engineer-agent.md delete mode 100644 .claude/agents/soc-product-agent.md create mode 100644 .omc/project-memory.json create mode 100644 .omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl create mode 100644 .omc/state/checkpoints/checkpoint-2026-04-13T17-37-35-986Z.json create mode 100644 .omc/state/checkpoints/checkpoint-2026-04-13T17-38-06-542Z.json create mode 100644 .omc/state/checkpoints/checkpoint-2026-04-13T17-38-47-140Z.json create mode 100644 .omc/state/checkpoints/checkpoint-2026-04-13T17-39-28-469Z.json create mode 100644 .omc/state/checkpoints/checkpoint-2026-04-13T17-41-59-168Z.json create mode 100644 .omc/state/checkpoints/checkpoint-2026-04-13T18-29-50-564Z.json create mode 100644 .omc/state/hud-stdin-cache.json create mode 100644 .omc/state/idle-notif-cooldown.json create mode 100644 .omc/state/last-tool-error.json create mode 100644 .omc/state/mission-state.json create mode 100644 .omc/state/sessions/cbab3cea-282f-4d92-bc04-19310c94f3e6/hud-state.json create mode 100644 .omc/state/subagent-tracking.json delete mode 100644 Makefile create mode 100644 doc/test-report-2026-04-13.md create mode 100644 langgraph/.omc/project-memory.json create mode 100644 langgraph/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl create mode 100644 langgraph/.omc/state/checkpoints/checkpoint-2026-04-13T18-16-36-381Z.json create mode 100644 langgraph/.omc/state/idle-notif-cooldown.json create mode 100644 langgraph/.omc/state/last-tool-error.json create mode 100644 langgraph/.omc/state/mission-state.json create mode 100644 langgraph/.omc/state/subagent-tracking.json diff --git a/--full-page b/--full-page new file mode 100644 index 0000000000000000000000000000000000000000..d2b52cf950f373d307b230aae389e56cdfd4405a GIT binary patch literal 129594 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 B2qFLg literal 0 HcmV?d00001 diff --git a/.DS_Store b/.DS_Store index 4a49155f749e84f18a9c7c70cca2dd58ab1fdcfd..622c08fb03dcbcdb0567a3918928ee1527612bd4 100644 GIT binary patch delta 342 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aKK$_0`K@);O%fKZpAfFY3~eX}5k z7|Uh_j$Y=)>>L~u8(7Ri%D92jx(sOyrN~MdQay9>laq4tlR&02FffS$X}$koz`!t> zheeff!DJ&ARo5_NaUffWA%!8IA(gjfk1*ANVtMR2N(k1nJ4p$cuw}`;otxU5GddnHplbKVFmz~>`&+b delta 172 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50D9R3!2aCBdxH9N5on z&dkU@*-1c^v1f7ykaU{NBB&(bnUkNKl#`zXHDl9e7C~0#$(AB=+)6+pz5ie^vCw}p qI|qj#Gf)T!1h|2OE6Bo)h2NPc^UHXGtY=_?I0fW7hRyLjbC?0XhalJh diff --git a/.claude/agents/soc-deploy-agent.md b/.claude/agents/soc-deploy-agent.md index 07d29c7..1b6c2a5 100644 --- a/.claude/agents/soc-deploy-agent.md +++ b/.claude/agents/soc-deploy-agent.md @@ -24,6 +24,8 @@ tools: - mcp__v0__getChat - mcp__v0__getUser - mcp__v0__sendChatMessage +skills: + - agent-browser --- # so-c-chat-clone 部署 Agent diff --git a/.claude/agents/soc-frontend-agent.md b/.claude/agents/soc-frontend-agent.md index 1c6df52..f7887de 100644 --- a/.claude/agents/soc-frontend-agent.md +++ b/.claude/agents/soc-frontend-agent.md @@ -21,6 +21,8 @@ tools: - mcp__v0__getChat - mcp__v0__getUser - mcp__v0__sendChatMessage +skills: + - agent-browser --- # so-c-chat-clone 前端对接 Agent diff --git a/.claude/agents/soc-llm-engineer-agent.md b/.claude/agents/soc-llm-engineer-agent.md deleted file mode 100644 index 9acdf6c..0000000 --- a/.claude/agents/soc-llm-engineer-agent.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -name: soc-llm-engineer-agent -description: so-c-chat-clone 大模型工程师 Agent,专注 AI 交互问题诊断、Prompt 优化、LangGraph.js 流程调优与大模型能力方案设计,为其他 Agent 提供 AI 技术支持 -model: opus -tools: - - Read - - Edit - - Write - - Bash - - Glob - - Grep - - Agent - - WebFetch - - WebSearch - - mcp__zsk__memory_write - - mcp__zsk__memory_search - - mcp__zsk__memory_delete - - mcp__zsk__memory_service_status - - mcp__azure-docs__microsoft_docs_search - - mcp__azure-docs__microsoft_docs_fetch - - mcp__azure-docs__microsoft_code_sample_search ---- - -# so-c-chat-clone 大模型工程师 Agent - -你是 so-c-chat-clone 项目的大模型工程师,专注于 AI 交互质量、Prompt 工程、LangGraph.js 流程设计与大模型能力评估。当其他 Agent 遇到 AI 交互问题时,由你提供技术诊断与解决方案。 - -## 项目信息 - -- **项目根路径**: `/Users/gongzhiyong/go/SOC/` -- **代码路径**: `/Users/gongzhiyong/go/SOC/langgraph/` -- **GitHub**: https://github.com/Fasthei/so-c-chat-clone(main 分支) -- **后端 URL**: https://soc-langgraph.victorioussand-69befc84.southeastasia.azurecontainerapps.io -- **前端 URL**: https://agreeable-smoke-0364d4000.7.azurestaticapps.net - -## 技术栈(AI 相关) - -### Agent 架构 -``` -Supervisor (Gemini 2.0 Flash) → router - ├── enterprise → KB + 工单(ReAct, MAX_ITERATIONS=6) - ├── searcher → Google + Jina 搜索 + web_read(ReAct, MAX_ITERATIONS=3, force-summary) - ├── coder → Daytona 沙盒(ReAct, MAX_ITERATIONS=5) - ├── writer → Canvas 文档 + 报告 + 草稿 - └── generalInput → 通用对话 -``` - -### 关键文件 -- **Supervisor router**: `src/agent/supervisor/nodes/router.ts` — Gemini Flash 意图路由 -- **Enterprise agent+tool-executor**: `src/agent/enterprise/nodes/agent.ts` + `tool-executor.ts` -- **Searcher agent+tool-executor**: `src/agent/searcher/nodes/agent.ts` + `tool-executor.ts` + `force-summary.ts` -- **Writer/Coder**: `src/agent/writer/` + `src/agent/coder/` -- **外部 API 客户端**: `src/agent/enterprise/tools/soc-client.ts` -- **工具配置(超时/重试)**: `src/agent/utils/toolConfig.ts` -- **HTTP 中间件(安全头过滤)**: `src/agent/http.ts` - -### LLM 配置 -- **Supervisor**: Gemini 2.0 Flash(路由分类,低延迟) -- **Enterprise**: AzureChatOpenAI gpt-5.4(工具调用 + 最终回答) -- **Model Mode**: flash(快速,排除 web_search)/ pro(深度,排除 google_search)/ auto(全部) - -### Gen-UI 流程 -1. LLM `bindTools(tools).invoke()` → 返回 tool_calls -2. 逐个执行外部 API 调用 -3. `ui.push({ name: "component-name", props: {...} })` 推送 Gen-UI 卡片 -4. 收集 toolMessages → LLM 再次 invoke 生成最终文字回答 -5. 返回 `{ messages, ui: ui.items, timestamp }` - -## 核心职责 - -### 1. AI 交互问题诊断 -- Supervisor 路由误判(应该路由到 enterprise 却路由到 generalInput) -- LLM 不触发工具调用(tool descriptions 不够清晰) -- 工具调用参数错误(Zod schema 定义问题) -- Gen-UI 卡片数据不完整(ui.push props 映射问题) - -### 2. Prompt 工程 -- Enterprise Agent system prompt 优化 -- Supervisor router prompt 和 tool descriptions 优化 -- 工具 description 调优,提升触发准确率 -- 针对中文业务场景优化回答风格 - -### 3. LangGraph.js 流程设计 -- Supervisor → Enterprise 路由逻辑优化 -- Enterprise 工具节点的单轮 vs 多轮调用策略 -- Checkpointer 配置和会话持久化 -- 错误处理和 fallback 策略 - -### 4. Model Mode 策略 -- flash/pro/auto 三种模式的工具过滤逻辑 -- 模型参数调优(temperature, max_tokens) -- 评估是否需要引入新工具或调整工具组合 - -### 5. 与其他 Agent 协作 -- **soc-backend-agent** 遇到 LangGraph.js / tool calling 问题时,提供代码级修复方案 -- **soc-tester-agent** 发现 AI 响应质量问题时,提供 Prompt 调优方案 -- **soc-frontend-agent** 遇到 Gen-UI 渲染异常时,确认后端 ui.push 数据格式 -- 将诊断结论和解决方案写入 MCP 记忆,供其他 Agent 参考 - -## 常见问题速查 - -| 问题现象 | 优先排查点 | -|---------|-----------| -| 用户问企业问题但路由到 generalInput | router.ts 的 Supervisor prompt 和 ALL_TOOL_DESCRIPTIONS | -| LLM 不调用工具 | tools.ts 的 tool description 是否清晰,bindTools 是否传入 | -| 工具调用但 Gen-UI 卡片不显示 | ui.push 的 name 是否与 agent-uis/index.tsx 注册名一致 | -| 最终回答重复工具数据 | system prompt 需强调"无需在文字中重复数据细节" | -| 沙盒执行超时 | soc-client.ts 的 AbortSignal.timeout 设置 | -| 搜索结果质量差 | Jina/Serper 返回数据是否被正确截断和传递 | - - -## 开发机与代码仓库 - -- **开发机**: `sshpass -p xiaohei ssh xiaohei@192.168.30.30`(sudo 密码同) -- **开发机项目路径**: `~/SOC/` -- **Docker 启动**: `cd ~/SOC && make dev` -- **Gitee 仓库**: `http://gitee.ath.cx:3000/xiaohei/socaichat.git`(用户: xiaohei, 密码: By@123456) -- **代码同步到开发机**: `sshpass -p xiaohei rsync -avz --exclude=node_modules --exclude=.git -e ssh /Users/gongzhiyong/go/SOC/ xiaohei@192.168.30.30:~/SOC/` -- **开发机端口**: 前端 http://192.168.30.30:5173 | API http://192.168.30.30:2024 -## 工作规范 - -1. **诊断优先**:任务开始前先读相关代码,理解现有实现再给方案 -2. **最小化修改**:修改 Prompt 或代码时,精确定位问题行,使用 Edit 做最小改动 -3. **方案文档化**:重要的 Prompt 设计决策写入 `/Users/gongzhiyong/go/SOC/doc/` 目录 -4. **记忆同步**:每次完成诊断或优化后,使用 `mcp__zsk__memory_write` 写入开发日志 -5. **Azure 权限约束**:仅允许操作 `AuthData` 和 `Operation` 两个资源组 -6. **不破坏 Gen-UI 契约**:ui.push 的组件名和 props 结构不得单方面修改,需与前端 Agent 确认 diff --git a/.claude/agents/soc-product-agent.md b/.claude/agents/soc-product-agent.md deleted file mode 100644 index 7599635..0000000 --- a/.claude/agents/soc-product-agent.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -name: soc-product-agent -description: so-c-chat-clone 产品经理 Agent,实时读取 MCP 产品文档和知识库进展,对标 ChatGPT Enterprise 定义产品方向,主盯前端交互体验 -model: opus -tools: - - Read - - Edit - - Write - - Bash - - Glob - - Grep - - Agent - - WebFetch - - WebSearch - - mcp__zsk__memory_write - - mcp__zsk__memory_search - - mcp__zsk__memory_delete - - mcp__zsk__memory_service_status - - mcp__cursor-project-memory__memory_write - - mcp__cursor-project-memory__memory_search - - mcp__cursor-project-memory__memory_delete - - mcp__cursor-project-memory__memory_service_status - - mcp__v0__createChat - - mcp__v0__findChats - - mcp__v0__getChat - - mcp__v0__getUser - - mcp__v0__sendChatMessage ---- - -# so-c-chat-clone 产品经理 Agent - -你是 so-c-chat-clone 项目的产品经理,负责定义产品方向、跟进实施进度、主盯前端交互体验。你的核心目标是**让产品无限接近 ChatGPT 的企业级运营大脑**。 - -## 核心职责 - -### 1. 产品文档管理(MCP 驱动) -- 使用 `mcp__zsk__memory_search` 实时读取知识库中的产品文档、需求规格、设计方案 -- 使用 `mcp__cursor-project-memory__memory_search` 读取项目开发进展记录 -- 基于文档定义产品迭代方向和优先级 -- 将产品决策写入 `mcp__zsk__memory_write`,供其他 Agent 参考 - -### 2. ChatGPT Enterprise 对标 -- 持续搜索 ChatGPT Enterprise 最新功能和交互模式 -- 分析 SOC 与 ChatGPT 的功能差距 -- 制定具体的追赶方案和优先级排序 -- 重点关注企业级场景:多轮对话、工具调用、文件处理、团队协作 - -### 3. 前端交互主盯(核心) -- 读取前端代码(langgraph/src/main.tsx、components/)分析交互体验 -- 对标 ChatGPT 的交互细节:消息气泡、流式输出动画、工具调用状态展示、错误提示 -- 使用 v0 MCP(mcp__v0__createChat、mcp__v0__sendChatMessage)咨询 UI 方案 -- 提出具体的前端改进需求,交给 frontend-agent 实施 -- 验收前端实施结果是否符合产品预期 - -### 4. 进度跟进 -- 读取 MCP 知识库中各 Agent 的开发日志 -- 跟踪功能实现进度 -- 识别阻塞项并协调解决 -- 定期生成产品进度报告 - -## 产品对标清单(ChatGPT Enterprise) - -### 交互体验(高优先级) -- [x] 消息输入:textarea 多行 + Shift+Enter 换行 + 自动增高(2026-04-11 完成) -- [x] 流式输出:停止生成按钮(已实现) -- [x] 流式输出:打字光标闪烁动画(2026-04-11 完成) -- [ ] 流式输出:思考过程可折叠展示(P1) -- [x] 工具调用:状态指示器 ToolCallStatus(已实现,Loader/CheckCircle) -- [ ] 工具调用:结果卡片展开/折叠动画(P1) -- [x] 对话管理:重新生成(已实现) -- [x] 对话管理:编辑已发送消息并重新发送(2026-04-11 完成) -- [ ] 对话管理:分支对话(P2) -- [x] 文件处理:拖拽上传、粘贴图片、文件预览(已实现) -- [x] 代码块:语法高亮 Prism + 一键复制(已实现) -- [ ] 代码块:运行按钮(P2,需配合 sandbox) -- [x] 响应式:移动端适配、侧边栏折叠(已实现) -- [ ] 滚动到底部浮动按钮(P2) - -### 功能完整性(中优先级) -- [x] 对话历史搜索和筛选(已实现,ThreadSidebar 搜索框) -- [ ] 对话导出(Markdown/PDF)(P2) -- [x] 快捷指令/Prompt 模板(已实现,QuickPrompts) -- [x] 多模型切换(已实现 Flash/Auto/Pro) -- [ ] 上下文长度指示器(P2) -- [ ] 消息反馈点赞/点踩(P2) -- [ ] 键盘快捷键(P1) - -### 企业级特性(低优先级) -- [ ] 用户认证 SSO -- [ ] 审计日志 -- [ ] 数据保留策略 - -## 8 项产品优化方案评审结果(2026-04-11) - -### P0 — 第一周实施(5-7 天) - -| # | 方案 | 难度 | 前/后端 | 快速见效项 | -|---|------|------|---------|-----------| -| 8 | **稳定性和观感优化** | 简单 | 70/30 | error 美化 0.5d、状态语言统一 0.5d、空结果状态 1d | -| 5 | **工具编排更聪明** | 中等 | 10/90 | prompt 引导多工具串联 1d、agent 内 fallback 2d | -| 4 | **会话恢复和连续性** | 中等 | 50/50 | Gen-UI 卡片随 checkpoint 自动恢复(需验证)1-2d | - -### P1 — 第二周实施(3-5 天) - -| # | 方案 | 难度 | 前/后端 | 说明 | -|---|------|------|---------|------| -| 6 | **输出质感** | 简单 | 40/60 | prompt 模板化(结论先给+企业风格)、markdown 渲染已就绪 | -| 3 | **证据链展示** | 中等 | 40/60 | tool-executor 加 sourceType + prompt 来源标注 + 前端 badge | -| 1 | **Artifact 能力升级** | 中等 | 70/30 | 卡片追问按钮 1-2d、下一步动作 1d | -| 2 | **文件工作流补强** | 中等 | 40/60 | 多文件上传 1-2d(快速版)、文件摘要+引用 3-5d | - -### P2 — 第三周起 - -| # | 方案 | 难度 | 说明 | -|---|------|------|------| -| 7 | **企业闭环动作** | 中等 | 最小方案:prompt 模板 1d;完整方案:跨 agent 串联 3-5d | - -### 技术关键决策 -- **会话恢复**:PostgresSaver 已持久化 ui state,Gen-UI 卡片理论上自动恢复,需前端验证 -- **工具编排**:推荐方案 A(agent 内 fallback),跨 agent 串联需改 supervisor 架构(方案 B/C) -- **证据链**:每个 ui.push() props 加 `sourceType: "kb"|"ticket"|"web"|"code"` 字段 -- **企业闭环**:复用 writer agent + doc_create schema 加 template 参数 -- **输出质感**:纯 prompt 改动,风险极低 - -### 不建议追的方向 -- DALL-E 图片生成、语音对话、GPTs marketplace - -### 后端总工作量估算:12-21 天(按优先级分批) - -## 项目信息 - -- **项目根路径**: `/Users/gongzhiyong/go/SOC/` -- **前端代码**: `langgraph/src/main.tsx`(Chat UI 入口) -- **组件目录**: `langgraph/src/components/` -- **Gen-UI 组件**: `langgraph/src/agent-uis/` -- **测试报告**: `/Users/gongzhiyong/go/SOC/test.md` -- **GitHub**: https://github.com/Fasthei/so-c-chat-clone - -## 工作规范 - -1. **每次任务开始前**先用 MCP 搜索产品文档和开发进展 -2. **互联网搜索**对标 ChatGPT 最新功能,用 WebSearch + WebFetch -3. **前端交互评审**必须先 Read 完整代码再提改进建议 -4. **UI 方案咨询**不确定的交互用 v0 MCP 确认 -5. **产品决策记录**写入 mcp__zsk__memory_write -6. **不直接改前端代码**,提需求给 frontend-agent 实施 -7. **Azure 权限约束**:仅允许操作 `AuthData` 和 `Operation` 资源组 diff --git a/.omc/project-memory.json b/.omc/project-memory.json new file mode 100644 index 0000000..b39d6fa --- /dev/null +++ b/.omc/project-memory.json @@ -0,0 +1,146 @@ +{ + "version": "1.0.0", + "lastScanned": 1776102101935, + "projectRoot": "/Users/gongzhiyong/go/SOC", + "techStack": { + "languages": [], + "frameworks": [], + "packageManager": null, + "runtime": null + }, + "build": { + "buildCommand": null, + "testCommand": null, + "lintCommand": null, + "devCommand": null, + "scripts": {} + }, + "conventions": { + "namingStyle": null, + "importStyle": null, + "testPattern": null, + "fileOrganization": null + }, + "structure": { + "isMonorepo": false, + "workspaces": [], + "mainDirectories": [], + "gitBranches": { + "defaultBranch": "main", + "branchingStrategy": null + } + }, + "customNotes": [], + "directoryMap": { + "doc": { + "path": "doc", + "purpose": null, + "fileCount": 2, + "lastAccessed": 1776102101920, + "keyFiles": [ + "enterprise-plan.md", + "test-report-2026-04-13.md" + ] + }, + "langgraph": { + "path": "langgraph", + "purpose": null, + "fileCount": 30, + "lastAccessed": 1776102101920, + "keyFiles": [ + "Dockerfile", + "Dockerfile.dev", + "Dockerfile.frontend", + "Dockerfile.frontend.dev", + "Dockerfile.frontend.prod" + ] + } + }, + "hotPaths": [ + { + "path": "langgraph/src/main.tsx", + "accessCount": 61, + "lastAccessed": 1776105760972, + "type": "file" + }, + { + "path": "langgraph/src/components/MessageBubble.tsx", + "accessCount": 7, + "lastAccessed": 1776105691610, + "type": "file" + }, + { + "path": ".claude/agents/soc-backend-agent.md", + "accessCount": 4, + "lastAccessed": 1776102763200, + "type": "file" + }, + { + "path": "langgraph/src/agent/searcher/nodes/tool-executor.ts", + "accessCount": 2, + "lastAccessed": 1776105657238, + "type": "file" + }, + { + "path": "langgraph/src/agent-uis/enterprise/search-result/index.tsx", + "accessCount": 2, + "lastAccessed": 1776105682784, + "type": "file" + }, + { + "path": "langgraph/src/utils/tool-maps.ts", + "accessCount": 1, + "lastAccessed": 1776102347374, + "type": "file" + }, + { + "path": "langgraph/src/utils/input-handling.ts", + "accessCount": 1, + "lastAccessed": 1776102372842, + "type": "file" + }, + { + "path": "langgraph/src/utils/thread-management.ts", + "accessCount": 1, + "lastAccessed": 1776102387195, + "type": "file" + }, + { + "path": "langgraph/src/utils/message-rendering.ts", + "accessCount": 1, + "lastAccessed": 1776102400569, + "type": "file" + }, + { + "path": "langgraph/src/utils/api-client.ts", + "accessCount": 1, + "lastAccessed": 1776102423804, + "type": "file" + }, + { + "path": ".claude/agents/soc-refactor-agent.md", + "accessCount": 1, + "lastAccessed": 1776102621913, + "type": "file" + }, + { + "path": ".claude/agents/soc-tester-agent.md", + "accessCount": 1, + "lastAccessed": 1776102722579, + "type": "file" + }, + { + "path": "", + "accessCount": 1, + "lastAccessed": 1776105325973, + "type": "directory" + }, + { + "path": "langgraph/src", + "accessCount": 1, + "lastAccessed": 1776105656178, + "type": "directory" + } + ], + "userDirectives": [] +} \ No newline at end of file diff --git a/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl b/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl new file mode 100644 index 0000000..e5fb95f --- /dev/null +++ b/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl @@ -0,0 +1,48 @@ +{"t":0,"agent":"system","event":"skill_invoked","skill_name":"oh-my-claudecode:setup"} +{"t":0,"agent":"system","event":"skill_invoked","skill_name":"oh-my-claudecode:omc-setup"} +{"t":0,"agent":"system","event":"skill_invoked","skill_name":"oh-my-claudecode:hud"} +{"t":0,"agent":"system","event":"skill_invoked","skill_name":"oh-my-claudecode:team"} +{"t":0,"agent":"ad2f060","agent_type":"ux-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a2645c0","agent_type":"code-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a118208","agent_type":"product-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a175e13","agent_type":"product-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a5c960f","agent_type":"product-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a116dc8","agent_type":"product-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a2645c0","agent_type":"code-reviewer","event":"agent_stop","success":true,"duration_ms":117289} +{"t":0,"agent":"a1ffb67","agent_type":"code-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a1ffb67","agent_type":"code-reviewer","event":"agent_stop","success":true,"duration_ms":11194} +{"t":0,"agent":"a686758","agent_type":"ux-reviewer","event":"agent_stop","success":true} +{"t":0,"agent":"a1b02e2","agent_type":"ux-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a511bfa","agent_type":"product-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"affb76d","agent_type":"interaction-upgrade","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a24c7ee","agent_type":"export-timestamps","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"system","event":"skill_invoked","skill_name":"agent-browser"} +{"t":0,"agent":"a3bed4f","agent_type":"refactor-worker","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a338035","agent_type":"refactor-worker","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a9823d6","agent_type":"polish-worker","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ac63e30","agent_type":"polish-worker","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a48c164","agent_type":"unknown","event":"agent_stop","success":true} +{"t":0,"agent":"ae3f096","agent_type":"unknown","event":"agent_stop","success":true} +{"t":0,"agent":"a2a7533","agent_type":"polish-worker","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a026cc1","agent_type":"refactor-worker","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"system","event":"skill_invoked","skill_name":"oh-my-claudecode:team"} +{"t":0,"agent":"a213f63","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a9723d3","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ae440d9","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a73bc52","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a91736f","agent_type":"worker-2","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a7991ac","agent_type":"worker-2","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"af5367e","agent_type":"worker-3","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a40f928","agent_type":"worker-3","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"aee50ad","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"aa06b21","agent_type":"worker-2","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a38ddc7","agent_type":"worker-3","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a9c8dea","agent_type":"unknown","event":"agent_stop","success":true} +{"t":0,"agent":"a31f9f3","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ac08f2b","agent_type":"worker-2","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ac05d2c","agent_type":"worker-3","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ae8fad8","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a0ec387","agent_type":"worker-2","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ae8fad8","agent_type":"worker-1","event":"agent_stop","success":true,"duration_ms":166644} +{"t":0,"agent":"a5715d3","agent_type":"worker-1","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a5715d3","agent_type":"worker-1","event":"agent_stop","success":true,"duration_ms":15355} diff --git a/.omc/state/checkpoints/checkpoint-2026-04-13T17-37-35-986Z.json b/.omc/state/checkpoints/checkpoint-2026-04-13T17-37-35-986Z.json new file mode 100644 index 0000000..7ce74ee --- /dev/null +++ b/.omc/state/checkpoints/checkpoint-2026-04-13T17-37-35-986Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T17:37:35.985Z", + "trigger": "auto", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/.omc/state/checkpoints/checkpoint-2026-04-13T17-38-06-542Z.json b/.omc/state/checkpoints/checkpoint-2026-04-13T17-38-06-542Z.json new file mode 100644 index 0000000..c708788 --- /dev/null +++ b/.omc/state/checkpoints/checkpoint-2026-04-13T17-38-06-542Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T17:38:06.541Z", + "trigger": "auto", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/.omc/state/checkpoints/checkpoint-2026-04-13T17-38-47-140Z.json b/.omc/state/checkpoints/checkpoint-2026-04-13T17-38-47-140Z.json new file mode 100644 index 0000000..68d6714 --- /dev/null +++ b/.omc/state/checkpoints/checkpoint-2026-04-13T17-38-47-140Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T17:38:47.139Z", + "trigger": "manual", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/.omc/state/checkpoints/checkpoint-2026-04-13T17-39-28-469Z.json b/.omc/state/checkpoints/checkpoint-2026-04-13T17-39-28-469Z.json new file mode 100644 index 0000000..502a26c --- /dev/null +++ b/.omc/state/checkpoints/checkpoint-2026-04-13T17-39-28-469Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T17:39:28.468Z", + "trigger": "manual", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/.omc/state/checkpoints/checkpoint-2026-04-13T17-41-59-168Z.json b/.omc/state/checkpoints/checkpoint-2026-04-13T17-41-59-168Z.json new file mode 100644 index 0000000..047fd80 --- /dev/null +++ b/.omc/state/checkpoints/checkpoint-2026-04-13T17-41-59-168Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T17:41:59.166Z", + "trigger": "manual", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/.omc/state/checkpoints/checkpoint-2026-04-13T18-29-50-564Z.json b/.omc/state/checkpoints/checkpoint-2026-04-13T18-29-50-564Z.json new file mode 100644 index 0000000..fdbf5b2 --- /dev/null +++ b/.omc/state/checkpoints/checkpoint-2026-04-13T18-29-50-564Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T18:29:50.563Z", + "trigger": "manual", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/.omc/state/hud-stdin-cache.json b/.omc/state/hud-stdin-cache.json new file mode 100644 index 0000000..eb01034 --- /dev/null +++ b/.omc/state/hud-stdin-cache.json @@ -0,0 +1 @@ +{"session_id":"cbab3cea-282f-4d92-bc04-19310c94f3e6","transcript_path":"/Users/gongzhiyong/.claude/projects/-Users-gongzhiyong/cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl","cwd":"/Users/gongzhiyong/go/SOC","model":{"id":"claude-sonnet-4-6","display_name":"Sonnet 4.6"},"workspace":{"current_dir":"/Users/gongzhiyong/go/SOC","project_dir":"/Users/gongzhiyong","added_dirs":[]},"version":"2.1.92","output_style":{"name":"default"},"cost":{"total_cost_usd":69.40894865000007,"total_duration_ms":16385157,"total_api_duration_ms":7027952,"total_lines_added":1180,"total_lines_removed":308},"context_window":{"total_input_tokens":413757,"total_output_tokens":306080,"context_window_size":200000,"current_usage":{"input_tokens":3,"output_tokens":196,"cache_creation_input_tokens":1171,"cache_read_input_tokens":117401},"used_percentage":59,"remaining_percentage":41},"exceeds_200k_tokens":false,"rate_limits":{"five_hour":{"used_percentage":5,"resets_at":1776121200},"seven_day":{"used_percentage":9,"resets_at":1776668400}}} \ No newline at end of file diff --git a/.omc/state/idle-notif-cooldown.json b/.omc/state/idle-notif-cooldown.json new file mode 100644 index 0000000..9f14568 --- /dev/null +++ b/.omc/state/idle-notif-cooldown.json @@ -0,0 +1,5 @@ +{ + "lastSentAt": "2026-04-13T18:42:10.614Z", + "repoSignature": "{\"repo\":\"Fasthei/so-c-chat-clone\",\"headSha\":\"aec776e60c62b63de8a5326a1d4cf235cd5b2d0b\",\"dirty\":true,\"openPrNumbers\":[],\"openIssueNumbers\":[],\"failingRunIds\":[24212133630,24212252772,24212374640,24215887708,24216091197,24256304269,24256304279,24302279460,24310044547,24310141463,24310183516,24310225839]}", + "backlogZero": false +} \ No newline at end of file diff --git a/.omc/state/last-tool-error.json b/.omc/state/last-tool-error.json new file mode 100644 index 0000000..523f883 --- /dev/null +++ b/.omc/state/last-tool-error.json @@ -0,0 +1,7 @@ +{ + "tool_name": "Bash", + "tool_input_preview": "{\"command\":\"find ~/.claude -name \\\"*.json\\\" 2>/dev/null | xargs grep -l \\\"soc-refactor-completion\\\" 2>/dev/null\",\"description\":\"Find all files referencing the old team\"}", + "error": "Exit code 1", + "timestamp": "2026-04-13T18:33:35.515Z", + "retry_count": 1 +} \ No newline at end of file diff --git a/.omc/state/mission-state.json b/.omc/state/mission-state.json new file mode 100644 index 0000000..fe74cd3 --- /dev/null +++ b/.omc/state/mission-state.json @@ -0,0 +1,399 @@ +{ + "updatedAt": "2026-04-13T18:43:18.094Z", + "missions": [ + { + "id": "session:cbab3cea-282f-4d92-bc04-19310c94f3e6:none", + "source": "session", + "name": "none", + "objective": "Session mission", + "createdAt": "2026-04-13T16:57:05.589Z", + "updatedAt": "2026-04-13T18:43:18.094Z", + "status": "running", + "workerCount": 34, + "taskCounts": { + "total": 34, + "pending": 0, + "blocked": 0, + "inProgress": 29, + "completed": 5, + "failed": 0 + }, + "agents": [ + { + "name": "ux-reviewer:ad2f060", + "role": "ux-reviewer", + "ownership": "ad2f0602bfa6b6a03", + "status": "done", + "currentStep": null, + "latestUpdate": "completed", + "completedSummary": null, + "updatedAt": "2026-04-13T18:30:56.630Z" + }, + { + "name": "code-reviewer:a2645c0", + "role": "code-reviewer", + "ownership": "a2645c0c1125f88fd", + "status": "done", + "currentStep": null, + "latestUpdate": "completed", + "completedSummary": null, + "updatedAt": "2026-04-13T16:59:11.969Z" + }, + { + "name": "product-reviewer:a118208", + "role": "product-reviewer", + "ownership": "a1182083f34dfdca2", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T16:57:25.154Z" + }, + { + "name": "product-reviewer:a175e13", + "role": "product-reviewer", + "ownership": "a175e13ce956fc3b4", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T16:57:26.866Z" + }, + { + "name": "product-reviewer:a5c960f", + "role": "product-reviewer", + "ownership": "a5c960fbe0d950a8e", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T16:58:11.911Z" + }, + { + "name": "product-reviewer:a116dc8", + "role": "product-reviewer", + "ownership": "a116dc8a608edd6ab", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T16:58:55.582Z" + }, + { + "name": "code-reviewer:a1ffb67", + "role": "code-reviewer", + "ownership": "a1ffb67f6aa7b1878", + "status": "done", + "currentStep": null, + "latestUpdate": "completed", + "completedSummary": null, + "updatedAt": "2026-04-13T16:59:23.403Z" + }, + { + "name": "ux-reviewer:a1b02e2", + "role": "ux-reviewer", + "ownership": "a1b02e26d59b261ee", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:08:56.789Z" + }, + { + "name": "product-reviewer:a511bfa", + "role": "product-reviewer", + "ownership": "a511bfa23516122bf", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:09:30.209Z" + }, + { + "name": "interaction-upgrade:affb76d", + "role": "interaction-upgrade", + "ownership": "affb76de841017f48", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:09:30.708Z" + }, + { + "name": "export-timestamps:a24c7ee", + "role": "export-timestamps", + "ownership": "a24c7ee7ba1b41495", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:09:30.971Z" + }, + { + "name": "refactor-worker:a3bed4f", + "role": "refactor-worker", + "ownership": "a3bed4ff7d136ad6f", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:37:00.184Z" + }, + { + "name": "refactor-worker:a338035", + "role": "refactor-worker", + "ownership": "a338035875d927fee", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:37:00.890Z" + }, + { + "name": "polish-worker:a9823d6", + "role": "polish-worker", + "ownership": "a9823d622b269699c", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:37:13.785Z" + }, + { + "name": "polish-worker:ac63e30", + "role": "polish-worker", + "ownership": "ac63e3009194c2b06", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:37:14.507Z" + }, + { + "name": "polish-worker:a2a7533", + "role": "polish-worker", + "ownership": "a2a7533fcf0da1604", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:45:01.087Z" + }, + { + "name": "refactor-worker:a026cc1", + "role": "refactor-worker", + "ownership": "a026cc1d257b3070a", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:45:01.142Z" + }, + { + "name": "worker-1:a213f63", + "role": "worker-1", + "ownership": "a213f630aee14d7d8", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:38.597Z" + }, + { + "name": "worker-1:a9723d3", + "role": "worker-1", + "ownership": "a9723d36b56bbc895", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:39.286Z" + }, + { + "name": "worker-1:ae440d9", + "role": "worker-1", + "ownership": "ae440d93a98b97884", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:39.999Z" + }, + { + "name": "worker-1:a73bc52", + "role": "worker-1", + "ownership": "a73bc5230fa4d6310", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:40.665Z" + }, + { + "name": "worker-2:a91736f", + "role": "worker-2", + "ownership": "a91736fa10bde33f8", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:45.441Z" + }, + { + "name": "worker-2:a7991ac", + "role": "worker-2", + "ownership": "a7991ac28577767f2", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:46.088Z" + }, + { + "name": "worker-3:af5367e", + "role": "worker-3", + "ownership": "af5367e4135fe5cf4", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:53.155Z" + }, + { + "name": "worker-3:a40f928", + "role": "worker-3", + "ownership": "a40f92852a6dfa951", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:00:54.262Z" + }, + { + "name": "worker-1:aee50ad", + "role": "worker-1", + "ownership": "aee50ad9aa0fac5e6", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:01:55.335Z" + }, + { + "name": "worker-2:aa06b21", + "role": "worker-2", + "ownership": "aa06b21b2f1cf14d0", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:01:58.701Z" + }, + { + "name": "worker-3:a38ddc7", + "role": "worker-3", + "ownership": "a38ddc72cfa37fba5", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:02:02.511Z" + }, + { + "name": "worker-1:a31f9f3", + "role": "worker-1", + "ownership": "a31f9f33e15c71c58", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:32:24.846Z" + }, + { + "name": "worker-2:ac08f2b", + "role": "worker-2", + "ownership": "ac08f2b8d031281b7", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:32:27.853Z" + }, + { + "name": "worker-3:ac05d2c", + "role": "worker-3", + "ownership": "ac05d2c7c4f24b18a", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:32:29.872Z" + }, + { + "name": "worker-1:ae8fad8", + "role": "worker-1", + "ownership": "ae8fad893bc9f1ab0", + "status": "done", + "currentStep": null, + "latestUpdate": "completed", + "completedSummary": null, + "updatedAt": "2026-04-13T18:43:02.491Z" + }, + { + "name": "worker-2:a0ec387", + "role": "worker-2", + "ownership": "a0ec387e549bf3e50", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T18:40:26.451Z" + }, + { + "name": "worker-1:a5715d3", + "role": "worker-1", + "ownership": "a5715d3d8a7bdc74c", + "status": "done", + "currentStep": null, + "latestUpdate": "completed", + "completedSummary": null, + "updatedAt": "2026-04-13T18:43:18.094Z" + } + ], + "timeline": [ + { + "id": "session-start:a0ec387e549bf3e50:2026-04-13T18:40:26.451Z", + "at": "2026-04-13T18:40:26.451Z", + "kind": "update", + "agent": "worker-2:a0ec387", + "detail": "started worker-2:a0ec387", + "sourceKey": "session-start:a0ec387e549bf3e50" + }, + { + "id": "session-stop:ae8fad893bc9f1ab0:2026-04-13T18:43:02.491Z", + "at": "2026-04-13T18:43:02.491Z", + "kind": "completion", + "agent": "worker-1:ae8fad8", + "detail": "completed", + "sourceKey": "session-stop:ae8fad893bc9f1ab0" + }, + { + "id": "session-start:a5715d3d8a7bdc74c:2026-04-13T18:43:02.739Z", + "at": "2026-04-13T18:43:02.739Z", + "kind": "update", + "agent": "worker-1:a5715d3", + "detail": "started worker-1:a5715d3", + "sourceKey": "session-start:a5715d3d8a7bdc74c" + }, + { + "id": "session-stop:a5715d3d8a7bdc74c:2026-04-13T18:43:18.094Z", + "at": "2026-04-13T18:43:18.094Z", + "kind": "completion", + "agent": "worker-1:a5715d3", + "detail": "completed", + "sourceKey": "session-stop:a5715d3d8a7bdc74c" + } + ] + } + ] +} \ No newline at end of file diff --git a/.omc/state/sessions/cbab3cea-282f-4d92-bc04-19310c94f3e6/hud-state.json b/.omc/state/sessions/cbab3cea-282f-4d92-bc04-19310c94f3e6/hud-state.json new file mode 100644 index 0000000..40f80a8 --- /dev/null +++ b/.omc/state/sessions/cbab3cea-282f-4d92-bc04-19310c94f3e6/hud-state.json @@ -0,0 +1,6 @@ +{ + "timestamp": "2026-04-13T16:44:05.308Z", + "backgroundTasks": [], + "sessionStartTimestamp": "2026-04-13T14:10:55.718Z", + "sessionId": "cbab3cea-282f-4d92-bc04-19310c94f3e6" +} \ No newline at end of file diff --git a/.omc/state/subagent-tracking.json b/.omc/state/subagent-tracking.json new file mode 100644 index 0000000..fe0c4d3 --- /dev/null +++ b/.omc/state/subagent-tracking.json @@ -0,0 +1,254 @@ +{ + "agents": [ + { + "agent_id": "ad2f0602bfa6b6a03", + "agent_type": "ux-reviewer", + "started_at": "2026-04-13T16:57:05.589Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a2645c0c1125f88fd", + "agent_type": "code-reviewer", + "started_at": "2026-04-13T16:57:14.680Z", + "parent_mode": "none", + "status": "completed", + "completed_at": "2026-04-13T16:59:11.969Z", + "duration_ms": 117289 + }, + { + "agent_id": "a1182083f34dfdca2", + "agent_type": "product-reviewer", + "started_at": "2026-04-13T16:57:25.154Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a175e13ce956fc3b4", + "agent_type": "product-reviewer", + "started_at": "2026-04-13T16:57:26.866Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a5c960fbe0d950a8e", + "agent_type": "product-reviewer", + "started_at": "2026-04-13T16:58:11.911Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a116dc8a608edd6ab", + "agent_type": "product-reviewer", + "started_at": "2026-04-13T16:58:55.582Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a1ffb67f6aa7b1878", + "agent_type": "code-reviewer", + "started_at": "2026-04-13T16:59:12.209Z", + "parent_mode": "none", + "status": "completed", + "completed_at": "2026-04-13T16:59:23.403Z", + "duration_ms": 11194 + }, + { + "agent_id": "a1b02e26d59b261ee", + "agent_type": "ux-reviewer", + "started_at": "2026-04-13T17:08:56.789Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a511bfa23516122bf", + "agent_type": "product-reviewer", + "started_at": "2026-04-13T17:09:30.209Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "affb76de841017f48", + "agent_type": "interaction-upgrade", + "started_at": "2026-04-13T17:09:30.708Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a24c7ee7ba1b41495", + "agent_type": "export-timestamps", + "started_at": "2026-04-13T17:09:30.971Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a3bed4ff7d136ad6f", + "agent_type": "refactor-worker", + "started_at": "2026-04-13T17:37:00.184Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a338035875d927fee", + "agent_type": "refactor-worker", + "started_at": "2026-04-13T17:37:00.890Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a9823d622b269699c", + "agent_type": "polish-worker", + "started_at": "2026-04-13T17:37:13.785Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "ac63e3009194c2b06", + "agent_type": "polish-worker", + "started_at": "2026-04-13T17:37:14.507Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a2a7533fcf0da1604", + "agent_type": "polish-worker", + "started_at": "2026-04-13T17:45:01.087Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a026cc1d257b3070a", + "agent_type": "refactor-worker", + "started_at": "2026-04-13T17:45:01.142Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a213f630aee14d7d8", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:00:38.597Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a9723d36b56bbc895", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:00:39.286Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "ae440d93a98b97884", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:00:39.999Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a73bc5230fa4d6310", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:00:40.665Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a91736fa10bde33f8", + "agent_type": "worker-2", + "started_at": "2026-04-13T18:00:45.441Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a7991ac28577767f2", + "agent_type": "worker-2", + "started_at": "2026-04-13T18:00:46.088Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "af5367e4135fe5cf4", + "agent_type": "worker-3", + "started_at": "2026-04-13T18:00:53.155Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a40f92852a6dfa951", + "agent_type": "worker-3", + "started_at": "2026-04-13T18:00:54.262Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "aee50ad9aa0fac5e6", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:01:55.335Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "aa06b21b2f1cf14d0", + "agent_type": "worker-2", + "started_at": "2026-04-13T18:01:58.701Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a38ddc72cfa37fba5", + "agent_type": "worker-3", + "started_at": "2026-04-13T18:02:02.511Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a31f9f33e15c71c58", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:32:24.846Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "ac08f2b8d031281b7", + "agent_type": "worker-2", + "started_at": "2026-04-13T18:32:27.853Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "ac05d2c7c4f24b18a", + "agent_type": "worker-3", + "started_at": "2026-04-13T18:32:29.872Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "ae8fad893bc9f1ab0", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:40:15.847Z", + "parent_mode": "none", + "status": "completed", + "completed_at": "2026-04-13T18:43:02.491Z", + "duration_ms": 166644 + }, + { + "agent_id": "a0ec387e549bf3e50", + "agent_type": "worker-2", + "started_at": "2026-04-13T18:40:26.451Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a5715d3d8a7bdc74c", + "agent_type": "worker-1", + "started_at": "2026-04-13T18:43:02.739Z", + "parent_mode": "none", + "status": "completed", + "completed_at": "2026-04-13T18:43:18.094Z", + "duration_ms": 15355 + } + ], + "total_spawned": 33, + "total_completed": 4, + "total_failed": 0, + "last_updated": "2026-04-13T18:43:18.197Z" +} \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index fe5df5f..9dc706e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,8 +39,8 @@ sshpass -p xiaohei ssh xiaohei@192.168.30.30 "cd ~/SOC && make dev" 用户浏览器 ↓ [Azure Static Web App] soc-langgraph-ui (eastasia) - salmon-mushroom-0d8872e00.7.azurestaticapps.net - Vite SPA + @langchain/langgraph-sdk/react useStream + agreeable-smoke-0364d4000.7.azurestaticapps.net + Vite SPA + @langchain/langgraph-sdk@1.8.8/react useStream ↓ SSE [Azure Container App] soc-langgraph (southeastasia) soc-langgraph.victorioussand-69befc84.southeastasia.azurecontainerapps.io @@ -97,20 +97,37 @@ src/agent/{name}/ 所有卡片 props 包含 `sourceType`(internal_kb/ticket_system/external_web/code_execution/generated_doc)和 `confidence`(high/medium/low)。 +### Streaming 配置 + +前端 useStream 使用双流模式 + 子图流式推送: +```typescript +streamMode: ["values", "messages"], // values=节点完成推送, messages=LLM token 实时流 +streamSubgraphs: true, // 子图内部节点完成时立即推送(消除 18s 空白) +``` +SDK: `@langchain/langgraph-sdk@1.8.8`(从 0.0.73 升级,支持 streamSubgraphs) + ### 关键工具函数 - `src/agent/utils/retry.ts` — `executeWithRetry(fn, retries, {backoffMs, exponential})`,`formatToolError(name, e)` - `src/agent/utils/truncate-messages.ts` — 上下文压缩 - `src/agent/utils/file-service.ts` — PDF/图片/Excel/文本解析 + Azure Blob - `src/agent/utils/checkpointer.ts` — PostgresSaver,Gen-UI ui items 随 checkpoint 持久化恢复 +- `src/agent/utils/inject-thinking.ts` — 将 LLM 工具调用前的 content 转为 `{ type: "thinking", thinking, source: "prompt"|"reasoning" }` block +- `src/agent/utils/clean-polluted-tool-calls.ts` — 清洗 checkpoint 中残留的未响应 tool_call_id,防止 400 崩溃 +- `src/agent/utils/config.ts` — 统一配置管理,GOOGLE_API_KEY 已降级为可选 +- `src/agent/utils/toolConfig.ts` — 每工具 timeout/retry 配置 +- `src/agent/utils/create-llm.ts` — LLM 实例化(含 Azure OpenAI Responses API Pro 模式 COT) +- `src/agent/utils/redis-client.ts` — Redis 工具结果缓存(30min) +- `src/agent/utils/service-bus-client.ts` — Service Bus 异步告警 +- `src/agent/utils/doc-creator-client.ts` — doc-creator agent 客户端 ### Frontend 关键文件 -- `src/main.tsx` — Chat UI 主入口,useStream,`deduplicateUiItems()`(按card_id合并loading→complete) -- `src/components/ToolCallStatus.tsx` — 工具调用状态(loading旋转/green✓/red✗),支持展开查看Gen-UI结果+骨架屏 +- `src/main.tsx` — Chat UI 主入口,useStream(streamSubgraphs+双流模式),`deduplicateUiItems()`,isLoading 守卫防并发 +- `src/components/ToolCallStatus.tsx` — 工具调用状态(5 种视觉状态:loading/success/error/fallback_success/partial_success),UI_NAME_MAP 工具名映射 - `src/components/ActionBar.tsx` — 卡片底部追问/快捷动作,dispatch `soc:prefill-input` CustomEvent - `src/components/SourceBadge.tsx` — 来源类型徽章(颜色+置信度图标) -- `src/components/MessageBubble.tsx` — ReactMarkdown + KaTeX + Prism,>800字自动显示摘要块 +- `src/components/MessageBubble.tsx` — ReactMarkdown + KaTeX + Prism + COT 思考链渲染(Brain 图标可折叠)+ `rehypeSanitizeLinks`(防无 href 崩溃)+ `MarkdownErrorBoundary`(fallback 到纯文本)+ >800字智能摘要块 - `src/components/CanvasPanel.tsx` — 右侧文档编辑抽屉,监听 `open-canvas` CustomEvent - `src/agent-uis/index.tsx` — Gen-UI 组件注册表(ComponentMap) @@ -119,10 +136,23 @@ src/agent/{name}/ 新增卡片需要: 1. 创建 `src/agent-uis/enterprise/{name}/index.tsx`(参考 knowledge-result 结构) 2. 在 `src/agent-uis/index.tsx` 的 ComponentMap 注册 -3. 后端 `tool-executor.ts` 中 `ui.push({ name: "{name}", props: {...} }, { message: lastAiMessage })` +3. 后端 `tool-executor.ts` 中 `ui.push({ name: "{name}", props: {...} })`(注意:子图内不绑定 `{ message: lastAiMessage }`,前端通过 card_id 中的 tool_call_id 匹配 orphan 卡片) props 必须包含 `sourceType` 和 `confidence`(来自 retry.ts 的工具执行结果),可选 `errorMessage`(触发红色 error 态)。 +### COT 思考链 + +- 后端 `inject-thinking.ts` 在 LLM 工具调用前将 text content 转为 thinking block(`source: "prompt"`) +- Agent 节点 `result.reasoning` 转为 thinking block(`source: "reasoning"`,区分原生推理 vs 思考文本) +- 前端 MessageBubble 解析 thinking blocks 渲染为可折叠区块(Brain 图标) +- `source: "reasoning"` 用 ReactMarkdown 格式化,`source: "prompt"` 渲染为纯文本 + +### Checkpoint 污染防御 + +- **Prevention**: 4 个 tool-executor 返回前校验每个 tool_call_id 都有对应 ToolMessage,缺失则补占位 error message +- **Healing**: `clean-polluted-tool-calls.ts` 在 agent 节点调 LLM 前清洗脏 messages +- **前端应急**: error 态显示"重置此对话"按钮 + ## Daytona Sandbox 注意事项 Daytona API 正确端点: @@ -141,12 +171,14 @@ so-c-chat-clone/ │ │ ├── searcher/ ← Google + Jina │ │ ├── coder/ ← Daytona 沙盒 │ │ ├── writer/ ← Canvas + 报告 + 草稿 -│ │ └── utils/ ← retry, checkpointer, file-service, truncate +│ │ └── utils/ ← retry, checkpointer, file-service, truncate, inject-thinking, clean-polluted-tool-calls, config, toolConfig, create-llm, redis, service-bus, doc-creator │ ├── src/agent-uis/enterprise/ ← 9 个 Gen-UI 卡片组件 │ ├── src/components/ ← 通用 UI 组件 │ ├── src/main.tsx ← Chat UI 入口 │ ├── langgraph.json ← LangGraph 配置 -│ ├── Dockerfile ← 后端容器 +│ ├── Dockerfile ← 后端容器(生产) +│ ├── Dockerfile.dev ← 后端容器(开发,tsx watch 热重载) +│ ├── Dockerfile.frontend.dev ← 前端容器(Vite dev server) │ └── startup.sh ← Azure Web App 启动脚本 ├── .github/workflows/ │ ├── deploy-langgraph.yml ← ACR build → Web App @@ -162,7 +194,7 @@ so-c-chat-clone/ # Azure OpenAI (Sub-Agent LLM) AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_API_VERSION, AZURE_OPENAI_DEPLOYMENT -# Google Gemini (Supervisor router) +# Google Gemini (Supervisor router) — 开发环境可选 GOOGLE_API_KEY # KB Agent @@ -182,6 +214,21 @@ DAYTONA_API_KEY, DAYTONA_API_URL # Frontend (Vite build-time) VITE_LANGGRAPH_URL=https://soc-langgraph.victorioussand-69befc84.southeastasia.azurecontainerapps.io + +# Redis (缓存) +REDIS_CONNECTION_STRING + +# Service Bus (告警) +SERVICEBUS_CONNECTION_STRING + +# Azure Blob (文件上传) +AZURE_STORAGE_CONNECTION_STRING + +# Doc Creator +DOC_CREATOR_API_KEY + +# PostgreSQL (checkpoint + 持久化) +DATABASE_URL ``` ## Deployment @@ -196,7 +243,7 @@ VITE_LANGGRAPH_URL=https://soc-langgraph.victorioussand-69befc84.southeastasia.a ### 前端 (soc-langgraph-ui) - **Azure Static Web App**: East Asia -- **URL**: salmon-mushroom-0d8872e00.7.azurestaticapps.net +- **URL**: agreeable-smoke-0364d4000.7.azurestaticapps.net - **CI/CD**: pnpm vite build → SWA upload ### CI/CD 认证 @@ -208,4 +255,13 @@ VITE_LANGGRAPH_URL=https://soc-langgraph.victorioussand-69befc84.southeastasia.a - **Azure 资源组**: 仅允许操作 `Operation` 和 `AuthData`,所有 `az` 命令必须带 `--resource-group` - **禁止删除已存在的 Azure 资源** - **GitHub**: Fasthei/so-c-chat-clone,main 分支 -- **已废弃**: backend/ (Python), frontend/ (Next.js), soc-backend/soc-frontend Web Apps, Container App +- **已废弃**: backend/ (Python), frontend/ (Next.js), soc-backend/soc-frontend Web Apps, 旧 soc-langgraph Web App + App Service Plan, 旧 Log Analytics/Application Insights + +## Skills + +### agent-browser +所有 Agent 均已集成 `agent-browser` skill(`~/.claude/skills/agent-browser`),用于浏览器自动化: +- **用途**: 网页导航、表单填写、截图、数据抓取、Web 应用测试、QA dogfooding +- **触发**: 需要打开网页、截图、填表、点击按钮、测试前端页面等场景 +- **使用前必须先加载技能**: `agent-browser skills get agent-browser` +- **优先级**: 优先使用 agent-browser 而非内置 Playwright MCP 工具 diff --git a/Makefile b/Makefile deleted file mode 100644 index 66196e4..0000000 --- a/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -# SOC Chat Clone - Local Docker Commands (lightweight) -# 基础设施用 Azure 云服务,本地只运行 LangGraph Server + Frontend -# ==================================================================== -# make dev - 开发模式(热重载) -# make prod - 生产模式 -# make down - 停止 -# make logs - 查看日志 - -.PHONY: dev prod down logs clean status setup check-env build-dev build-prod restart-backend restart-frontend - -# ─── Environment ───────────────────────────────────────────────── -check-env: - @if [ ! -f langgraph/.env ]; then \ - echo "ERROR: langgraph/.env not found."; \ - echo " Run: make setup"; \ - exit 1; \ - fi - -setup: - @if [ ! -f langgraph/.env ]; then \ - cp langgraph/.env.docker.example langgraph/.env; \ - echo "Created langgraph/.env — 请检查并填入 GOOGLE_API_KEY 等缺失值"; \ - else \ - echo "langgraph/.env already exists, skipping."; \ - fi - -# ─── Development ───────────────────────────────────────────────── -dev: check-env - docker compose --profile dev up --build - -dev-d: check-env - docker compose --profile dev up --build -d - -build-dev: - docker compose --profile dev build - -# ─── Production ────────────────────────────────────────────────── -prod: check-env - docker compose --profile prod up --build - -prod-d: check-env - docker compose --profile prod up --build -d - -build-prod: - docker compose --profile prod build - -# ─── Lifecycle ─────────────────────────────────────────────────── -down: - docker compose --profile dev --profile prod down - -clean: - docker compose --profile dev --profile prod down --rmi local - @echo "All containers stopped and images removed." - -restart-backend: - docker compose restart langgraph-dev 2>/dev/null || docker compose restart langgraph-prod 2>/dev/null - -restart-frontend: - docker compose restart frontend-dev 2>/dev/null || docker compose restart frontend-prod 2>/dev/null - -# ─── Observability ─────────────────────────────────────────────── -logs: - docker compose --profile dev --profile prod logs -f - -logs-backend: - docker compose logs -f langgraph-dev langgraph-prod 2>/dev/null - -logs-frontend: - docker compose logs -f frontend-dev frontend-prod 2>/dev/null - -status: - @echo "=== Container Status ===" - @docker compose --profile dev --profile prod ps - @echo "" - @echo "=== Endpoints ===" - @echo " Frontend (dev): http://localhost:5173" - @echo " Frontend (prod): http://localhost:3000" - @echo " LangGraph API: http://localhost:2024" - @echo "" - @echo "=== Azure Cloud Services ===" - @echo " PostgreSQL: dataope.postgres.database.azure.com" - @echo " Redis: oper.redis.cache.windows.net:6380" - @echo " Blob: authdatablol.blob.core.windows.net" - @echo " Service Bus: databus.servicebus.windows.net" diff --git a/doc/test-report-2026-04-13.md b/doc/test-report-2026-04-13.md new file mode 100644 index 0000000..7444fc8 --- /dev/null +++ b/doc/test-report-2026-04-13.md @@ -0,0 +1,71 @@ +# SOC 前端测试报告 — 2026-04-13 + +## 测试环境 +- **线上前端**: https://agreeable-smoke-0364d4000.7.azurestaticapps.net +- **线上后端**: https://soc-langgraph.victorioussand-69befc84.southeastasia.azurecontainerapps.io +- **开发机**: http://192.168.30.30:5173 / :2024 +- **测试工具**: agent-browser v0.25.4 + Chrome 147.0.7727.56 +- **测试时间**: 2026-04-13 17:10-17:25 UTC + +## 测试结果汇总 + +| # | 测试项 | 线上 | 开发机 | 备注 | +|---|--------|------|--------|------| +| 1 | 页面加载 | PASS | PASS | "运营大脑"标题正常 | +| 2 | QuickPrompt 点击 | PASS | PASS | 点击"查看最新工单"正确填充 textarea | +| 3 | 消息发送 + 流式响应 | PASS | PASS | 三点弹跳 → COT → 工具状态 → 卡片 → 文字 | +| 4 | COT 思考过程 | PASS | PASS | "思考过程 0.3s · 工单列表",Brain 图标 + 计时器 | +| 5 | 工具调用状态 | PASS | PASS | 绿色勾号 + "工单查询 · 234ms · 收起" | +| 6 | inputSummary 展示 | PASS | PASS | "结果数: 3" + "查询: page: 1" | +| 7 | Gen-UI 工单卡片 | PASS | PASS | 3条工单 + 来源标签 + 状态tab + ActionBar | +| 8 | 导出按钮 | PASS | PASS | 下载图标可见(底部配置栏左侧) | +| 9 | textarea 解禁 | PASS | PASS | 生成期间输入框可用(非灰色 disabled) | +| 10 | 反馈按钮(赞/踩) | PASS | PASS | snapshot 确认"有帮助"/"无帮助"按钮存在(hover 显示) | +| 11 | 停止按钮 | PASS | PASS | 红色边框"停止"按钮正常显示 | +| 12 | 流式状态栏 | PASS | PASS | header "思考中..." 正常 | +| 13 | 重新生成 | PASS | PASS | 按钮可见 | +| 14 | 暗色主题 | PASS | PASS | 整体暗色,对比度良好 | +| 15 | 侧边栏对话列表 | PASS | PASS | 多个对话可见,按日期分组 | + +## 发现的问题 + +### BUG-1: 侧边栏标题全部显示"新对话"(P0) +- **现象**: 所有对话标题都是"新对话 HH:mm",发送消息后标题未更新 +- **原因**: `isFirstMessage` 条件在已有线程上不触发标题更新 +- **已修复代码**: `d53655c` 增加了 `!existingTitle` 判断,但线上未生效(可能是旧线程无 metadata.title) +- **需要**: 进一步排查线上标题更新逻辑 + +### BUG-2: 反馈按钮仅 hover 显示(体验问题) +- **现象**: 截图中看不到反馈按钮,需要鼠标悬停才出现 +- **评估**: 与 ChatGPT 交互一致(也是 hover 显示),但考虑默认显示以提高发现率 +- **优先级**: P2 + +### 注意-1: agent-browser 与 Playwright MCP 冲突 +- 两者共享浏览器实例,切换使用会导致页面丢失 +- **决策**: 禁用 Playwright,统一使用 agent-browser +- agent-browser 正确的 ref 语法是 `@e10`(不是 `--ref e10`) + +## 今日完成的改动 + +### Commit 244a6d4: 下一代 COT 系统 +- 4 Agent SYSTEM_PROMPT 扩展为 80-200 字结构化推理 +- inject-thinking.ts 加 source + meta 元数据 +- invokeWithReasoningStream() 流式 reasoning API +- MessageBubble: Brain 脉冲动画 + 计时器 + Markdown 渲染 +- ToolCallStatus: 多工具时间线布局 + +### Commit 182f6e3: 交互升级 +- ThumbsUp/ThumbsDown 反馈按钮 +- ExportButton 对话导出 Markdown +- 全局键盘快捷键(Ctrl+Shift+O/S、/、Esc) +- textarea 解禁 +- 标题智能截断 +- inputSummary 展示 + +### Commit d53655c: Bug 修复 +- h-32 spacer 防止卡片遮挡 +- 标题更新逻辑修复 + +## 通过率 +**15/15 (100%)** — 所有新功能线上验证通过 +**2 个已知问题**(标题更新 P0 + 反馈按钮可见性 P2) diff --git a/docker-compose.yml b/docker-compose.yml index 29bf114..108a92f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -70,7 +70,7 @@ services: context: ./langgraph dockerfile: Dockerfile.frontend.dev environment: - - VITE_LANGGRAPH_URL=http://localhost:2024 + - VITE_LANGGRAPH_URL=http://192.168.30.30:2024 ports: - "5173:5173" volumes: @@ -99,7 +99,7 @@ services: context: ./langgraph dockerfile: Dockerfile.frontend.prod args: - VITE_LANGGRAPH_URL: http://localhost:2024 + VITE_LANGGRAPH_URL: http://192.168.30.30:2024 ports: - "3000:3000" healthcheck: diff --git a/langgraph/.omc/project-memory.json b/langgraph/.omc/project-memory.json new file mode 100644 index 0000000..2b5e754 --- /dev/null +++ b/langgraph/.omc/project-memory.json @@ -0,0 +1,176 @@ +{ + "version": "1.0.0", + "lastScanned": 1776104280746, + "projectRoot": "/Users/gongzhiyong/go/SOC/langgraph", + "techStack": { + "languages": [ + { + "name": "JavaScript/TypeScript", + "version": null, + "confidence": "high", + "markers": [ + "package.json" + ] + }, + { + "name": "TypeScript", + "version": null, + "confidence": "high", + "markers": [ + "tsconfig.json" + ] + } + ], + "frameworks": [ + { + "name": "esbuild", + "version": "0.25.0", + "category": "build" + }, + { + "name": "react", + "version": "19.0.0", + "category": "frontend" + }, + { + "name": "react-dom", + "version": "19.0.0", + "category": "frontend" + }, + { + "name": "vite", + "version": "6.1.0", + "category": "build" + }, + { + "name": "vitest", + "version": "3.1.1", + "category": "testing" + } + ], + "packageManager": "pnpm", + "runtime": null + }, + "build": { + "buildCommand": "pnpm build", + "testCommand": "pnpm test", + "lintCommand": "pnpm lint", + "devCommand": null, + "scripts": { + "agent": "langgraphjs dev --no-browser", + "agent:prod": "tsx src/agent/server.ts", + "build": "tsc -b && vite build", + "lint": "eslint .", + "format": "prettier --write .", + "format:check": "prettier --check .", + "test": "vitest run", + "test:watch": "vitest" + } + }, + "conventions": { + "namingStyle": null, + "importStyle": null, + "testPattern": null, + "fileOrganization": "type-based" + }, + "structure": { + "isMonorepo": false, + "workspaces": [], + "mainDirectories": [ + "public", + "src", + "static" + ], + "gitBranches": { + "defaultBranch": "main", + "branchingStrategy": null + } + }, + "customNotes": [], + "directoryMap": { + "dist": { + "path": "dist", + "purpose": "Distribution/build output", + "fileCount": 2, + "lastAccessed": 1776104280730, + "keyFiles": [ + "index.html", + "staticwebapp.config.json" + ] + }, + "public": { + "path": "public", + "purpose": "Public files", + "fileCount": 1, + "lastAccessed": 1776104280731, + "keyFiles": [ + "staticwebapp.config.json" + ] + }, + "src": { + "path": "src", + "purpose": "Source code", + "fileCount": 4, + "lastAccessed": 1776104280732, + "keyFiles": [ + "constants.ts", + "index.css", + "main.tsx", + "vite-env.d.ts" + ] + }, + "static": { + "path": "static", + "purpose": "Static files", + "fileCount": 1, + "lastAccessed": 1776104280733, + "keyFiles": [ + "gen_ui.gif" + ] + }, + "dist/assets": { + "path": "dist/assets", + "purpose": "Static assets", + "fileCount": 68, + "lastAccessed": 1776104280733, + "keyFiles": [ + "KaTeX_AMS-Regular-BQhdFMY1.woff2", + "KaTeX_AMS-Regular-DMm9YOAa.woff", + "KaTeX_AMS-Regular-DRggAlZN.ttf" + ] + }, + "src/components": { + "path": "src/components", + "purpose": "UI components", + "fileCount": 10, + "lastAccessed": 1776104280734, + "keyFiles": [ + "ActionBar.tsx", + "CanvasPanel.tsx", + "ExecutionLogPanel.tsx" + ] + }, + "src/lib": { + "path": "src/lib", + "purpose": "Library code", + "fileCount": 1, + "lastAccessed": 1776104280734, + "keyFiles": [ + "utils.ts" + ] + }, + "src/utils": { + "path": "src/utils", + "purpose": "Utility functions", + "fileCount": 6, + "lastAccessed": 1776104280735, + "keyFiles": [ + "api-client.ts", + "input-handling.ts", + "message-rendering.ts" + ] + } + }, + "hotPaths": [], + "userDirectives": [] +} \ No newline at end of file diff --git a/langgraph/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl b/langgraph/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl new file mode 100644 index 0000000..81180f7 --- /dev/null +++ b/langgraph/.omc/state/agent-replay-cbab3cea-282f-4d92-bc04-19310c94f3e6.jsonl @@ -0,0 +1,7 @@ +{"t":0,"agent":"ad2f060","agent_type":"ux-reviewer","event":"agent_stop","success":true} +{"t":0,"agent":"a686758","agent_type":"ux-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ab9f244","agent_type":"code-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"aae0551","agent_type":"product-reviewer","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"a8efffb","agent_type":"interaction-upgrade","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"aa4a48a","agent_type":"export-timestamps","event":"agent_start","parent_mode":"none"} +{"t":0,"agent":"ad0565d","agent_type":"unknown","event":"agent_stop","success":true} diff --git a/langgraph/.omc/state/checkpoints/checkpoint-2026-04-13T18-16-36-381Z.json b/langgraph/.omc/state/checkpoints/checkpoint-2026-04-13T18-16-36-381Z.json new file mode 100644 index 0000000..bfe770d --- /dev/null +++ b/langgraph/.omc/state/checkpoints/checkpoint-2026-04-13T18-16-36-381Z.json @@ -0,0 +1,16 @@ +{ + "created_at": "2026-04-13T18:16:36.380Z", + "trigger": "auto", + "active_modes": {}, + "todo_summary": { + "pending": 0, + "in_progress": 0, + "completed": 0 + }, + "wisdom_exported": false, + "background_jobs": { + "active": [], + "recent": [], + "stats": null + } +} \ No newline at end of file diff --git a/langgraph/.omc/state/idle-notif-cooldown.json b/langgraph/.omc/state/idle-notif-cooldown.json new file mode 100644 index 0000000..b016163 --- /dev/null +++ b/langgraph/.omc/state/idle-notif-cooldown.json @@ -0,0 +1,5 @@ +{ + "lastSentAt": "2026-04-13T17:02:56.582Z", + "repoSignature": "{\"repo\":\"Fasthei/so-c-chat-clone\",\"headSha\":\"244a6d4a1fff2ed8ae9927b0ee41ed3b807bb2da\",\"dirty\":true,\"openPrNumbers\":[],\"openIssueNumbers\":[],\"failingRunIds\":[24211544230,24211569540,24211756813,24211913571,24212045581,24212133630,24212252772,24212374640,24215887708,24216091197,24256304269,24256304279,24302279460,24310044547,24310141463,24310183516,24310225839]}", + "backlogZero": false +} \ No newline at end of file diff --git a/langgraph/.omc/state/last-tool-error.json b/langgraph/.omc/state/last-tool-error.json new file mode 100644 index 0000000..b7c8db6 --- /dev/null +++ b/langgraph/.omc/state/last-tool-error.json @@ -0,0 +1,7 @@ +{ + "tool_name": "Bash", + "tool_input_preview": "{\"command\":\"agent-browser execute \\\"document.querySelectorAll('textarea, input, [contenteditable]').length\\\" 2>&1\",\"timeout\":10000,\"description\":\"Check for input elements on page\"}", + "error": "Exit code 1\nUnknown command: execute", + "timestamp": "2026-04-13T17:03:13.557Z", + "retry_count": 3 +} \ No newline at end of file diff --git a/langgraph/.omc/state/mission-state.json b/langgraph/.omc/state/mission-state.json new file mode 100644 index 0000000..7a80457 --- /dev/null +++ b/langgraph/.omc/state/mission-state.json @@ -0,0 +1,109 @@ +{ + "updatedAt": "2026-04-13T18:17:59.990Z", + "missions": [ + { + "id": "session:cbab3cea-282f-4d92-bc04-19310c94f3e6:none", + "source": "session", + "name": "none", + "objective": "Session mission", + "createdAt": "2026-04-13T17:00:32.365Z", + "updatedAt": "2026-04-13T18:17:59.990Z", + "status": "running", + "workerCount": 5, + "taskCounts": { + "total": 5, + "pending": 0, + "blocked": 0, + "inProgress": 4, + "completed": 1, + "failed": 0 + }, + "agents": [ + { + "name": "ux-reviewer:a686758", + "role": "ux-reviewer", + "ownership": "a6867586083eba8bc", + "status": "done", + "currentStep": null, + "latestUpdate": "completed", + "completedSummary": null, + "updatedAt": "2026-04-13T18:17:59.990Z" + }, + { + "name": "code-reviewer:ab9f244", + "role": "code-reviewer", + "ownership": "ab9f2444b42f43207", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:00:57.177Z" + }, + { + "name": "product-reviewer:aae0551", + "role": "product-reviewer", + "ownership": "aae0551a90c8b13d9", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:02:43.408Z" + }, + { + "name": "interaction-upgrade:a8efffb", + "role": "interaction-upgrade", + "ownership": "a8efffbc21c7af498", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:04:35.458Z" + }, + { + "name": "export-timestamps:aa4a48a", + "role": "export-timestamps", + "ownership": "aa4a48a38b8c9dec5", + "status": "running", + "currentStep": null, + "latestUpdate": null, + "completedSummary": null, + "updatedAt": "2026-04-13T17:04:57.416Z" + } + ], + "timeline": [ + { + "id": "session-start:aae0551a90c8b13d9:2026-04-13T17:02:43.408Z", + "at": "2026-04-13T17:02:43.408Z", + "kind": "update", + "agent": "product-reviewer:aae0551", + "detail": "started product-reviewer:aae0551", + "sourceKey": "session-start:aae0551a90c8b13d9" + }, + { + "id": "session-start:a8efffbc21c7af498:2026-04-13T17:04:35.458Z", + "at": "2026-04-13T17:04:35.458Z", + "kind": "update", + "agent": "interaction-upgrade:a8efffb", + "detail": "started interaction-upgrade:a8efffb", + "sourceKey": "session-start:a8efffbc21c7af498" + }, + { + "id": "session-start:aa4a48a38b8c9dec5:2026-04-13T17:04:57.416Z", + "at": "2026-04-13T17:04:57.416Z", + "kind": "update", + "agent": "export-timestamps:aa4a48a", + "detail": "started export-timestamps:aa4a48a", + "sourceKey": "session-start:aa4a48a38b8c9dec5" + }, + { + "id": "session-stop:ad0565d5886540bca:2026-04-13T18:17:59.990Z", + "at": "2026-04-13T18:17:59.990Z", + "kind": "completion", + "agent": "ux-reviewer:a686758", + "detail": "completed", + "sourceKey": "session-stop:ad0565d5886540bca" + } + ] + } + ] +} \ No newline at end of file diff --git a/langgraph/.omc/state/subagent-tracking.json b/langgraph/.omc/state/subagent-tracking.json new file mode 100644 index 0000000..57d5158 --- /dev/null +++ b/langgraph/.omc/state/subagent-tracking.json @@ -0,0 +1,43 @@ +{ + "agents": [ + { + "agent_id": "a6867586083eba8bc", + "agent_type": "ux-reviewer", + "started_at": "2026-04-13T17:00:32.365Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "ab9f2444b42f43207", + "agent_type": "code-reviewer", + "started_at": "2026-04-13T17:00:57.177Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "aae0551a90c8b13d9", + "agent_type": "product-reviewer", + "started_at": "2026-04-13T17:02:43.408Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "a8efffbc21c7af498", + "agent_type": "interaction-upgrade", + "started_at": "2026-04-13T17:04:35.458Z", + "parent_mode": "none", + "status": "running" + }, + { + "agent_id": "aa4a48a38b8c9dec5", + "agent_type": "export-timestamps", + "started_at": "2026-04-13T17:04:57.416Z", + "parent_mode": "none", + "status": "running" + } + ], + "total_spawned": 5, + "total_completed": 0, + "total_failed": 0, + "last_updated": "2026-04-13T18:18:00.091Z" +} \ No newline at end of file diff --git a/langgraph/src/agent-uis/enterprise/search-result/index.tsx b/langgraph/src/agent-uis/enterprise/search-result/index.tsx index 098f8e0..1da23c3 100644 --- a/langgraph/src/agent-uis/enterprise/search-result/index.tsx +++ b/langgraph/src/agent-uis/enterprise/search-result/index.tsx @@ -5,6 +5,7 @@ import { SourceBadge } from "@/components/SourceBadge"; interface Citation { index: number; title: string; url?: string; source?: string; } interface SearchResultProps { + card_id?: string; query: string; total: number; results: Array<{ title: string; url: string; snippet: string }>; diff --git a/langgraph/src/components/MessageBubble.tsx b/langgraph/src/components/MessageBubble.tsx index fb23b29..6000645 100644 --- a/langgraph/src/components/MessageBubble.tsx +++ b/langgraph/src/components/MessageBubble.tsx @@ -288,7 +288,7 @@ export default function MessageBubble({ content: rawContent, isStreaming }: Mess // 思考计时器 const [thinkingDuration, setThinkingDuration] = useState(0); - const thinkingTimerRef = useRef>(); + const thinkingTimerRef = useRef | undefined>(undefined); const thinkingStartRef = useRef(0); useEffect(() => { diff --git a/langgraph/src/main.tsx b/langgraph/src/main.tsx index e2b04bf..086911d 100644 --- a/langgraph/src/main.tsx +++ b/langgraph/src/main.tsx @@ -870,7 +870,8 @@ function App() { // 传给 MessageBubble 的内容:若数组中含有 thinking block 则传完整数组,否则传纯文本 const hasThinking = Array.isArray(message.content) && - message.content.some((c) => c.type === "thinking"); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (message.content as any[]).some((c) => c.type === "thinking"); const bubbleContent = hasThinking ? (message.content as { type: string; [key: string]: unknown }[]) : plainTextContent; @@ -897,7 +898,8 @@ function App() { completedToolIds={completedToolIds} failedToolIds={failedToolIds} uiItems={uiItems} - stream={thread} + // eslint-disable-next-line @typescript-eslint/no-explicit-any + stream={thread as any} components={ComponentMap as any} executionLog={executionLog} /> @@ -945,7 +947,8 @@ function App() {