Agent Portal¶
研究项目管理工作台 — 以项目推进为核心,聚合所有 bot 状态、任务、产出物和时间线的统一入口。
- 线上: https://portal.dev.dora.restry.cn
- 仓库: https://github.com/msdevhub/agent-portal
- 维护者: PortalBot(2026-04-02 从 Rabbit 接管)
产品定位¶
以项目推进为核心的工作台(project-centric workbench)。 围绕 Project > Topic > Event/Task/Output 组织信息。 监控、聊天、产出物、审核统一内建,不外置独立平台。
技术栈¶
前端: React + Vite + Tailwind + shadcn/ui + React Flow
后端: Express (server.cjs 单文件)
数据: PostgreSQL (直连) + LLM Wiki
部署: PM2 (portal-api:3002, portal-static:3013) + Caddy 反代
认证: Logto (SPA 模式)
演进时间线¶
| 日期 | 关键里程碑 | 详细 |
|---|---|---|
| 03-10~11 | Next.js 卡死,改 React + shadcn;游戏化看板方向确立 | [[03-10-立项]] |
| 03-13~14 | Codex 审计;自动同步产出物;Markdown Modal + Context & Memory | [[03-13-审计]] |
| 03-17~18 | 拆为独立 Agent;Logto 认证;Dashboard v3(Bot/Server Fleet) | [[03-17-独立部署]] |
| 03-18~20 | Dashboard 历史模式;内嵌 Command Bar;SSE 实时推送 | [[03-18-dashboard-v3]] |
| 03-21~22 | Dashboard 重构;日报系统;changelog 能力 | [[03-21-日报系统]] |
| 03-28~30 | 数据重构:Supabase → PostgreSQL 直连;移动端适配 | [[03-28-数据重构]] |
| 03-31~04-01 | Projects 视图;项目操作台;对话入口;拖拽排序 | [[03-31-项目操作台]] |
| 04-02~03 | PG 直连;Digest Pipeline v5;健康监控重构;监控面板落地 | [[04-02-pipeline重构]] |
| 04-04~05 | Topics Tab;LLM 数据清洗(67→108 条);React Flow 工作流地图 | [[04-04-topics与流程图]] |
关键时刻¶
03-10 晚:Next.js 16 + Turbopack 卡死,Dad 决策"彻底放弃 Next.js"。30 分钟内完成 v2 pixel-style 原型,验证方向。
03-13 晚:自动扫描工作区,117 个产出物首次同步到 Portal。标志从"看板"升级为"研究管理工作台"。
03-18 晚:SSE 实时推送全链路通,Portal 内发消息可实时收到 bot 回复。
04-02:从 Supabase API 切换到 PostgreSQL 直连,Digest Pipeline 从依赖外部 API 变为完全自主。
04-04~05:Topics 数据清洗(旧迁移数据 67 条 → LLM 归并后 108 条),展示方式从平铺列表 → React Flow 工作流地图(5 轮迭代)。
核心功能¶
| 功能 | 说明 | 状态 |
|---|---|---|
| Bot Fleet | 7 个 agent 状态、任务、Cron Jobs | ✅ |
| Server Fleet | 4 台服务器 CPU/MEM/DISK/服务状态 | ✅ |
| Projects | 项目列表、详情、阶段、产出物 | ✅ |
| Topics | 对话主题分析、React Flow 工作流地图 | ✅ |
| Wiki | Markdown 文档浏览、搜索、wikilink | ✅ |
| Monitor | 服务健康监控(ping + keyword check) | ✅ |
| Command Bar | 页面底部输入框,直接对 bot/server 发指令 | ✅ |
| SSE 推送 | 实时接收 bot 回复 | ✅ |
| 时光机 | Dashboard 历史查看 | ✅ |
| 日报系统 | 每日 Digest、洞察、任务摘要 | ✅ |
架构决策¶
1. 为什么不用 Next.js?¶
Next.js 16 强制 Turbopack,首次编译卡死,--no-turbopack 已不可用。Dad 决策:"这是个无底洞",停止 Next.js。
2. 为什么从 Supabase API 切到 PostgreSQL 直连?¶
Supabase 的 /pg/query endpoint 返回 401,REST API 不支持 JOIN/聚合/DDL。server.cjs 有 39 个复杂 SQL,不适合改成 REST。最终通过 RPC (exec_sql / run_sql) 过渡,后切到 PG 直连。
3. 为什么 Dashboard 拆成 Bot Fleet / Server Fleet 两个 Tab?¶
Bot 和 Server 是两类不同数据,统计口径不同。混合展示会导致历史模式数据错乱。
4. 为什么用 React Flow 而不是手写流程图?¶
Topics 展示经历 5 轮迭代(平铺卡片 → 树状 → 两列 → 横向展开 → React Flow)。React Flow 是 React 生态成熟方案,支持节点/边/折叠/拖拽/缩放,比手写流程图可维护。
5. 为什么用 SSE 而不是轮询?¶
轮询 3 秒一次,最多 10 次(总超时 30 秒)。如果 bot 处理超过 30 秒,前端就停止等待。SSE 实时推送,server.cjs 连接 Mattermost WebSocket 监听新消息,前端用 EventSource 接收。
已知问题¶
- Wiki Tab Markdown 表格未渲染
- "开始对话" 按钮遮挡画布中央
- 部分 commits 未 push(等批准)