旧单页 console.html 换成 Vite + React + TypeScript 单文件构建产物 (309525 字节,sha 90345ec8…,重建字节一致),源码在 cloud/console-react/,改页面只改 src 再 npm run build:console, 产物不手改。布局:左侧列表(模块导航 + 任务列表)、中间标准对话 (实时链路时间线 + 继续会话聊天框,共用 Chat 组件)、右侧详情 (元数据、操作、评审、审批、协调子任务、子代理、线程)。 API 与后端语义未改,key 只存浏览器 localStorage。 6 个 console 标记单测随实现改名更新(意图不变:壳确实调了 这些接口、turn 信息仍在详情里、旧 goal 输入仍不存在); P1 标记单测未动且通过。
26 lines
1.4 KiB
TypeScript
26 lines
1.4 KiB
TypeScript
import { useConsole } from "../context";
|
||
import { Card, Bar, DataList } from "../components/ui";
|
||
|
||
export default function SkillsSection() {
|
||
const ctx = useConsole();
|
||
return (
|
||
<Card id="nav-skills" title="技能与 MCP">
|
||
<div className="muted">反映宿主租户 home,容器内 home 可能不同;重载只在 schema 枚举里,当前 pin 的二进制拒绝时原样 502;OAuth 只发起登录,不代表登录完成。</div>
|
||
<Bar>
|
||
<button onClick={ctx.refreshSkills}>刷新</button>
|
||
<span className="muted">{ctx.skillMsg}</span>
|
||
</Bar>
|
||
<h3>技能</h3>
|
||
{ctx.skillError ? <div className="muted">{ctx.skillError}</div>
|
||
: <DataList empty="暂无技能" items={ctx.skills.map((x, i) => <span key={i} className="row-main">{x.name || x.id || ""}{x.description ? " - " + x.description : ""}{x.detail ? " - " + x.detail : ""}</span>)} />}
|
||
<h3>应用</h3>
|
||
<DataList empty="暂无应用" items={ctx.apps.map((x, i) => <span key={i} className="row-main">{x.name || x.id || ""}{x.description ? " - " + x.description : ""}</span>)} />
|
||
<h3>MCP 服务</h3>
|
||
<DataList empty="暂无 MCP 服务" items={ctx.mcpServers.map((x, i) => {
|
||
const det = x.detail || x.details || x.state || "";
|
||
return <span key={i} className="row-main">{x.name || x.id || ""} | 状态 {x.status || ""}{det ? " | " + det : ""}</span>;
|
||
})} />
|
||
</Card>
|
||
);
|
||
}
|