跳转至

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(等批准)