Dashboard 与本地 API
Dashboard 是本地控制面,不是公共文档托管服务。它显示项目、Change、阶段、Todo、review、AFK、loop 和证据,但不会取代 CLI 的 canonical 状态操作。

项目页先汇总真正需要协助的工作,再进入具体 Workflow。正式截图使用脱敏演示项目,不包含用户目录、凭据或真实业务数据。
启动
tenon dashboard --open默认只绑定 loopback。打开页面后先核对 Tenon 标题、项目 root 和 Change 名,避免把其他端口上的应用误当成当前 Dashboard。
状态为何显示“等待”
“等待”可能代表:
- phase 工作尚未开始;
- review request 已创建,等待确认;
- AFK 任务排队;
- automation 缺少运行时或凭证;
- canonical session 已结束;
- UI 只收到了旧 snapshot。
先运行:
tenon status <change> --json
tenon inbox --json
tenon doctor --json不要通过删除 marker 或手改 .pipeline.yaml 把等待改成运行中。
单端口模型
生产 runtime 在同一端口提供 SPA、只读 snapshot、SSE 和受控 mutation API。公共 VitePress 站点不包含这些端点,也不发布用户项目状态。
Overview
Overview 是 Dashboard 内的只读产品说明,路由为 ?view=overview。它和正式文档站互补:Overview 帮本地操作者快速定位,正式站提供完整教程、搜索和公共深链。
语言
Dashboard zh/en 存在浏览器 localStorage,只控制 UI。治理文档 locale 在 Change 创建时固定,二者不会隐式联动。
安全
不要把 Dashboard 绑定到公网地址。token、prompt、trace、绝对路径和本地 API 响应都可能包含敏感信息。
生产端口
安装后的默认 Dashboard 端口是 18765。旧测试端口 19765 或其他 Vite 端口不是当前生产默认。指定其他端口时仍应只绑定 loopback。
生产 runtime 在一个端口同时提供 SPA、snapshot、SSE 和受控 mutation API。Vite 开发端口只是热更新工具,不是安装契约。
状态语义
| 显示 | canonical 事实 | 操作 |
|---|---|---|
| 未开始 | phase 尚未进入 | 等待前序完成 |
| 运行中 | 当前 phase 有活跃工作 | 查看日志与 Todo |
| 等待确认 | exact review pending | 审阅后确认 |
| 已停止 | session 结束或失败 | 查看原因并恢复 |
如果 CLI 显示 in_progress 而页面仍显示等待,先刷新 snapshot/SSE,再确认浏览器打开的是当前 Dashboard,而不是旧 preview。

进度页沿真实 Workflow 展示阶段与 Change。running 是显示状态,执行来源则独立标记为终端或自动化,避免同一个任务在不同页面出现互相矛盾的身份。
操作视图
主导航按实现顺序提供:
projects → progress → afk → workbench → machine → hostPlanprojects:项目与 Change 汇总;progress:当前 phase、Todo、历史和证据;afk:AFK 队列、worker、预算与停止原因;workbench:Workflow、Track、hook、automation 和 loop;machine:运行时身份、流量和高级诊断。hostPlan:选择 Tenon 已注册宿主,预览零副作用的 setup/update 命令与有序步骤。适配器计划固定使用--target .,复制后运行前必须先进入目标项目目录。
overview 独立于操作视图,避免把产品介绍混进日常控制面导航。
自动运行

自动运行页只接受 execution provenance 为 automation 的任务,并按需要处理、运行中和等待中组织。正常 Codex 对话产生的新鲜终端心跳仍会让进度页显示“运行中”,但不会进入这里。
Workflow 工作台

工作台把 Track、七阶段 DAG、阶段 Skill、Hook 与运行前事实放在同一页面。Default 只读基线、自定义 Workflow 和每个 Workflow 的 Free Track 都从同一份有效计划投影。
本地 API 边界
mutation 端点必须经过 CLI 相同的 schema、CAS、review 和 guard。前端不能直接编辑 canonical JSON 或 .pipeline.yaml。
GET /api/host-targets 与 GET /api/host-target-plan?host=codex&operation=setup 是严格只读端点,只接受 Tenon 已注册宿主以及 setup/update 操作,返回 host-target-plan/v1,不会执行预览命令。原生宿主计划面向用户级安装;适配器宿主计划使用 当前项目目录(--target .),不会输出可被 shell 误解的占位符。
生产 server 会为可压缩的生成资源协商 gzip,并返回 Vary: Accept-Encoding;明确拒绝 gzip 的客户端仍获得原始字节,API JSON 继续使用 no-store。
lsof -nP -iTCP:18765 -sTCP:LISTEN
curl -fsS -o /dev/null http://127.0.0.1:18765/页面标题、项目 root 和 Change 必须与目标一致;端口可访问不等于页面就是当前插件。
页面验收
- 桌面与移动布局无溢出;
- 中文和英文切换可用;
- 键盘焦点、跳转链接和按钮名称可辨识;
- Todo 与真实 workflow 步骤一致;
- 等待、运行中、确认中与 CLI 一致;
- 控制台无资源 404 或运行时错误。
公共分享请使用静态文档站,不要给 Dashboard 建公网隧道或反向代理。