日期: 2026-03-20 执行: Pixel(前端)+ Coco(后端+协调) 状态: ✅ 全部完成(含归档)
William对HiveCrew操作台(02-蜂巢创科/Pixel工作区/hivecrew-app/)提出7项功能需求,本窗口从context压缩后接续完成。
问题:SSE流式输出中换行符\n显示为字面文字而非实际换行。
修复:
- 文件:dashboard.html
- 位置:.chat-bubble CSS类
- 变更:添加 white-space: pre-wrap; word-break: break-word
功能:在"工作区"tab中展示Hunter通过HiveStack产出的成果文件列表。
实现:
- 前端:loadHunterFiles() 函数,调用 /api/hunter/files,渲染.hunter-section并在切换tab时先清除旧section
- 后端:GET /api/hunter/files 扫描 02-蜂巢创科/Hunter工作区/HiveStack输出/*.md
- 后端:GET /api/hunter/file/<filename> 提供文件下载/预览
需求:每个员工的对话记录在页面刷新后仍然保留。
实现:
- 数据库:hivecrew-app/chat_history.db
- 表:messages(id, agent, role, content, created_at)
- API:
- GET /api/chat/history?agent=hunter&limit=30
- POST /api/chat/save — body: {agent, role, content}
- 前端SSE处理:流结束后自动保存user和assistant两条记录
需求:每个员工有独立记忆文件;每次对话后异步提炼关键信息更新记忆;记忆注入system_prompt。
轻量版(读取记忆+历史):
_build_agent_context(agent_id) -> str
# 读memory.md + 最近10条SQLite历史 → 注入system_prompt
完整版(异步记忆更新):
_update_memory_async(agent_id, user_msg, assistant_reply)
# 后台线程 → 调GLM-4.7 → 提炼精华 → 写memory.md
文件位置:hivecrew-app/agent_workspaces/{agent_id}/memory.md
API:
- GET /api/agent/memory/<agent_id> — 读记忆
- PUT /api/agent/memory/<agent_id> — 写记忆
- POST /api/agent/memory/<agent_id>/clear — 清空记忆
前端:🧠 记忆 按钮 + Memory Modal(查看/编辑/清空)
功能:在chat panel顶部增加搜索框,实时过滤员工列表。
实现:
- HTML:#chat-search 输入框
- JS:filterChatPanel(query) — 正则匹配name/chinese_name/dept字段,隐藏不匹配项
功能:用户可拖拽左侧org panel的部门标题,重新排列部门顺序;顺序持久化并双向同步。
实现:
- 模块级变量:_deptOrder(从localStorage读取)、_cachedAgentList、_orgDragSrc
- 辅助函数:_sortedDepts(agentList) — 按_deptOrder排序
- 事件:orgDragStart, orgDragOver, orgDrop, orgDragEnd
- 持久化:localStorage.setItem('hivecrew_dept_order', JSON.stringify(_deptOrder))
- 同步:拖拽drop后同时重渲org panel + chat panel
背景:Hunter通过Manus执行的任务已完成(截图确认),但前端没有收到成果,因为后端提取代码返回空字符串。
根因:原提取代码只查output[].role==assistant.content[].text,实际Manus API可能通过不同字段返回结果。
修复(launch.py generate_manus()函数,第744-756行):
# 多路径fallback提取
# 路径1:task_detail.message(官方文档标准字段)
final_text = (detail.get("task_detail") or {}).get("message", "")
# 路径2:output[].role=assistant.content[].text
if not final_text:
for item in reversed(detail.get("output", [])):
if item.get("role") == "assistant":
for block in item.get("content", []):
t = block.get("text", "")
if t:
final_text = t
break
if final_text:
break
# 路径3:result / message 顶层字段
if not final_text:
final_text = detail.get("result", "") or detail.get("message", "")
# 路径4:output 字符串直接
if not final_text and isinstance(detail.get("output"), str):
final_text = detail["output"]
新增debug端点(launch.py):
GET /api/manus/debug?task_id=xxx
→ 返回Manus原始JSON,用于确认真实响应结构
验证方法:访问 http://localhost:7743/api/manus/debug?task_id=TBCSVyRJWcCoqpzQpXcJ2a
前端下载按钮(dashboard.html SSE处理器):
if (d.file && d.filename && bubble) {
const dlBtn = document.createElement('a');
dlBtn.href = `/api/hunter/file/${encodeURIComponent(d.filename)}`;
dlBtn.download = d.filename;
dlBtn.textContent = `⬇️ 下载成果:${d.filename}`;
// 绿色按钮样式
bubble.appendChild(dlBtn);
}
task_detail.message路径是否命中/api/chat/history已就绪,但前端切换agent时是否自动渲染历史气泡需验证_update_memory_async依赖http://127.0.0.1:4000,LiteLLM未启动时静默失败,需确认是否正常运行| 文件 | 变更类型 | 说明 |
|---|---|---|
hivecrew-app/dashboard.html |
修改 | 7项功能全部在此实现 |
hivecrew-app/launch.py |
修改 | 记忆体系函数+历史API+Manus修复+debug端点 |
当前HiveCrew运行方式:
cd "日记/数字员工团队/02-蜂巢创科/Pixel工作区/hivecrew-app"
python3 launch.py
# 访问 http://localhost:7743
立即可验证的事项:
1. 打开Hunter,发送任意任务 → 等待Manus完成 → 检查是否出现绿色下载按钮
2. 访问 http://localhost:7743/api/manus/debug?task_id=TBCSVyRJWcCoqpzQpXcJ2a → 查看Manus响应真实结构
3. 切换任意员工 → 发送消息 → 刷新页面 → 切换回该员工 → 确认历史是否仍然显示
关键文件路径:
- 操作台:02-蜂巢创科/Pixel工作区/hivecrew-app/
- Hunter成果:02-蜂巢创科/Hunter工作区/HiveStack输出/
- 对话历史DB:02-蜂巢创科/Pixel工作区/hivecrew-app/chat_history.db
- 员工记忆:02-蜂巢创科/Pixel工作区/hivecrew-app/agent_workspaces/{agent_id}/memory.md
- 话题归档:memory/topics/2026-03-20_hivecrew-dashboard-memory-manus-fix.md