旧单页 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 标记单测未动且通过。
42 lines
2.0 KiB
TypeScript
42 lines
2.0 KiB
TypeScript
import { useState } from "react";
|
||
import { useConsole } from "../context";
|
||
import { Card, Bar, DataListRaw } from "../components/ui";
|
||
import { shortId } from "../api/client";
|
||
|
||
export default function EnvSection() {
|
||
const ctx = useConsole();
|
||
const [name, setName] = useState("");
|
||
const [branch, setBranch] = useState("");
|
||
const [executor, setExecutor] = useState("");
|
||
return (
|
||
<Card id="nav-env" title={<>环境 <span className="muted">(选、建、管:当前项目的基准检出)</span></>}>
|
||
<Bar>
|
||
<button onClick={ctx.refreshEnvs}>刷新</button>
|
||
<span className="muted">{ctx.envCount}</span>
|
||
</Bar>
|
||
{ctx.envs.length === 0 ? <div className="muted">先选项目</div> : (
|
||
<DataListRaw>
|
||
{ctx.envs.map((e) => (
|
||
<li key={e.id}>
|
||
<span className="row-main">
|
||
{e.name}({shortId(e.id)}) / 分支 {e.branch || "默认分支"} / 执行器 {e.executor || "不限"} / 状态 {e.status}
|
||
{e.status === "failed" && e.error_text ? " / 失败原因:" + e.error_text : ""}
|
||
</span>
|
||
{e.status === "archived" ? null : <button onClick={() => void ctx.archiveEnv(e.id)}>归档</button>}
|
||
</li>
|
||
))}
|
||
</DataListRaw>
|
||
)}
|
||
<Bar>
|
||
<input type="text" placeholder="新环境名" value={name} onChange={(e) => setName(e.target.value)} />
|
||
<input type="text" placeholder="分支(可选,空=默认分支)" value={branch} onChange={(e) => setBranch(e.target.value)} />
|
||
<select aria-label="新环境执行器" value={executor} onChange={(e) => setExecutor(e.target.value)}>
|
||
<option value="">执行器:不限</option><option value="local">local</option><option value="docker">docker</option>
|
||
</select>
|
||
<button onClick={async () => { await ctx.createEnv(name, branch, executor); setName(""); setBranch(""); }}>新建环境</button>
|
||
</Bar>
|
||
<span className="muted">{ctx.envMsg}</span>
|
||
</Card>
|
||
);
|
||
}
|