console: 一页式控制台排版 + 数据卡片
保持 Muse 风格(白底、细线、灰/浅蓝气泡),不再四栏切视图: 顶栏(连接/健康/配额/刷新 + 锚点导航)+ 6 张数据卡片 (健康、配额、任务、Workers、项目、项目数据,均取自已有 store 数据,未加载不以 0 充数)+ 所有模块按顺序铺在一页 (派发、任务列表、对话+详情、项目、环境、Workers、技能、 自动化、分诊、管理区、API Key)。图标栏与右侧栏删除, 内容分别移到顶栏与各自模块下;今天列表与任务列表重复, 不再单独保留;对话为空时不再重复渲染派发表单。 含自动选第一个项目修复(主要聊天不再空)与继续消息 历史,console 标记单测本地 53 项通过。
This commit is contained in:
1 parent
a13762cfbe
commit
8b455c6554
9 files changed
+263
-272
No files matched your search
+108
-50
@@ -1,72 +1,130 @@
|
||||
import { useState } from "react";
|
||||
import { ConsoleContext } from "./context";
|
||||
import { ConsoleContext, useConsole } from "./context";
|
||||
import { useConsoleStore } from "./hooks/useConsoleStore";
|
||||
import { useAutoRefresh, useIntervalMs } from "./hooks/useAutoRefresh";
|
||||
import IconRail, { type View } from "./components/IconRail";
|
||||
import DataCards from "./sections/DataCards";
|
||||
import DispatchSection from "./sections/DispatchSection";
|
||||
import TaskListSection from "./sections/TaskListSection";
|
||||
import ConversationSection from "./sections/ConversationSection";
|
||||
import TaskDetailPanel from "./sections/TaskDetailPanel";
|
||||
import ApiKeySection from "./sections/ApiKeySection";
|
||||
import AdminSection from "./sections/AdminSection";
|
||||
import ProjectsSection from "./sections/ProjectsSection";
|
||||
import MembersPanel from "./sections/MembersPanel";
|
||||
import EnvSection from "./sections/EnvSection";
|
||||
import EnvContextPanel from "./sections/EnvContextPanel";
|
||||
import WorkersSection from "./sections/WorkersSection";
|
||||
import HealthPanel from "./sections/HealthPanel";
|
||||
import SkillsSection from "./sections/SkillsSection";
|
||||
import SkillsToolsPanel from "./sections/SkillsToolsPanel";
|
||||
import AutomationsSection from "./sections/AutomationsSection";
|
||||
import TriageSection from "./sections/TriageSection";
|
||||
import TaskListSection from "./sections/TaskListSection";
|
||||
import ConversationSection from "./sections/ConversationSection";
|
||||
import RightPanel from "./sections/RightPanel";
|
||||
|
||||
// Layout only, Muse web/desktop style: no big header bar.
|
||||
// Icon rail (56px) + left list (260px) + centre conversation (elastic,
|
||||
// content centred) + right panel (300px, profile/today/detail). The
|
||||
// centre top bar is minimal: a back arrow (back to the task view) on
|
||||
// the left, and, only when the right panel is closed, a button to
|
||||
// reopen it — the right panel's own X closes it. Selecting a task in
|
||||
// the left list switches the centre conversation and the right detail
|
||||
// to that task together; selecting a module switches the centre to
|
||||
// that module and the right detail to its context.
|
||||
// Layout only: ONE scrollable console page, Muse web/desktop tokens
|
||||
// (white, hairlines, grey/blue bubbles) but console ordering — no
|
||||
// icon-rail column, no left list column, no right panel column, no
|
||||
// view switching. Everything is on the page: a slim sticky top bar
|
||||
// (name + real connection status + health + quota + refresh stamp +
|
||||
// anchor nav), a data-cards row, then every module as a section in
|
||||
// order. The old right panel's content moved here: its profile/status
|
||||
// line is the top bar, its 今天 list is redundant with the full task
|
||||
// list section, and its detail/context panels sit under their own
|
||||
// sections below (detail under 对话, members under 项目, and so on).
|
||||
// The old icon rail's module switching is the anchor nav.
|
||||
const NAV: Array<[string, string]> = [
|
||||
["#sec-dispatch", "派发"], ["#sec-tasks", "任务"], ["#sec-conv", "对话"],
|
||||
["#sec-projects", "项目"], ["#sec-env", "环境"], ["#sec-workers", "Workers"],
|
||||
["#sec-skills", "技能"], ["#sec-automations", "自动化"], ["#sec-triage", "分诊"],
|
||||
["#sec-admin", "管理区"], ["#sec-key", "API Key"],
|
||||
];
|
||||
|
||||
function TopBar() {
|
||||
return (
|
||||
<header className="dash-topbar">
|
||||
<div className="dash-topbar-row">
|
||||
<span className="dash-brand">Codex 命令台</span>
|
||||
<TopStatus />
|
||||
<span className="muted dash-hide-sm"><TopHealth /></span>
|
||||
<span className="muted dash-hide-sm"><TopQuota /></span>
|
||||
<span className="muted dash-stamp"><TopStamp /></span>
|
||||
</div>
|
||||
<nav className="dash-nav" aria-label="页面导航">
|
||||
{NAV.map(([href, label]) => <a key={href} href={href}>{label}</a>)}
|
||||
</nav>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
|
||||
// Tiny readers so the top bar re-renders from the store.
|
||||
function TopStatus() {
|
||||
const ctx = useConsole();
|
||||
return <span className={ctx.keySaved ? "dash-status ok" : "dash-status off"}>{ctx.keySaved ? "● 已连接" : "○ 未连接"}</span>;
|
||||
}
|
||||
function TopHealth() {
|
||||
return <>{useConsole().healthText}</>;
|
||||
}
|
||||
function TopQuota() {
|
||||
return <>{useConsole().quotaText}</>;
|
||||
}
|
||||
function TopStamp() {
|
||||
return <>自动刷新 · 每 10 秒 · 已刷新 {useConsole().refreshStamp}</>;
|
||||
}
|
||||
|
||||
export default function App() {
|
||||
const store = useConsoleStore();
|
||||
const [view, setView] = useState<View>("task");
|
||||
const [rightOpen, setRightOpen] = useState(true);
|
||||
useAutoRefresh((selectFocused) => store.refreshAll(selectFocused), 10000);
|
||||
useIntervalMs(() => store.refreshSlow(), 60000);
|
||||
|
||||
const centre = (() => {
|
||||
switch (view) {
|
||||
case "projects": return <ProjectsSection />;
|
||||
case "env": return <EnvSection />;
|
||||
case "workers": return <WorkersSection />;
|
||||
case "skills": return <SkillsSection />;
|
||||
case "automations": return <AutomationsSection />;
|
||||
case "triage": return <TriageSection />;
|
||||
case "admin": return <AdminSection />;
|
||||
case "key": return <ApiKeySection />;
|
||||
default: return <ConversationSection />;
|
||||
}
|
||||
})();
|
||||
const scrollToDispatch = () => {
|
||||
document.getElementById("sec-dispatch")?.scrollIntoView({ behavior: "smooth" });
|
||||
};
|
||||
|
||||
return (
|
||||
<ConsoleContext.Provider value={store}>
|
||||
<div className={"muse-app" + (rightOpen ? "" : " no-right")}>
|
||||
<IconRail view={view} onSelect={setView} />
|
||||
<aside className="list-col">
|
||||
<TaskListSection onNew={() => setView("task")} />
|
||||
</aside>
|
||||
<main className="center-col">
|
||||
<div className="center-topbar">
|
||||
<button type="button" className="icon-btn" aria-label="返回任务" title="返回任务" onClick={() => setView("task")}>←</button>
|
||||
{rightOpen ? <span className="muted">Codex 命令台</span> : (
|
||||
<button type="button" onClick={() => setRightOpen(true)}>显示右侧栏</button>
|
||||
)}
|
||||
<TopBar />
|
||||
<main className="dash-page">
|
||||
<DataCards />
|
||||
<section id="sec-dispatch" className="dash-section">
|
||||
<DispatchSection />
|
||||
</section>
|
||||
<section id="sec-tasks" className="dash-section card">
|
||||
<h2>任务列表</h2>
|
||||
<TaskListSection onNew={scrollToDispatch} />
|
||||
</section>
|
||||
<section id="sec-conv" className="dash-section">
|
||||
<div className="card">
|
||||
<h2>对话</h2>
|
||||
<ConversationSection />
|
||||
</div>
|
||||
<div className="center-inner">{centre}</div>
|
||||
</main>
|
||||
{rightOpen ? (
|
||||
<aside className="right-col">
|
||||
<RightPanel view={view} onSelect={setView} onClose={() => setRightOpen(false)} />
|
||||
</aside>
|
||||
) : null}
|
||||
</div>
|
||||
<TaskDetailPanel />
|
||||
</section>
|
||||
<section id="sec-projects" className="dash-section">
|
||||
<ProjectsSection />
|
||||
<MembersPanel />
|
||||
</section>
|
||||
<section id="sec-env" className="dash-section">
|
||||
<EnvSection />
|
||||
<EnvContextPanel />
|
||||
</section>
|
||||
<section id="sec-workers" className="dash-section">
|
||||
<WorkersSection />
|
||||
<HealthPanel />
|
||||
</section>
|
||||
<section id="sec-skills" className="dash-section">
|
||||
<SkillsSection />
|
||||
<SkillsToolsPanel />
|
||||
</section>
|
||||
<section id="sec-automations" className="dash-section">
|
||||
<AutomationsSection />
|
||||
</section>
|
||||
<section id="sec-triage" className="dash-section">
|
||||
<TriageSection />
|
||||
</section>
|
||||
<section id="sec-admin" className="dash-section">
|
||||
<AdminSection />
|
||||
</section>
|
||||
<section id="sec-key" className="dash-section">
|
||||
<ApiKeySection />
|
||||
</section>
|
||||
</main>
|
||||
</ConsoleContext.Provider>
|
||||
);
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
// Far-left icon rail from the Muse screenshot: one simple inline-SVG
|
||||
// icon per module, no emoji, no external image. This replaces LeftNav
|
||||
// as the module switcher; the left list panel below it is the task list.
|
||||
export type View = "task" | "projects" | "env" | "workers" | "skills" | "automations" | "triage" | "admin" | "key";
|
||||
|
||||
function Svg({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
|
||||
{children}
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
|
||||
export function ModuleIcon({ view }: { view: View }) {
|
||||
switch (view) {
|
||||
case "task": return <Svg><path d="M21 11.5a8.5 8.5 0 0 1-12.4 7.5L3 21l2-5.6A8.5 8.5 0 1 1 21 11.5Z" /></Svg>;
|
||||
case "projects": return <Svg><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z" /><path d="M14 3v5h5" /><path d="M9 13h6M9 17h6" /></Svg>;
|
||||
case "env": return <Svg><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z" /></Svg>;
|
||||
case "workers": return <Svg><rect x="3" y="3" width="7" height="7" rx="1.5" /><rect x="14" y="3" width="7" height="7" rx="1.5" /><rect x="3" y="14" width="7" height="7" rx="1.5" /><rect x="14" y="14" width="7" height="7" rx="1.5" /></Svg>;
|
||||
case "skills": return <Svg><path d="M9 18h6M10 21h4" /><path d="M12 3a6 6 0 0 0-3.5 10.8c.8.6 1.5 1.4 1.5 2.2h4c0-.8.7-1.6 1.5-2.2A6 6 0 0 0 12 3Z" /></Svg>;
|
||||
case "automations": return <Svg><circle cx="12" cy="12" r="9" /><path d="M12 7v5l3 2" /></Svg>;
|
||||
case "triage": return <Svg><circle cx="12" cy="12" r="9" /><path d="M8 12.5l2.5 2.5L16 9.5" /></Svg>;
|
||||
case "admin": return <Svg><path d="M12 3l7 3v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V6Z" /><path d="M9 12l2 2 4-4" /></Svg>;
|
||||
case "key": return <Svg><circle cx="8" cy="15" r="4" /><path d="M11.5 11.5L20 3" /><path d="M17 6l2 2M20 3l-1 3" /></Svg>;
|
||||
default: return <Svg><circle cx="12" cy="12" r="9" /></Svg>;
|
||||
}
|
||||
}
|
||||
|
||||
const ITEMS: Array<[View, string]> = [
|
||||
["task", "任务"], ["projects", "项目"], ["env", "环境"], ["workers", "Workers"],
|
||||
["skills", "技能与 MCP"], ["automations", "自动化"], ["triage", "分诊"],
|
||||
["admin", "管理区"], ["key", "API Key"],
|
||||
];
|
||||
|
||||
export default function IconRail({ view, onSelect }: { view: View; onSelect: (v: View) => void }) {
|
||||
return (
|
||||
<nav className="icon-rail" aria-label="模块快捷方式">
|
||||
{ITEMS.map(([v, label]) => (
|
||||
<button key={v} type="button" title={label} aria-label={label} className={view === v ? "active" : ""} onClick={() => onSelect(v)}>
|
||||
<ModuleIcon view={v} />
|
||||
</button>
|
||||
))}
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
@@ -35,6 +35,18 @@ export function useConsoleStore(): ConsoleCtx {
|
||||
void tools.refreshTriage(id);
|
||||
}, [catalog, taskList, tools]);
|
||||
|
||||
// Fix: the old single page's project <select> defaulted to its first
|
||||
// option once loaded, so tasks loaded without a click. The React
|
||||
// version is a controlled select with projectId "" on every reload,
|
||||
// so without this the task list stayed on "先选项目" forever and
|
||||
// auto-refresh never fixed it. Auto-select the first project only
|
||||
// while nothing is selected; an explicit user choice is never
|
||||
// overridden.
|
||||
const firstProjectId = catalog.projects[0]?.id;
|
||||
useEffect(() => {
|
||||
if (!catalog.projectId && firstProjectId) selectProject(firstProjectId);
|
||||
}, [catalog.projectId, firstProjectId, selectProject]);
|
||||
|
||||
const saveKeyInput = useCallback((v: string) => {
|
||||
catalog.saveKeyInput(v);
|
||||
if (!v.trim()) return;
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
import { useConsole } from "../context";
|
||||
import TracePanel from "./detail/TracePanel";
|
||||
import ContinuePanel from "./detail/ContinuePanel";
|
||||
import DispatchSection from "./DispatchSection";
|
||||
|
||||
// Centre column for the task view: the conversation is the protagonist.
|
||||
// Dispatch is kept here as the way a new conversation starts; it is not
|
||||
// a stack of work cards. Trace timeline is above, continue input below.
|
||||
// Dashboard conversation section: trace timeline above, continue input
|
||||
// below. Dispatch lives in its own section above on the same page, so
|
||||
// it is NOT duplicated here when no task is selected — only the hint.
|
||||
export default function ConversationSection() {
|
||||
const ctx = useConsole();
|
||||
if (!ctx.currentTask) {
|
||||
return (
|
||||
<div className="conversation">
|
||||
<DispatchSection />
|
||||
<div className="muted">左侧点一条任务,对话就切到该任务;也可以先在上面派发一个新任务。</div>
|
||||
<div className="muted">在任务列表里点一条任务,对话和详情就切到该任务;也可以在上面派发一个新任务。</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
import { useConsole } from "../context";
|
||||
import { workerAgeText } from "../api/client";
|
||||
|
||||
// Dashboard data cards: computed ONLY from data the store already
|
||||
// fetches (health, quota, tasks, workers, projects, envs, members,
|
||||
// skills/apps/MCP). No new API endpoint, no new API call. A card never
|
||||
// presents 0 as a real count when its dataset is not loaded or its
|
||||
// fetch failed: it shows 未加载 / 先选项目 / 加载失败 plus the
|
||||
// existing error string instead.
|
||||
function Card({ label, value, sub }: { label: string; value: string; sub: string }) {
|
||||
return (
|
||||
<div className="dash-card data-card">
|
||||
<div className="dash-card-label">{label}</div>
|
||||
<div className="dash-card-value">{value}</div>
|
||||
<div className="muted">{sub}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function DataCards() {
|
||||
const ctx = useConsole();
|
||||
|
||||
const healthValue = ctx.healthText === "未加载" ? "未加载"
|
||||
: ctx.healthText.includes("worker_ok=true") ? "正常"
|
||||
: ctx.healthText.includes("worker_ok=false") ? "异常"
|
||||
: ctx.healthText.includes("加载失败") ? "加载失败" : "未知";
|
||||
|
||||
const quotaMatch = ctx.quotaText.match(/剩余 \$([0-9.]+)/);
|
||||
const quotaValue = ctx.quotaText.includes("加载失败") ? "加载失败"
|
||||
: ctx.quotaText.includes("未填 key") || ctx.quotaText === "未加载" ? "未加载"
|
||||
: quotaMatch ? "$" + quotaMatch[1] : "配额";
|
||||
|
||||
const statusCounts = (["running", "completed", "failed", "queued", "merged", "interrupted"] as const)
|
||||
.map((s) => ctx.tasks.filter((t) => t.status === s).length)
|
||||
.map((n, i) => (["running", "completed", "failed", "queued", "merged", "interrupted"] as const)[i] + " " + n)
|
||||
.join(" | ");
|
||||
const selectedProject = ctx.projects.find((p) => p.id === ctx.projectId);
|
||||
const tasksCard = ctx.taskError
|
||||
? { value: "加载失败", sub: ctx.taskError }
|
||||
: !ctx.projectId
|
||||
? { value: "先选项目", sub: ctx.projectMsg || "项目加载后自动选第一个" }
|
||||
: { value: String(ctx.tasks.length), sub: ctx.taskCountText + " | " + statusCounts + (selectedProject ? " | " + selectedProject.name : "") };
|
||||
|
||||
let workersCard: { value: string; sub: string };
|
||||
if (ctx.workersError) {
|
||||
workersCard = { value: "加载失败", sub: ctx.workersError };
|
||||
} else if (ctx.workers === null) {
|
||||
workersCard = { value: ctx.workersSummary || "未加载", sub: "完整 worker 清单仅全局管理员可见" };
|
||||
} else {
|
||||
const online = ctx.workers.filter((w) => {
|
||||
if (w.alive !== undefined && w.alive !== null) return !!w.alive;
|
||||
const age = workerAgeText(w).age;
|
||||
return age !== null && age <= 120;
|
||||
}).length;
|
||||
workersCard = { value: online + " 在线 / " + ctx.workers.length, sub: (ctx.workers.length - online) + " 离线" };
|
||||
}
|
||||
|
||||
const projectsCard = ctx.projectMsg.includes("加载失败")
|
||||
? { value: "加载失败", sub: ctx.projectMsg }
|
||||
: { value: ctx.projects.length + " 个", sub: selectedProject ? "当前项目:" + selectedProject.name : "未选项目(加载后自动选第一个)" };
|
||||
|
||||
const projectErrors = [ctx.envMsg, ctx.memberError, ctx.skillError].filter((s) => s && s.includes("失败"));
|
||||
const projectDataCard = !ctx.projectId
|
||||
? { value: "先选项目", sub: "选项目后显示环境 / 成员 / 技能计数" }
|
||||
: projectErrors.length
|
||||
? { value: "部分加载失败", sub: projectErrors.join(" | ") }
|
||||
: { value: ctx.envs.length + " 个环境", sub: ctx.members.length + " 成员 | " + ctx.skills.length + " 技能 | " + ctx.apps.length + " 应用 | " + ctx.mcpServers.length + " MCP" };
|
||||
|
||||
return (
|
||||
<section className="dash-cards" aria-label="数据卡片">
|
||||
<Card label="健康" value={healthValue} sub={ctx.healthText} />
|
||||
<Card label="配额" value={quotaValue} sub={ctx.quotaText} />
|
||||
<Card label="任务" value={tasksCard.value} sub={tasksCard.sub} />
|
||||
<Card label="Workers" value={workersCard.value} sub={workersCard.sub} />
|
||||
<Card label="项目" value={projectsCard.value} sub={projectsCard.sub} />
|
||||
<Card label="项目数据" value={projectDataCard.value} sub={projectDataCard.sub} />
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
import { useConsole } from "../context";
|
||||
import { ModuleIcon, type View } from "../components/IconRail";
|
||||
import { shortId } from "../api/client";
|
||||
import TaskDetailPanel from "./TaskDetailPanel";
|
||||
import MembersPanel from "./MembersPanel";
|
||||
import EnvContextPanel from "./EnvContextPanel";
|
||||
import SkillsToolsPanel from "./SkillsToolsPanel";
|
||||
import HealthPanel from "./HealthPanel";
|
||||
import AutomationsSection from "./AutomationsSection";
|
||||
import TriageSection from "./TriageSection";
|
||||
|
||||
// Right panel, modelled on the Muse screenshot: profile header with a
|
||||
// real connection status (API key / health, never a fake user), an icon
|
||||
// row that switches modules, a 今天 list of recent tasks, and below it
|
||||
// the selected task's detail (or the current module's context) as a
|
||||
// collapsible section. Nothing that was in the old right column is
|
||||
// dropped: the detail/context panels are the same components, only
|
||||
// rendered inside <details> under the today list.
|
||||
export default function RightPanel({ view, onSelect, onClose }: {
|
||||
view: View; onSelect: (v: View) => void; onClose: () => void;
|
||||
}) {
|
||||
const ctx = useConsole();
|
||||
const connected = ctx.keySaved;
|
||||
const today = ctx.tasks.slice().reverse().slice(0, 10);
|
||||
const context = (() => {
|
||||
switch (view) {
|
||||
case "projects": return <MembersPanel />;
|
||||
case "env": return <EnvContextPanel />;
|
||||
case "skills": return <SkillsToolsPanel />;
|
||||
case "workers": case "admin": case "key": return <HealthPanel />;
|
||||
case "automations": return <TriageSection />;
|
||||
case "triage": return <AutomationsSection />;
|
||||
default: return <TaskDetailPanel />;
|
||||
}
|
||||
})();
|
||||
const iconRow: Array<[View, string]> = [["task", "任务"], ["admin", "管理区"], ["automations", "自动化"], ["key", "API Key"]];
|
||||
return (
|
||||
<div>
|
||||
<div className="right-profile">
|
||||
<button type="button" className="icon-btn" aria-label="关闭右侧栏" onClick={onClose}>×</button>
|
||||
<div className="right-avatar" aria-hidden="true">C</div>
|
||||
<div className="right-name">Codex 命令台</div>
|
||||
<div className={connected ? "right-status" : "right-status off"}>
|
||||
{connected ? "● 已连接" : "○ 未连接(先在 API Key 里保存 key)"}
|
||||
</div>
|
||||
<div className="muted">{ctx.healthText}</div>
|
||||
<div className="muted">{ctx.quotaText}</div>
|
||||
<div className="muted">自动刷新 · 每 10 秒 · 已刷新 {ctx.refreshStamp}</div>
|
||||
</div>
|
||||
<div className="right-icon-row" aria-label="快捷方式">
|
||||
{iconRow.map(([v, label]) => (
|
||||
<button key={v} type="button" title={label} aria-label={label} className={view === v ? "active" : ""} onClick={() => onSelect(v)}>
|
||||
<ModuleIcon view={v} />
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<div>
|
||||
<div className="list-section-head"><span>今天</span></div>
|
||||
{today.length === 0 ? (
|
||||
<div className="muted">今天暂无任务</div>
|
||||
) : (
|
||||
<ul className="today-list">
|
||||
{today.map((t) => {
|
||||
const done = t.status === "completed" || t.status === "merged";
|
||||
const time = t.updated_at ? new Date(t.updated_at * 1000).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) : "";
|
||||
return (
|
||||
<li key={t.id} className="today-item" onClick={() => { ctx.showDetail(t.id); onSelect("task"); }}>
|
||||
<span className={"today-check" + (done ? " done" : "")}>{done ? "✓" : ""}</span>
|
||||
<span className="today-item-main">
|
||||
<span className="today-item-title">{String(t.prompt || shortId(t.id)).slice(0, 60) || shortId(t.id)}</span>
|
||||
<span className="today-item-sub">{shortId(t.id)} · <span className={"st-" + t.status}>{t.status}</span> · {t.executor || ""}</span>
|
||||
</span>
|
||||
<span className="today-item-time">{time}</span>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
)}
|
||||
</div>
|
||||
<details className="right-detail" open>
|
||||
<summary>{view === "task" ? "任务详情" : "模块详情"}</summary>
|
||||
{context}
|
||||
</details>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -19,6 +19,12 @@ export default function TaskListSection({ onNew }: { onNew: () => void }) {
|
||||
</svg>
|
||||
<input type="text" placeholder="搜索" aria-label="搜索任务" value={ctx.searchText} onChange={(e) => ctx.setSearchText(e.target.value)} />
|
||||
</div>
|
||||
<div className="bar">
|
||||
<select aria-label="项目" value={ctx.projectId} onChange={(e) => ctx.selectProject(e.target.value)}>
|
||||
{ctx.projects.length === 0 ? <option value="">(先加载项目)</option> : null}
|
||||
{ctx.projects.map((p) => <option key={p.id} value={p.id}>{p.name} ({shortId(p.id)})</option>)}
|
||||
</select>
|
||||
</div>
|
||||
<div className="list-section-head">
|
||||
<span>主要聊天</span>
|
||||
<button type="button" aria-label="派发新任务" title="派发新任务" onClick={onNew}>+</button>
|
||||
|
||||
@@ -37,55 +37,28 @@ button.danger:hover{background:#fee4e2}
|
||||
.icon-btn{width:32px;height:32px;padding:0;display:grid;place-items:center;border:1px solid var(--line);border-radius:50%;background:#fff;color:var(--text);font-size:16px;line-height:1}
|
||||
.icon-btn:hover{background:#f9fafb}
|
||||
|
||||
/* App shell: icon rail + list + conversation + right panel, full viewport.
|
||||
Columns are separated by hairlines, not gaps or cards. */
|
||||
.muse-app{display:grid;grid-template-columns:56px 260px minmax(0,1fr) 300px;height:100vh;background:#fff}
|
||||
.muse-app.no-right{grid-template-columns:56px 260px minmax(0,1fr)}
|
||||
.icon-rail{border-right:1px solid var(--line);display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 0;overflow-y:auto}
|
||||
.icon-rail button{width:40px;height:40px;border:0;border-radius:12px;background:transparent;display:grid;place-items:center;color:var(--text);padding:0;flex:none}
|
||||
.icon-rail button:hover{background:#f2f2f2}
|
||||
.icon-rail button.active{background:var(--accent-soft);color:var(--accent)}
|
||||
.icon-rail svg{width:22px;height:22px}
|
||||
.list-col{border-right:1px solid var(--line);overflow-y:auto;padding:16px 12px;min-width:0}
|
||||
.search-box{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:999px;padding:8px 12px;background:#fff}
|
||||
.search-box svg{flex:none;color:var(--muted)}
|
||||
.search-box input{border:0;padding:0;flex:1;min-width:0;font-size:14px;background:transparent}
|
||||
.search-box input:focus{box-shadow:none;outline:none}
|
||||
.list-section-head{display:flex;align-items:center;justify-content:space-between;padding:16px 4px 8px;font-weight:600;font-size:14px}
|
||||
.list-section-head button{width:28px;height:28px;padding:0;display:grid;place-items:center;border-radius:50%}
|
||||
.muse-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
|
||||
.muse-item{padding:10px 12px;border-radius:12px;cursor:pointer;overflow:hidden}
|
||||
.muse-item:hover{background:#f9fafb}
|
||||
.muse-item.selected{background:#f2f2f2}
|
||||
.muse-item-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px}
|
||||
.muse-item-sub{display:flex;gap:6px;align-items:center;color:var(--muted);font-size:12px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.task-dot{width:8px;height:8px;border-radius:50%;background:currentColor;flex:none}
|
||||
.center-col{min-width:0;display:flex;flex-direction:column;overflow-y:auto;background:#fff}
|
||||
.center-topbar{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#fff;border-bottom:1px solid var(--line)}
|
||||
.center-inner{max-width:760px;margin:0 auto;width:100%;padding:24px 20px 16px;display:flex;flex-direction:column;gap:20px;flex:1}
|
||||
.right-col{border-left:1px solid var(--line);overflow-y:auto;padding:20px 16px;display:flex;flex-direction:column;gap:20px;min-width:0}
|
||||
.right-profile{text-align:center;position:relative}
|
||||
.right-profile .icon-btn{position:absolute;top:0;right:0}
|
||||
.right-avatar{width:72px;height:72px;border-radius:50%;background:var(--accent-soft);color:var(--accent);display:grid;place-items:center;font-size:28px;font-weight:700;margin:0 auto}
|
||||
.right-name{font-weight:700;font-size:17px;margin-top:10px}
|
||||
.right-status{color:var(--green);font-size:13px;font-weight:600}
|
||||
.right-status.off{color:var(--muted)}
|
||||
.right-icon-row{display:flex;gap:4px;justify-content:space-between;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:10px 4px}
|
||||
.right-icon-row button{width:36px;height:36px;border:0;border-radius:12px;background:transparent;display:grid;place-items:center;color:var(--text);padding:0}
|
||||
.right-icon-row button:hover{background:#f2f2f2}
|
||||
.right-icon-row button.active{background:var(--accent-soft);color:var(--accent)}
|
||||
.right-icon-row svg{width:20px;height:20px}
|
||||
.today-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:14px}
|
||||
.today-item{display:flex;gap:10px;cursor:pointer;align-items:flex-start}
|
||||
.today-check{width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line-strong);display:grid;place-items:center;flex:none;font-size:13px;color:var(--muted)}
|
||||
.today-check.done{border-color:var(--green);background:var(--green);color:#fff}
|
||||
.today-item-main{flex:1;min-width:0;display:block}
|
||||
.today-item-title{display:block;font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.today-item-sub{display:block;color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.today-item-time{color:var(--muted);font-size:12px;flex:none;white-space:nowrap}
|
||||
.right-detail summary{font-weight:600;font-size:14px;cursor:pointer;padding:8px 0}
|
||||
.right-detail .card{border:0;padding:0;box-shadow:none}
|
||||
.right-detail .card h2{font-size:16px}
|
||||
/* Dashboard shell: ONE scrollable console page, same Muse tokens.
|
||||
Slim sticky top bar (name + status + health + quota + refresh
|
||||
stamp + anchor nav), a data-cards row, then every module as a
|
||||
section. No icon-rail column, no left list column, no right
|
||||
panel column — the old shell classes are gone with them. */
|
||||
.dash-topbar{position:sticky;top:0;z-index:10;background:#fff;border-bottom:1px solid var(--line);padding:10px 20px 8px}
|
||||
.dash-topbar-row{display:flex;gap:14px;align-items:center;flex-wrap:wrap}
|
||||
.dash-brand{font-weight:700;font-size:17px}
|
||||
.dash-status{font-size:13px;font-weight:600;color:var(--muted)}
|
||||
.dash-status.ok{color:var(--green)}
|
||||
.dash-stamp{margin-left:auto}
|
||||
.dash-nav{display:flex;gap:4px;flex-wrap:wrap;margin-top:8px}
|
||||
.dash-nav a{color:var(--text);text-decoration:none;font-size:13px;font-weight:600;padding:6px 12px;border-radius:999px}
|
||||
.dash-nav a:hover{background:#f2f2f2}
|
||||
.dash-page{max-width:1180px;margin:0 auto;padding:20px;display:flex;flex-direction:column;gap:20px}
|
||||
.dash-section{scroll-margin-top:130px;display:flex;flex-direction:column;gap:20px}
|
||||
.dash-section.card{padding:20px}
|
||||
.dash-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
|
||||
.dash-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;min-width:0}
|
||||
.dash-card-label{color:var(--muted);font-size:13px;font-weight:600}
|
||||
.dash-card-value{font-size:28px;font-weight:700;line-height:1.3;overflow-wrap:anywhere}
|
||||
|
||||
|
||||
/* Cards: flat white sections with a hairline border, no shadow. */
|
||||
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:none;padding:20px}
|
||||
@@ -158,19 +131,17 @@ pre{background:#f9fafb;color:var(--text);border:1px solid var(--line);border-rad
|
||||
.chat-send{width:36px;height:36px;border-radius:50%;background:var(--bubble-user);border:0;color:var(--accent-dark);padding:0;display:grid;place-items:center;font-size:18px;line-height:1;flex:none}
|
||||
.chat-send:disabled{opacity:.45;background:#f2f2f2;color:var(--muted)}
|
||||
.conv-divider{border-top:1px solid var(--line);margin:4px 0}
|
||||
@media (max-width:1240px){
|
||||
.muse-app{grid-template-columns:56px 260px minmax(0,1fr)}
|
||||
.muse-app.no-right{grid-template-columns:56px 260px minmax(0,1fr)}
|
||||
.right-col{grid-column:1 / -1;border-left:0;border-top:1px solid var(--line)}
|
||||
}
|
||||
@media (max-width:900px){
|
||||
.muse-app,.muse-app.no-right{grid-template-columns:1fr}
|
||||
.icon-rail{display:none}
|
||||
.center-inner{padding:16px 14px}
|
||||
.dash-cards{grid-template-columns:repeat(2,1fr)}
|
||||
.dash-hide-sm{display:none}
|
||||
.dash-page{padding:14px}
|
||||
.dash-section.card{padding:16px}
|
||||
.card{padding:16px}
|
||||
th:nth-child(2),td:nth-child(2),th:nth-child(3),td:nth-child(3),th:nth-child(7),td:nth-child(7){display:none}
|
||||
}
|
||||
@media (max-width:560px){
|
||||
.dash-cards{grid-template-columns:1fr}
|
||||
.dash-nav{flex-wrap:nowrap;overflow-x:auto}
|
||||
.card{padding:16px}
|
||||
th:nth-child(6),td:nth-child(6),th:nth-child(9),td:nth-child(9){display:none}
|
||||
.bar > input[type="text"],.bar > input[type="password"],.bar > select{flex:1 1 100%}
|
||||
|
||||
+26
-26
@@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Codex 命令台</title>
|
||||
<script type="module" crossorigin>(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const _ of document.querySelectorAll('link[rel="modulepreload"]'))o(_);new MutationObserver(_=>{for(const M of _)if(M.type==="childList")for(const N of M.addedNodes)N.tagName==="LINK"&&N.rel==="modulepreload"&&o(N)}).observe(document,{childList:!0,subtree:!0});function m(_){const M={};return _.integrity&&(M.integrity=_.integrity),_.referrerPolicy&&(M.referrerPolicy=_.referrerPolicy),_.crossOrigin==="use-credentials"?M.credentials="include":_.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function o(_){if(_.ep)return;_.ep=!0;const M=m(_);fetch(_.href,M)}})();function qh(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var er={exports:{}},li={};/**
|
||||
<script type="module" crossorigin>(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const _ of document.querySelectorAll('link[rel="modulepreload"]'))o(_);new MutationObserver(_=>{for(const O of _)if(O.type==="childList")for(const N of O.addedNodes)N.tagName==="LINK"&&N.rel==="modulepreload"&&o(N)}).observe(document,{childList:!0,subtree:!0});function m(_){const O={};return _.integrity&&(O.integrity=_.integrity),_.referrerPolicy&&(O.referrerPolicy=_.referrerPolicy),_.crossOrigin==="use-credentials"?O.credentials="include":_.crossOrigin==="anonymous"?O.credentials="omit":O.credentials="same-origin",O}function o(_){if(_.ep)return;_.ep=!0;const O=m(_);fetch(_.href,O)}})();function qh(c){return c&&c.__esModule&&Object.prototype.hasOwnProperty.call(c,"default")?c.default:c}var er={exports:{}},lc={};/**
|
||||
* @license React
|
||||
* react-jsx-runtime.production.js
|
||||
*
|
||||
@@ -12,7 +12,7 @@
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Nh;function Ay(){if(Nh)return li;Nh=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function m(o,_,M){var N=null;if(M!==void 0&&(N=""+M),_.key!==void 0&&(N=""+_.key),"key"in _){M={};for(var E in _)E!=="key"&&(M[E]=_[E])}else M=_;return _=M.ref,{$$typeof:i,type:o,key:N,ref:_!==void 0?_:null,props:M}}return li.Fragment=r,li.jsx=m,li.jsxs=m,li}var Ch;function My(){return Ch||(Ch=1,er.exports=Ay()),er.exports}var s=My(),lr={exports:{}},ct={};/**
|
||||
*/var Nh;function Ny(){if(Nh)return lc;Nh=1;var c=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function m(o,_,O){var N=null;if(O!==void 0&&(N=""+O),_.key!==void 0&&(N=""+_.key),"key"in _){O={};for(var E in _)E!=="key"&&(O[E]=_[E])}else O=_;return _=O.ref,{$$typeof:c,type:o,key:N,ref:_!==void 0?_:null,props:O}}return lc.Fragment=r,lc.jsx=m,lc.jsxs=m,lc}var Ch;function Cy(){return Ch||(Ch=1,er.exports=Ny()),er.exports}var s=Cy(),lr={exports:{}},ct={};/**
|
||||
* @license React
|
||||
* react.production.js
|
||||
*
|
||||
@@ -20,7 +20,7 @@
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Ah;function Oy(){if(Ah)return ct;Ah=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),N=Symbol.for("react.context"),E=Symbol.for("react.forward_ref"),B=Symbol.for("react.suspense"),z=Symbol.for("react.memo"),G=Symbol.for("react.lazy"),j=Symbol.for("react.activity"),V=Symbol.for("react.view_transition"),ut=Symbol.iterator;function K(v){return v===null||typeof v!="object"?null:(v=ut&&v[ut]||v["@@iterator"],typeof v=="function"?v:null)}var tt={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},it=Object.assign,jt={};function Xt(v,R,W){this.props=v,this.context=R,this.refs=jt,this.updater=W||tt}Xt.prototype.isReactComponent={},Xt.prototype.setState=function(v,R){if(typeof v!="object"&&typeof v!="function"&&v!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,v,R,"setState")},Xt.prototype.forceUpdate=function(v){this.updater.enqueueForceUpdate(this,v,"forceUpdate")};function ge(){}ge.prototype=Xt.prototype;function Oe(v,R,W){this.props=v,this.context=R,this.refs=jt,this.updater=W||tt}var Jt=Oe.prototype=new ge;Jt.constructor=Oe,it(Jt,Xt.prototype),Jt.isPureReactComponent=!0;var fe=Array.isArray;function st(){}var ht={H:null,A:null,T:null,S:null},Ft=Object.prototype.hasOwnProperty;function Pt(v,R,W){var J=W.ref;return{$$typeof:i,type:v,key:R,ref:J!==void 0?J:null,props:W}}function kt(v,R){return Pt(v.type,R,v.props)}function re(v){return typeof v=="object"&&v!==null&&v.$$typeof===i}function Dt(v){var R={"=":"=0",":":"=2"};return"$"+v.replace(/[=:]/g,function(W){return R[W]})}var tl=/\/+/g;function U(v,R){return typeof v=="object"&&v!==null&&v.key!=null?Dt(""+v.key):R.toString(36)}function w(v){switch(v.status){case"fulfilled":return v.value;case"rejected":throw v.reason;default:switch(typeof v.status=="string"?v.then(st,st):(v.status="pending",v.then(function(R){v.status==="pending"&&(v.status="fulfilled",v.value=R)},function(R){v.status==="pending"&&(v.status="rejected",v.reason=R)})),v.status){case"fulfilled":return v.value;case"rejected":throw v.reason}}throw v}function k(v,R,W,J,yt){var dt=typeof v;(dt==="undefined"||dt==="boolean")&&(v=null);var xt=!1;if(v===null)xt=!0;else switch(dt){case"bigint":case"string":case"number":xt=!0;break;case"object":switch(v.$$typeof){case i:case r:xt=!0;break;case G:return xt=v._init,k(xt(v._payload),R,W,J,yt)}}if(xt)return yt=yt(v),xt=J===""?"."+U(v,0):J,fe(yt)?(W="",xt!=null&&(W=xt.replace(tl,"$&/")+"/"),k(yt,R,W,"",function(Se){return Se})):yt!=null&&(re(yt)&&(yt=kt(yt,W+(yt.key==null||v&&v.key===yt.key?"":(""+yt.key).replace(tl,"$&/")+"/")+xt)),R.push(yt)),1;xt=0;var Q=J===""?".":J+":";if(fe(v))for(var at=0;at<v.length;at++)J=v[at],dt=Q+U(J,at),xt+=k(J,R,W,dt,yt);else if(at=K(v),typeof at=="function")for(v=at.call(v),at=0;!(J=v.next()).done;)J=J.value,dt=Q+U(J,at++),xt+=k(J,R,W,dt,yt);else if(dt==="object"){if(typeof v.then=="function")return k(w(v),R,W,J,yt);throw R=String(v),Error("Objects are not valid as a React child (found: "+(R==="[object Object]"?"object with keys {"+Object.keys(v).join(", ")+"}":R)+"). If you meant to render a collection of children, use an array instead.")}return xt}function et(v,R,W){if(v==null)return v;var J=[],yt=0;return k(v,J,"","",function(dt){return R.call(W,dt,yt++)}),J}function Tt(v){if(v._status===-1){var R=v._result,W=R();W.then(function(J){(v._status===0||v._status===-1)&&(v._status=1,v._result=J,W.status===void 0&&(W.status="fulfilled",W.value=J))},function(J){(v._status===0||v._status===-1)&&(v._status=2,v._result=J,W.status===void 0&&(W.status="rejected",W.reason=J))}),v._status===-1&&(v._status=0,v._result=W)}if(v._status===1)return v._result.default;throw v._result}var vt=typeof reportError=="function"?reportError:function(v){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var R=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof v=="object"&&v!==null&&typeof v.message=="string"?String(v.message):String(v),error:v});if(!window.dispatchEvent(R))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",v);return}console.error(v)};function te(v){var R=ht.T,W={};W.types=R!==null?R.types:null,ht.T=W;try{var J=v(),yt=ht.S;yt!==null&&yt(W,J),typeof J=="object"&&J!==null&&typeof J.then=="function"&&J.then(st,vt)}catch(dt){vt(dt)}finally{R!==null&&W.types!==null&&(R.types=W.types),ht.T=R}}function ze(v){var R=ht.T;if(R!==null){var W=R.types;W===null?R.types=[v]:W.indexOf(v)===-1&&W.push(v)}else te(ze.bind(null,v))}var ne={map:et,forEach:function(v,R,W){et(v,function(){R.apply(this,arguments)},W)},count:function(v){var R=0;return et(v,function(){R++}),R},toArray:function(v){return et(v,function(R){return R})||[]},onLine truncated
|
||||
*/var Ah;function Ay(){if(Ah)return ct;Ah=1;var c=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),O=Symbol.for("react.consumer"),N=Symbol.for("react.context"),E=Symbol.for("react.forward_ref"),X=Symbol.for("react.suspense"),D=Symbol.for("react.memo"),G=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),w=Symbol.for("react.view_transition"),at=Symbol.iterator;function st(v){return v===null||typeof v!="object"?null:(v=at&&v[at]||v["@@iterator"],typeof v=="function"?v:null)}var et={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},k=Object.assign,dt={};function Ut(v,z,W){this.props=v,this.context=z,this.refs=dt,this.updater=W||et}Ut.prototype.isReactComponent={},Ut.prototype.setState=function(v,z){if(typeof v!="object"&&typeof v!="function"&&v!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,v,z,"setState")},Ut.prototype.forceUpdate=function(v){this.updater.enqueueForceUpdate(this,v,"forceUpdate")};function ye(){}ye.prototype=Ut.prototype;function Me(v,z,W){this.props=v,this.context=z,this.refs=dt,this.updater=W||et}var Jt=Me.prototype=new ye;Jt.constructor=Me,k(Jt,Ut.prototype),Jt.isPureReactComponent=!0;var fe=Array.isArray;function it(){}var vt={H:null,A:null,T:null,S:null},Ft=Object.prototype.hasOwnProperty;function Pt(v,z,W){var J=W.ref;return{$$typeof:c,type:v,key:z,ref:J!==void 0?J:null,props:W}}function kt(v,z){return Pt(v.type,z,v.props)}function re(v){return typeof v=="object"&&v!==null&&v.$$typeof===c}function Ht(v){var z={"=":"=0",":":"=2"};return"$"+v.replace(/[=:]/g,function(W){return z[W]})}var tl=/\/+/g;function U(v,z){return typeof v=="object"&&v!==null&&v.key!=null?Ht(""+v.key):z.toString(36)}function q(v){switch(v.status){case"fulfilled":return v.value;case"rejected":throw v.reason;default:switch(typeof v.status=="string"?v.then(it,it):(v.status="pending",v.then(function(z){v.status==="pending"&&(v.status="fulfilled",v.value=z)},function(z){v.status==="pending"&&(v.status="rejected",v.reason=z)})),v.status){case"fulfilled":return v.value;case"rejected":throw v.reason}}throw v}function K(v,z,W,J,gt){var mt=typeof v;(mt==="undefined"||mt==="boolean")&&(v=null);var jt=!1;if(v===null)jt=!0;else switch(mt){case"bigint":case"string":case"number":jt=!0;break;case"object":switch(v.$$typeof){case c:case r:jt=!0;break;case G:return jt=v._init,K(jt(v._payload),z,W,J,gt)}}if(jt)return gt=gt(v),jt=J===""?"."+U(v,0):J,fe(gt)?(W="",jt!=null&&(W=jt.replace(tl,"$&/")+"/"),K(gt,z,W,"",function(ge){return ge})):gt!=null&&(re(gt)&&(gt=kt(gt,W+(gt.key==null||v&&v.key===gt.key?"":(""+gt.key).replace(tl,"$&/")+"/")+jt)),z.push(gt)),1;jt=0;var Q=J===""?".":J+":";if(fe(v))for(var nt=0;nt<v.length;nt++)J=v[nt],mt=Q+U(J,nt),jt+=K(J,z,W,mt,gt);else if(nt=st(v),typeof nt=="function")for(v=nt.call(v),nt=0;!(J=v.next()).done;)J=J.value,mt=Q+U(J,nt++),jt+=K(J,z,W,mt,gt);else if(mt==="object"){if(typeof v.then=="function")return K(q(v),z,W,J,gt);throw z=String(v),Error("Objects are not valid as a React child (found: "+(z==="[object Object]"?"object with keys {"+Object.keys(v).join(", ")+"}":z)+"). If you meant to render a collection of children, use an array instead.")}return jt}function tt(v,z,W){if(v==null)return v;var J=[],gt=0;return K(v,J,"","",function(mt){return z.call(W,mt,gt++)}),J}function xt(v){if(v._status===-1){var z=v._result,W=z();W.then(function(J){(v._status===0||v._status===-1)&&(v._status=1,v._result=J,W.status===void 0&&(W.status="fulfilled",W.value=J))},function(J){(v._status===0||v._status===-1)&&(v._status=2,v._result=J,W.status===void 0&&(W.status="rejected",W.reason=J))}),v._status===-1&&(v._status=0,v._result=W)}if(v._status===1)return v._result.default;throw v._result}var yt=typeof reportError=="function"?reportError:function(v){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var z=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof v=="object"&&v!==null&&typeof v.message=="string"?String(v.message):String(v),error:v});if(!window.dispatchEvent(z))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",v);return}console.error(v)};function te(v){var z=vt.T,W={};W.types=z!==null?z.types:null,vt.T=W;try{var J=v(),gt=vt.S;gt!==null&>(W,J),typeof J=="object"&&J!==null&&typeof J.then=="function"&&J.then(it,yt)}catch(mt){yt(mt)}finally{z!==null&&W.types!==null&&(z.types=W.types),vt.T=z}}function ze(v){var z=vt.T;if(z!==null){var W=z.types;W===null?z.types=[v]:W.indexOf(v)===-1&&W.push(v)}else te(ze.bind(null,v))}var ne={map:tt,forEach:function(v,z,W){tt(v,function(){z.apply(this,arguments)},W)},count:function(v){var z=0;return tt(v,function(){z++}),z},toArray:function(v){return tt(v,function(z){return z})||[]},onLine truncated
|
||||
* @license React
|
||||
* scheduler.production.js
|
||||
*
|
||||
@@ -28,7 +28,7 @@
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Oh;function Ry(){return Oh||(Oh=1,(function(i){function r(w,k){var et=w.length;w.push(k);t:for(;0<et;){var Tt=et-1>>>1,vt=w[Tt];if(0<_(vt,k))w[Tt]=k,w[et]=vt,et=Tt;else break t}}function m(w){return w.length===0?null:w[0]}function o(w){if(w.length===0)return null;var k=w[0],et=w.pop();if(et!==k){w[0]=et;t:for(var Tt=0,vt=w.length,te=vt>>>1;Tt<te;){var ze=2*(Tt+1)-1,ne=w[ze],v=ze+1,R=w[v];if(0>_(ne,et))v<vt&&0>_(R,ne)?(w[Tt]=R,w[v]=et,Tt=v):(w[Tt]=ne,w[ze]=et,Tt=ze);else if(v<vt&&0>_(R,et))w[Tt]=R,w[v]=et,Tt=v;else break t}}return k}function _(w,k){var et=w.sortIndex-k.sortIndex;return et!==0?et:w.id-k.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;i.unstable_now=function(){return M.now()}}else{var N=Date,E=N.now();i.unstable_now=function(){return N.now()-E}}var B=[],z=[],G=1,j=null,V=3,ut=!1,K=!1,tt=!1,it=!1,jt=typeof setTimeout=="function"?setTimeout:null,Xt=typeof clearTimeout=="function"?clearTimeout:null,ge=typeof setImmediate<"u"?setImmediate:null;function Oe(w){for(var k=m(z);k!==null;){if(k.callback===null)o(z);else if(k.startTime<=w)o(z),k.sortIndex=k.expirationTime,r(B,k);else break;k=m(z)}}function Jt(w){if(tt=!1,Oe(w),!K)if(m(B)!==null)K=!0,fe||(fe=!0,re());else{var k=m(z);k!==null&&U(Jt,k.startTime-w)}}var fe=!1,st=-1,ht=5,Ft=-1;function Pt(){return it?!0:!(i.unstable_now()-Ft<ht)}function kt(){if(it=!1,fe){var w=i.unstable_now();Ft=w;var k=!0;try{t:{K=!1,tt&&(tt=!1,Xt(st),st=-1),ut=!0;var et=V;try{e:{for(Oe(w),j=m(B);j!==null&&!(j.expirationTime>w&&Pt());){var Tt=j.callback;if(typeof Tt=="function"){j.callback=null,V=j.priorityLevel;var vt=Tt(j.expirationTime<=w);if(w=i.unstable_now(),typeof vt=="function"){j.callback=vt,Oe(w),k=!0;break e}j===m(B)&&o(B),Oe(w)}else o(B);j=m(B)}if(j!==null)k=!0;else{var te=m(z);te!==null&&U(Jt,te.startTime-w),k=!1}}break t}finally{j=null,V=et,ut=!1}k=void 0}}finally{k?re():fe=!1}}}var re;if(typeof ge=="function")re=function(){ge(kt)};else if(typeof MessageChannel<"u"){var Dt=new MessageChannel,tl=Dt.port2;Dt.port1.onmessage=kt,re=function(){tl.postMessage(null)}}else re=function(){jt(kt,0)};function U(w,k){st=jt(function(){w(i.unstable_now())},k)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(w){w.callback=null},i.unstable_forceFrameRate=function(w){0>w||125<w?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):ht=0<w?Math.floor(1e3/w):5},i.unstable_getCurrentPriorityLevel=function(){return V},i.unstable_next=function(w){switch(V){case 1:case 2:case 3:var k=3;break;default:k=V}var et=V;V=k;try{return w()}finally{V=et}},i.unstable_requestPaint=function(){it=!0},i.unstable_runWithPriority=function(w,k){switch(w){case 1:case 2:case 3:case 4:case 5:break;default:w=3}var et=V;V=w;try{return k()}finally{V=et}},i.unstable_scheduleCallback=function(w,k,et){var Tt=i.unstable_now();switch(typeof et=="object"&&et!==null?(et=et.delay,et=typeof et=="number"&&0<et?Tt+et:Tt):et=Tt,w){case 1:var vt=-1;break;case 2:vt=250;break;case 5:vt=1073741823;break;case 4:vt=1e4;break;default:vt=5e3}return vt=et+vt,w={id:G++,callback:k,priorityLevel:w,startTime:et,expirationTime:vt,sortIndex:-1},et>Tt?(w.sortIndex=et,r(z,w),m(B)===null&&w===m(z)&&(tt?(Xt(st),st=-1):tt=!0,U(Jt,et-Tt))):(w.sortIndex=vt,r(B,w),K||ut||(K=!0,fe||(fe=!0,re()))),w},i.unstable_shouldYield=Pt,i.unstable_wrapCallback=function(w){var k=V;return function(){var et=V;V=k;try{return w.apply(this,arguments)}finally{V=et}}}})(ur)),ur}var zh;function Dy(){return zh||(zh=1,nr.exports=Ry()),nr.exports}var ir={exports:{}},Me={};/**
|
||||
*/var Mh;function My(){return Mh||(Mh=1,(function(c){function r(q,K){var tt=q.length;q.push(K);t:for(;0<tt;){var xt=tt-1>>>1,yt=q[xt];if(0<_(yt,K))q[xt]=K,q[tt]=yt,tt=xt;else break t}}function m(q){return q.length===0?null:q[0]}function o(q){if(q.length===0)return null;var K=q[0],tt=q.pop();if(tt!==K){q[0]=tt;t:for(var xt=0,yt=q.length,te=yt>>>1;xt<te;){var ze=2*(xt+1)-1,ne=q[ze],v=ze+1,z=q[v];if(0>_(ne,tt))v<yt&&0>_(z,ne)?(q[xt]=z,q[v]=tt,xt=v):(q[xt]=ne,q[ze]=tt,xt=ze);else if(v<yt&&0>_(z,tt))q[xt]=z,q[v]=tt,xt=v;else break t}}return K}function _(q,K){var tt=q.sortIndex-K.sortIndex;return tt!==0?tt:q.id-K.id}if(c.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var O=performance;c.unstable_now=function(){return O.now()}}else{var N=Date,E=N.now();c.unstable_now=function(){return N.now()-E}}var X=[],D=[],G=1,b=null,w=3,at=!1,st=!1,et=!1,k=!1,dt=typeof setTimeout=="function"?setTimeout:null,Ut=typeof clearTimeout=="function"?clearTimeout:null,ye=typeof setImmediate<"u"?setImmediate:null;function Me(q){for(var K=m(D);K!==null;){if(K.callback===null)o(D);else if(K.startTime<=q)o(D),K.sortIndex=K.expirationTime,r(X,K);else break;K=m(D)}}function Jt(q){if(et=!1,Me(q),!st)if(m(X)!==null)st=!0,fe||(fe=!0,re());else{var K=m(D);K!==null&&U(Jt,K.startTime-q)}}var fe=!1,it=-1,vt=5,Ft=-1;function Pt(){return k?!0:!(c.unstable_now()-Ft<vt)}function kt(){if(k=!1,fe){var q=c.unstable_now();Ft=q;var K=!0;try{t:{st=!1,et&&(et=!1,Ut(it),it=-1),at=!0;var tt=w;try{e:{for(Me(q),b=m(X);b!==null&&!(b.expirationTime>q&&Pt());){var xt=b.callback;if(typeof xt=="function"){b.callback=null,w=b.priorityLevel;var yt=xt(b.expirationTime<=q);if(q=c.unstable_now(),typeof yt=="function"){b.callback=yt,Me(q),K=!0;break e}b===m(X)&&o(X),Me(q)}else o(X);b=m(X)}if(b!==null)K=!0;else{var te=m(D);te!==null&&U(Jt,te.startTime-q),K=!1}}break t}finally{b=null,w=tt,at=!1}K=void 0}}finally{K?re():fe=!1}}}var re;if(typeof ye=="function")re=function(){ye(kt)};else if(typeof MessageChannel<"u"){var Ht=new MessageChannel,tl=Ht.port2;Ht.port1.onmessage=kt,re=function(){tl.postMessage(null)}}else re=function(){dt(kt,0)};function U(q,K){it=dt(function(){q(c.unstable_now())},K)}c.unstable_IdlePriority=5,c.unstable_ImmediatePriority=1,c.unstable_LowPriority=4,c.unstable_NormalPriority=3,c.unstable_Profiling=null,c.unstable_UserBlockingPriority=2,c.unstable_cancelCallback=function(q){q.callback=null},c.unstable_forceFrameRate=function(q){0>q||125<q?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):vt=0<q?Math.floor(1e3/q):5},c.unstable_getCurrentPriorityLevel=function(){return w},c.unstable_next=function(q){switch(w){case 1:case 2:case 3:var K=3;break;default:K=w}var tt=w;w=K;try{return q()}finally{w=tt}},c.unstable_requestPaint=function(){k=!0},c.unstable_runWithPriority=function(q,K){switch(q){case 1:case 2:case 3:case 4:case 5:break;default:q=3}var tt=w;w=q;try{return K()}finally{w=tt}},c.unstable_scheduleCallback=function(q,K,tt){var xt=c.unstable_now();switch(typeof tt=="object"&&tt!==null?(tt=tt.delay,tt=typeof tt=="number"&&0<tt?xt+tt:xt):tt=xt,q){case 1:var yt=-1;break;case 2:yt=250;break;case 5:yt=1073741823;break;case 4:yt=1e4;break;default:yt=5e3}return yt=tt+yt,q={id:G++,callback:K,priorityLevel:q,startTime:tt,expirationTime:yt,sortIndex:-1},tt>xt?(q.sortIndex=tt,r(D,q),m(X)===null&&q===m(D)&&(et?(Ut(it),it=-1):et=!0,U(Jt,tt-xt))):(q.sortIndex=yt,r(X,q),st||at||(st=!0,fe||(fe=!0,re()))),q},c.unstable_shouldYield=Pt,c.unstable_wrapCallback=function(q){var K=w;return function(){var tt=w;w=K;try{return q.apply(this,arguments)}finally{w=tt}}}})(ur)),ur}var zh;function zy(){return zh||(zh=1,nr.exports=My()),nr.exports}var cr={exports:{}},Ae={};/**
|
||||
* @license React
|
||||
* react-dom.production.js
|
||||
*
|
||||
@@ -36,7 +36,7 @@
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Rh;function Uy(){if(Rh)return Me;Rh=1;var i=rr();function r(G){var j="https://react.dev/errors/"+G;if(1<arguments.length){j+="?args[]="+encodeURIComponent(arguments[1]);for(var V=2;V<arguments.length;V++)j+="&args[]="+encodeURIComponent(arguments[V])}return"Minified React error #"+G+"; visit "+j+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function m(){}var o={d:{f:m,r:function(){throw Error(r(522))},D:m,C:m,L:m,m,X:m,S:m,M:m},p:0,findDOMNode:null},_=Symbol.for("react.portal"),M=Symbol.for("react.recoverable"),N=Symbol.for("react.optimistic_key");function E(G,j,V){var ut=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:_,key:ut==null?null:ut===N?N:""+ut,children:G,containerInfo:j,implementation:V}}var B=i.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function z(G,j){if(G==="font")return"";if(typeof j=="string")return j==="use-credentials"?j:""}return Me.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=o,Me.browser=function(G){return{$$typeof:M,_reason:G}},Me.createPortal=function(G,j){var V=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!j||j.nodeType!==1&&j.nodeType!==9&&j.nodeType!==11)throw Error(r(299));return E(G,j,null,V)},Me.flushSync=function(G){var j=B.T,V=o.p;try{if(B.T=null,o.p=2,G)return G()}finally{B.T=j,o.p=V,o.d.f()}},Me.preconnect=function(G,j){typeof G=="string"&&(j?(j=j.crossOrigin,j=typeof j=="string"?j==="use-credentials"?j:"":void 0):j=null,o.d.C(G,j))},Me.prefetchDNS=function(G){typeof G=="string"&&o.d.D(G)},Me.preinit=function(G,j){if(typeof G=="string"&&j&&typeof j.as=="string"){var V=j.as,ut=z(V,j.crossOrigin),K=typeof j.integrity=="string"?j.integrity:void 0,tt=typeof j.fetchPriority=="string"?j.fetchPriority:void 0;V==="style"?o.d.S(G,typeof j.precedence=="string"?j.precedence:void 0,{crossOrigin:ut,integrity:K,fetchPriority:tt}):V==="script"&&o.d.X(G,{crossOrigin:ut,integrity:K,fetchPriority:tt,nonce:typeof j.nonce=="string"?j.nonce:void 0})}},Me.preinitModule=function(G,j){if(typeof G=="string")if(typeof j=="object"&&j!==null){if(j.as==null||j.as==="script"){var V=z(j.as,j.crossOrigin);o.d.M(G,{crossOrigin:V,integrity:typeof j.integrity=="string"?j.integrity:void 0,nonce:typeof j.nonce=="string"?j.nonce:void 0,fetchPriority:typeof j.fetchPriority=="string"?j.fetchPriority:void 0})}}else j==null&&o.d.M(G)},Me.preload=function(G,j){if(typeof G=="string"&&typeof j=="object"&&j!==null&&typeof j.as=="string"){var V=j.as,ut=z(V,j.crossOrigin);o.d.L(G,V,{crossOrigin:ut,integrity:typeof j.integrity=="string"?j.integrity:void 0,nonce:typeof j.nonce=="string"?j.nonce:void 0,type:typeof j.type=="string"?j.type:void 0,fetchPriority:typeof j.fetchPriority=="string"?j.fetchPriority:void 0,referrerPolicy:typeof j.referrerPolicy=="string"?j.referrerPolicy:void 0,imageSrcSet:typeof j.imageSrcSet=="string"?j.imageSrcSet:void 0,imageSizes:typeof j.imageSizes=="string"?j.imageSizes:void 0,media:typeof j.media=="string"?j.media:void 0})}},Me.preloadModule=function(G,j){if(typeof G=="string")if(j){var V=z(j.as,j.crossOrigin);o.d.m(G,{as:typeof j.as=="string"&&j.as!=="script"?j.as:void 0,crossOrigin:V,integrity:typeof j.integrity=="string"?j.integrity:void 0,nonce:typeof j.nonce=="string"?j.nonce:void 0,fetchPriority:typeof j.fetchPriority=="string"?j.fetchPriority:void 0})}else o.d.m(G)},Me.requestFormReset=function(G){o.d.r(G)},Me.unstable_batchedUpdates=function(G,j){return G(j)},Me.useFormState=function(G,j,V){return B.H.useFormState(G,j,V)},Me.useFormStatus=function(){return B.H.useHostTransitionStatus()},Me.version="19.3.1",Me}var Dh;function Hy(){if(Dh)return ir.exports;Dh=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(r){console.error(r)}}return i(),ir.exports=Uy(),ir.exports}/**
|
||||
*/var Rh;function Ry(){if(Rh)return Ae;Rh=1;var c=rr();function r(G){var b="https://react.dev/errors/"+G;if(1<arguments.length){b+="?args[]="+encodeURIComponent(arguments[1]);for(var w=2;w<arguments.length;w++)b+="&args[]="+encodeURIComponent(arguments[w])}return"Minified React error #"+G+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function m(){}var o={d:{f:m,r:function(){throw Error(r(522))},D:m,C:m,L:m,m,X:m,S:m,M:m},p:0,findDOMNode:null},_=Symbol.for("react.portal"),O=Symbol.for("react.recoverable"),N=Symbol.for("react.optimistic_key");function E(G,b,w){var at=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:_,key:at==null?null:at===N?N:""+at,children:G,containerInfo:b,implementation:w}}var X=c.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function D(G,b){if(G==="font")return"";if(typeof b=="string")return b==="use-credentials"?b:""}return Ae.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=o,Ae.browser=function(G){return{$$typeof:O,_reason:G}},Ae.createPortal=function(G,b){var w=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!b||b.nodeType!==1&&b.nodeType!==9&&b.nodeType!==11)throw Error(r(299));return E(G,b,null,w)},Ae.flushSync=function(G){var b=X.T,w=o.p;try{if(X.T=null,o.p=2,G)return G()}finally{X.T=b,o.p=w,o.d.f()}},Ae.preconnect=function(G,b){typeof G=="string"&&(b?(b=b.crossOrigin,b=typeof b=="string"?b==="use-credentials"?b:"":void 0):b=null,o.d.C(G,b))},Ae.prefetchDNS=function(G){typeof G=="string"&&o.d.D(G)},Ae.preinit=function(G,b){if(typeof G=="string"&&b&&typeof b.as=="string"){var w=b.as,at=D(w,b.crossOrigin),st=typeof b.integrity=="string"?b.integrity:void 0,et=typeof b.fetchPriority=="string"?b.fetchPriority:void 0;w==="style"?o.d.S(G,typeof b.precedence=="string"?b.precedence:void 0,{crossOrigin:at,integrity:st,fetchPriority:et}):w==="script"&&o.d.X(G,{crossOrigin:at,integrity:st,fetchPriority:et,nonce:typeof b.nonce=="string"?b.nonce:void 0})}},Ae.preinitModule=function(G,b){if(typeof G=="string")if(typeof b=="object"&&b!==null){if(b.as==null||b.as==="script"){var w=D(b.as,b.crossOrigin);o.d.M(G,{crossOrigin:w,integrity:typeof b.integrity=="string"?b.integrity:void 0,nonce:typeof b.nonce=="string"?b.nonce:void 0,fetchPriority:typeof b.fetchPriority=="string"?b.fetchPriority:void 0})}}else b==null&&o.d.M(G)},Ae.preload=function(G,b){if(typeof G=="string"&&typeof b=="object"&&b!==null&&typeof b.as=="string"){var w=b.as,at=D(w,b.crossOrigin);o.d.L(G,w,{crossOrigin:at,integrity:typeof b.integrity=="string"?b.integrity:void 0,nonce:typeof b.nonce=="string"?b.nonce:void 0,type:typeof b.type=="string"?b.type:void 0,fetchPriority:typeof b.fetchPriority=="string"?b.fetchPriority:void 0,referrerPolicy:typeof b.referrerPolicy=="string"?b.referrerPolicy:void 0,imageSrcSet:typeof b.imageSrcSet=="string"?b.imageSrcSet:void 0,imageSizes:typeof b.imageSizes=="string"?b.imageSizes:void 0,media:typeof b.media=="string"?b.media:void 0})}},Ae.preloadModule=function(G,b){if(typeof G=="string")if(b){var w=D(b.as,b.crossOrigin);o.d.m(G,{as:typeof b.as=="string"&&b.as!=="script"?b.as:void 0,crossOrigin:w,integrity:typeof b.integrity=="string"?b.integrity:void 0,nonce:typeof b.nonce=="string"?b.nonce:void 0,fetchPriority:typeof b.fetchPriority=="string"?b.fetchPriority:void 0})}else o.d.m(G)},Ae.requestFormReset=function(G){o.d.r(G)},Ae.unstable_batchedUpdates=function(G,b){return G(b)},Ae.useFormState=function(G,b,w){return X.H.useFormState(G,b,w)},Ae.useFormStatus=function(){return X.H.useHostTransitionStatus()},Ae.version="19.3.1",Ae}var Dh;function Dy(){if(Dh)return cr.exports;Dh=1;function c(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(c)}catch(r){console.error(r)}}return c(),cr.exports=Ry(),cr.exports}/**
|
||||
* @license React
|
||||
* react-dom-client.production.js
|
||||
*
|
||||
@@ -44,32 +44,32 @@
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Uh;function By(){if(Uh)return ai;Uh=1;var i=Dy(),r=rr(),m=Hy();function o(t){var e="https://react.dev/errors/"+t;if(1<arguments.length){e+="?args[]="+encodeURIComponent(arguments[1]);for(var l=2;l<arguments.length;l++)e+="&args[]="+encodeURIComponent(arguments[l])}return"Minified React error #"+t+"; visit "+e+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function _(t){return!(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)}function M(t){for(var e=t,l=e;l&&!l.alternate;)e=l,(e.flags&4098)!==0&&(t=e.return),l=e.return;for(;e.return;)e=e.return;return e.tag===3?t:null}function N(t){if(t.tag===13){var e=t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e.dehydrated}return null}function E(t){if(t.tag===31){var e=t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e.dehydrated}return null}function B(t){if(M(t)!==t)throw Error(o(188))}function z(t){var e=t.alternate;if(!e){if(e=M(t),e===null)throw Error(o(188));return e!==t?null:t}for(var l=t,a=e;;){var n=l.return;if(n===null)break;var u=n.alternate;if(u===null){if(a=n.return,a!==null){l=a;continue}break}if(n.child===u.child){for(u=n.child;u;){if(u===l)return B(n),t;if(u===a)return B(n),e;u=u.sibling}throw Error(o(188))}if(l.return!==a.return)l=n,a=u;else{for(var c=!1,f=n.child;f;){if(f===l){c=!0,l=n,a=u;break}if(f===a){c=!0,a=n,l=u;break}f=f.sibling}if(!c){for(f=u.child;f;){if(f===l){c=!0,l=u,a=n;break}if(f===a){c=!0,a=u,l=n;break}f=f.sibling}if(!c)throw Error(o(189))}}if(l.alternate!==a)throw Error(o(190))}if(l.tag!==3)throw Error(o(188));return l.stateNode.current===l?t:e}function G(t){var e=t.tag;if(e===5||e===26||e===27||e===6)return t;for(t=t.child;t!==null;){if(e=G(t),e!==null)return e;t=t.sibling}return null}function j(t,e,l,a,n,u){for(;t!==null;){if((t.tag===5||t.tag===27||t.tag===6)&&l(t,a,n,u)||(t.tag!==22||t.memoizedState===null)&&(e||t.tag!==5&&t.tag!==27)&&j(t.child,e,l,a,n,u))return!0;t=t.sibling}return!1}function V(t){for(t=t.return;t!==null;){if(t.tag===3||t.tag===5||t.tag===27)return t;t=t.return}return null}function ut(t){var e=!1;for(t=t.return;t!==null&&(t.tag===4&&(e=!0),!(t.tag===3||t.tag===5||t.tag===27));)t=t.return;return e}function K(t){var e=[null,null],l=V(t);return l===null||tt(e,t,l.child,{foundSelf:!1}),e}function tt(t,e,l,a){for(;l!==null;){if(l===e)a.foundSelf=!0;else if(l.tag===5||l.tag===27||l.tag===6){if(a.foundSelf)return t[1]=l,!0;t[0]=l}else if((l.tag!==22||l.memoizedState===null)&&tt(t,e,l.child,a))return!0;l=l.sibling}return!1}function it(t){switch(t.tag){case 5:case 27:case 6:return t.stateNode;case 3:return t.stateNode.containerInfo;default:throw Error(o(559))}}var jt=null,Xt=null;function ge(t,e,l){return t===l?!0:t===e?(jt=t,!0):!1}function Oe(t,e,l){return t===l?(Xt=t,!1):t===e?(Xt!==null&&(jt=t),!0):!1}function Jt(t){if(t===null)return null;do t=t===null?null:t.return;while(t&&t.tag!==5&&t.tag!==27&&t.tag!==3);return t||null}function fe(t,e,l){for(var a=0,n=t;n;n=l(n))a++;n=0;for(var u=e;u;u=l(u))n++;for(;0<a-n;)t=l(t),a--;for(;0<n-a;)e=l(e),n--;for(;a--;){if(t===e||e!==null&&t===e.alternate)return t;t=l(t),e=l(e)}return null}var st=Object.assign,ht=Symbol.for("react.element"),Ft=Symbol.for("react.transitional.element"),Pt=Symbol.for("react.portal"),kt=Symbol.for("react.fragment"),re=Symbol.for("react.strict_mode"),Dt=Symbol.for("react.profiler"),tl=Symbol.for("react.consumer"),U=Symbol.for("react.context"),w=Symbol.for("react.forward_ref"),k=Symbol.for("react.suspense"),et=Symbol.for("react.suspense_list"),Tt=Symbol.for("react.memo"),vt=Symbol.for("react.lazy"),te=Symbol.for("react.activity"),ze=Symbol.for("react.legacy_hidden"),ne=Symbol.for("react.memo_cache_sentinel"),v=Symbol.for("react.view_transition"),R=Symbol.for("react.recoverable"),W=Symbol.iterator;function J(t){return t===null||typeof t!="object"?null:(t=W&&t[W]||t["@@iterator"],typeof t=="function"?t:null)}var yt=Symbol.for("react.client.reference");function dt(t){if(t==null)return null;if(typeof t=="function")return t.$$typeof===yt?null:t.displayName||t.name||null;if(typeof t=="string")return t;switch(t){case kt:return"Fragment";case Dt:return"Profiler";case re:return"StrictMode";case k:return"Suspense";case et:return"SuspenseList";case te:return"Activity";case v:return"ViewTransition"}if(typeof t=="object")switch(t.$$typeof){case Pt:return"Portal";case U:return t.displayName||"Context";case tl:return(t._context.displayName||"Context")+".Consumer";case w:var e=t.render;return t=t.displayName,t||(t=e.displayName||e.name||"",t=t!==""?"ForwardRef("+t+")":"ForwardRef"),t;case Tt:return e=t.displayName||null,e!==null?e:dt(t.type)||"Memo";case vt:e=t._payload,t=t._init;try{return dt(t(e))}catch{}}return null}var xt=Array.isArray,Q=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,at=m.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Se={pending:!1,data:null,method:null,actiLine truncated
|
||||
*/var Uh;function Uy(){if(Uh)return ac;Uh=1;var c=zy(),r=rr(),m=Dy();function o(t){var e="https://react.dev/errors/"+t;if(1<arguments.length){e+="?args[]="+encodeURIComponent(arguments[1]);for(var l=2;l<arguments.length;l++)e+="&args[]="+encodeURIComponent(arguments[l])}return"Minified React error #"+t+"; visit "+e+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function _(t){return!(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)}function O(t){for(var e=t,l=e;l&&!l.alternate;)e=l,(e.flags&4098)!==0&&(t=e.return),l=e.return;for(;e.return;)e=e.return;return e.tag===3?t:null}function N(t){if(t.tag===13){var e=t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e.dehydrated}return null}function E(t){if(t.tag===31){var e=t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e.dehydrated}return null}function X(t){if(O(t)!==t)throw Error(o(188))}function D(t){var e=t.alternate;if(!e){if(e=O(t),e===null)throw Error(o(188));return e!==t?null:t}for(var l=t,a=e;;){var n=l.return;if(n===null)break;var u=n.alternate;if(u===null){if(a=n.return,a!==null){l=a;continue}break}if(n.child===u.child){for(u=n.child;u;){if(u===l)return X(n),t;if(u===a)return X(n),e;u=u.sibling}throw Error(o(188))}if(l.return!==a.return)l=n,a=u;else{for(var i=!1,f=n.child;f;){if(f===l){i=!0,l=n,a=u;break}if(f===a){i=!0,a=n,l=u;break}f=f.sibling}if(!i){for(f=u.child;f;){if(f===l){i=!0,l=u,a=n;break}if(f===a){i=!0,a=u,l=n;break}f=f.sibling}if(!i)throw Error(o(189))}}if(l.alternate!==a)throw Error(o(190))}if(l.tag!==3)throw Error(o(188));return l.stateNode.current===l?t:e}function G(t){var e=t.tag;if(e===5||e===26||e===27||e===6)return t;for(t=t.child;t!==null;){if(e=G(t),e!==null)return e;t=t.sibling}return null}function b(t,e,l,a,n,u){for(;t!==null;){if((t.tag===5||t.tag===27||t.tag===6)&&l(t,a,n,u)||(t.tag!==22||t.memoizedState===null)&&(e||t.tag!==5&&t.tag!==27)&&b(t.child,e,l,a,n,u))return!0;t=t.sibling}return!1}function w(t){for(t=t.return;t!==null;){if(t.tag===3||t.tag===5||t.tag===27)return t;t=t.return}return null}function at(t){var e=!1;for(t=t.return;t!==null&&(t.tag===4&&(e=!0),!(t.tag===3||t.tag===5||t.tag===27));)t=t.return;return e}function st(t){var e=[null,null],l=w(t);return l===null||et(e,t,l.child,{foundSelf:!1}),e}function et(t,e,l,a){for(;l!==null;){if(l===e)a.foundSelf=!0;else if(l.tag===5||l.tag===27||l.tag===6){if(a.foundSelf)return t[1]=l,!0;t[0]=l}else if((l.tag!==22||l.memoizedState===null)&&et(t,e,l.child,a))return!0;l=l.sibling}return!1}function k(t){switch(t.tag){case 5:case 27:case 6:return t.stateNode;case 3:return t.stateNode.containerInfo;default:throw Error(o(559))}}var dt=null,Ut=null;function ye(t,e,l){return t===l?!0:t===e?(dt=t,!0):!1}function Me(t,e,l){return t===l?(Ut=t,!1):t===e?(Ut!==null&&(dt=t),!0):!1}function Jt(t){if(t===null)return null;do t=t===null?null:t.return;while(t&&t.tag!==5&&t.tag!==27&&t.tag!==3);return t||null}function fe(t,e,l){for(var a=0,n=t;n;n=l(n))a++;n=0;for(var u=e;u;u=l(u))n++;for(;0<a-n;)t=l(t),a--;for(;0<n-a;)e=l(e),n--;for(;a--;){if(t===e||e!==null&&t===e.alternate)return t;t=l(t),e=l(e)}return null}var it=Object.assign,vt=Symbol.for("react.element"),Ft=Symbol.for("react.transitional.element"),Pt=Symbol.for("react.portal"),kt=Symbol.for("react.fragment"),re=Symbol.for("react.strict_mode"),Ht=Symbol.for("react.profiler"),tl=Symbol.for("react.consumer"),U=Symbol.for("react.context"),q=Symbol.for("react.forward_ref"),K=Symbol.for("react.suspense"),tt=Symbol.for("react.suspense_list"),xt=Symbol.for("react.memo"),yt=Symbol.for("react.lazy"),te=Symbol.for("react.activity"),ze=Symbol.for("react.legacy_hidden"),ne=Symbol.for("react.memo_cache_sentinel"),v=Symbol.for("react.view_transition"),z=Symbol.for("react.recoverable"),W=Symbol.iterator;function J(t){return t===null||typeof t!="object"?null:(t=W&&t[W]||t["@@iterator"],typeof t=="function"?t:null)}var gt=Symbol.for("react.client.reference");function mt(t){if(t==null)return null;if(typeof t=="function")return t.$$typeof===gt?null:t.displayName||t.name||null;if(typeof t=="string")return t;switch(t){case kt:return"Fragment";case Ht:return"Profiler";case re:return"StrictMode";case K:return"Suspense";case tt:return"SuspenseList";case te:return"Activity";case v:return"ViewTransition"}if(typeof t=="object")switch(t.$$typeof){case Pt:return"Portal";case U:return t.displayName||"Context";case tl:return(t._context.displayName||"Context")+".Consumer";case q:var e=t.render;return t=t.displayName,t||(t=e.displayName||e.name||"",t=t!==""?"ForwardRef("+t+")":"ForwardRef"),t;case xt:return e=t.displayName||null,e!==null?e:mt(t.type)||"Memo";case yt:e=t._payload,t=t._init;try{return mt(t(e))}catch{}}return null}var jt=Array.isArray,Q=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,nt=m.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ge={pending:!1,data:null,method:null,actiLine truncated
|
||||
at`)?" (<anonymous>)":-1<l.stack.indexOf("@")?"@unknown:0:0":""}return`
|
||||
`+qe+t+ol}var Hl=!1;function dl(t,e){if(!t||Hl)return"";Hl=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(e){var A=function(){throw Error()};if(Object.defineProperty(A.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(A,[])}catch(q){var g=q}Reflect.construct(t,[],A)}else{try{A.call()}catch(q){g=q}A=!1;try{var x=Object.getOwnPropertyDescriptor(t.prototype,"props");Object.defineProperty(t.prototype,"props",{configurable:!0,set:function(){throw Error()}}),A=!0,new t}finally{A&&(x!==void 0?Object.defineProperty(t.prototype,"props",x):delete t.prototype.props)}}}else{try{throw Error()}catch(q){g=q}(A=t())&&typeof A.catch=="function"&&A.catch(function(){})}}catch(q){if(q&&g&&typeof q.stack=="string")return[q.stack,g.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var n=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");n&&n.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=a.DetermineComponentFrameRoot(),c=u[0],f=u[1];if(c&&f){var d=c.split(`
|
||||
`+qe+t+ol}var Hl=!1;function dl(t,e){if(!t||Hl)return"";Hl=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(e){var A=function(){throw Error()};if(Object.defineProperty(A.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(A,[])}catch(B){var g=B}Reflect.construct(t,[],A)}else{try{A.call()}catch(B){g=B}A=!1;try{var j=Object.getOwnPropertyDescriptor(t.prototype,"props");Object.defineProperty(t.prototype,"props",{configurable:!0,set:function(){throw Error()}}),A=!0,new t}finally{A&&(j!==void 0?Object.defineProperty(t.prototype,"props",j):delete t.prototype.props)}}}else{try{throw Error()}catch(B){g=B}(A=t())&&typeof A.catch=="function"&&A.catch(function(){})}}catch(B){if(B&&g&&typeof B.stack=="string")return[B.stack,g.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var n=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");n&&n.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=a.DetermineComponentFrameRoot(),i=u[0],f=u[1];if(i&&f){var d=i.split(`
|
||||
`),p=f.split(`
|
||||
`);for(n=a=0;a<d.length&&!d[a].includes("DetermineComponentFrameRoot");)a++;for(;n<p.length&&!p[n].includes("DetermineComponentFrameRoot");)n++;if(a===d.length||n===p.length)for(a=d.length-1,n=p.length-1;1<=a&&0<=n&&d[a]!==p[n];)n--;for(;1<=a&&0<=n;a--,n--)if(d[a]!==p[n]){if(a!==1||n!==1)do if(a--,n--,0>n||d[a]!==p[n]){var T=`
|
||||
`+d[a].replace(" at new "," at ");return t.displayName&&T.includes("<anonymous>")&&(T=T.replace("<anonymous>",t.displayName)),T}while(1<=a&&0<=n);break}}}finally{Hl=!1,Error.prepareStackTrace=l}return(l=t?t.displayName||t.name:"")?pe(l):""}function Bl(t,e){switch(t.tag){case 26:case 27:case 5:return pe(t.type);case 16:return pe("Lazy");case 13:return t.child!==e&&e!==null?pe("Suspense Fallback"):pe("Suspense");case 19:return pe("SuspenseList");case 0:case 15:return dl(t.type,!1);case 11:return dl(t.type.render,!1);case 1:return dl(t.type,!0);case 31:return pe("Activity");case 30:return pe("ViewTransition");default:return""}}function we(t){try{var e="",l=null;do e+=Bl(t,l),l=t,t=t.return;while(t);return e}catch(a){return`
|
||||
`);for(n=a=0;a<d.length&&!d[a].includes("DetermineComponentFrameRoot");)a++;for(;n<p.length&&!p[n].includes("DetermineComponentFrameRoot");)n++;if(a===d.length||n===p.length)for(a=d.length-1,n=p.length-1;1<=a&&0<=n&&d[a]!==p[n];)n--;for(;1<=a&&0<=n;a--,n--)if(d[a]!==p[n]){if(a!==1||n!==1)do if(a--,n--,0>n||d[a]!==p[n]){var x=`
|
||||
`+d[a].replace(" at new "," at ");return t.displayName&&x.includes("<anonymous>")&&(x=x.replace("<anonymous>",t.displayName)),x}while(1<=a&&0<=n);break}}}finally{Hl=!1,Error.prepareStackTrace=l}return(l=t?t.displayName||t.name:"")?Se(l):""}function Bl(t,e){switch(t.tag){case 26:case 27:case 5:return Se(t.type);case 16:return Se("Lazy");case 13:return t.child!==e&&e!==null?Se("Suspense Fallback"):Se("Suspense");case 19:return Se("SuspenseList");case 0:case 15:return dl(t.type,!1);case 11:return dl(t.type.render,!1);case 1:return dl(t.type,!0);case 31:return Se("Activity");case 30:return Se("ViewTransition");default:return""}}function Ye(t){try{var e="",l=null;do e+=Bl(t,l),l=t,t=t.return;while(t);return e}catch(a){return`
|
||||
Error generating stack: `+a.message+`
|
||||
`+a.stack}}var Vt=Object.prototype.hasOwnProperty,ll=i.unstable_scheduleCallback,ml=i.unstable_cancelCallback,ql=i.unstable_shouldYield,La=i.unstable_requestPaint,Wt=i.unstable_now,$l=i.unstable_getCurrentPriorityLevel,yn=i.unstable_ImmediatePriority,gn=i.unstable_UserBlockingPriority,Ke=i.unstable_NormalPriority,ka=i.unstable_LowPriority,ya=i.unstable_IdlePriority,fu=i.log,ru=i.unstable_setDisableYieldValue,Il=null,be=null;function hl(t){if(typeof fu=="function"&&ru(t),be&&typeof be.setStrictMode=="function")try{be.setStrictMode(Il,t)}catch{}}var xe=Math.clz32?Math.clz32:Z,H=Math.log,D=Math.LN2;function Z(t){return t>>>=0,t===0?32:31-(H(t)/D|0)|0}var F=256,Nt=262144,_l=4194304;function De(t){var e=t&42;if(e!==0)return e;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&-t;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function O(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,c=t.pingedLanes;t=t.warmLanes;var f=a&134217727;return f!==0?(a=f&~u,a!==0?n=De(a):(c&=f,c!==0?n=De(c):l||(l=f&~t,l!==0&&(n=De(l))))):(f=a&~u,f!==0?n=De(f):c!==0?n=De(c):l||(l=a&~t,l!==0&&(n=De(l)))),n===0?0:e!==0&&e!==n&&(e&u)===0&&(u=n&-n,l=e&-e,u>=l||u===32&&(l&4194048)!==0)?e:n}function Y(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function $(t,e){(e&8)!==0&&(e|=e&32);var l=t.entangledLanes;if(l!==0)for(t=t.entanglements,l&=e;0<l;){var a=31-xe(l),n=1<<a;e|=t[a],l&=~n}return e}function Ut(t,e){switch(t){case 1:case 2:case 4:case 8:case 64:return e+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Zt(){var t=_l;return _l<<=1,(_l&62914560)===0&&(_l=4194304),t}function je(t){for(var e=[],l=0;31>l;l++)e.push(t);return e}function Ue(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function ga(t,e,l,a,n,u){var c=t.pendingLanes;t.pendingLanes=l,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=l,t.entangledLanes&=l,t.errorRecoveryDisabledLanes&=l,t.shellSuspendCounter=0;var f=t.entanglements,d=t.expirationTimes,p=t.hiddenUpdates;for(l=c&~l;0<l;){var T=31-xe(l),A=1<<T;f[T]=0,d[T]=-1;var g=p[T];if(g!==null)for(p[T]=null,T=0;T<g.length;T++){var x=g[T];x!==null&&(x.lane&=-536870913)}l&=~A}a!==0&&Pl(t,a,0),u!==0&&n===0&&t.tag!==0&&(t.suspendedLanes|=u&~(c&~e))}function Pl(t,e,l){t.pendingLanes|=e,t.suspendedLanes&=~e;var a=31-xe(e);t.entangledLanes|=e,t.entanglements[a]=t.entanglements[a]|1073741824|l&261930}function ui(t,e){var l=t.entangledLanes|=e;for(t=t.entanglements;l;){var a=31-xe(l),n=1<<a;n&e|t[a]&e&&(t[a]|=e),l&=~n}}function ou(t,e){var l=e&-e;return l=(l&42)!==0?1:Ye(l),(l&(t.suspendedLanes|e))!==0?0:l}function Ye(t){switch(t){case 2:t=1;break;case 8:t=4;break;case 32:t=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:t=128;break;case 268435456:t=134217728;break;default:t=0}return t}function He(t){return t&=-t,2<t?8<t?(t&134217727)!==0?32:268435456:8:2}function ii(){var t=at.p;return t!==0?t:(t=window.event,t===void 0?32:ph(t.type))}function dr(t,e){var l=at.p;try{return at.p=t,e()}finally{at.p=l}}var ta=Math.random().toString(36).slice(2),Te="__reactFiber$"+ta,Je="__reactProps$"+ta,Sn="__reactContainer$"+ta,mr="__reactEvents$"+ta,Zh="__reactListeners$"+ta,Lh="__reactHandles$"+ta,hr="__reactResources$"+ta,du="__reactMarker$"+ta,ci="__reactLoad$"+ta;function si(t){delete t[Te],delete t[Je],delete t[Zh],delete t[Lh]}function Ka(t){var e;if(e=t[Te])return e;for(var l=t.parentNode;l;){if(e=l[Sn]||l[Te]){if(l=e.alternate,e.child!==null||l!==null&&l.child!==null)for(t=Pm(t);t!==null;){if(l=t[Te])return l;t=Pm(t)}return e}t=l,l=t.parentNode}return null}function pn(t){if(t=t[Te]||t[Sn]){var e=t.tag;if(e===5||e===6||e===13||e===31||e===26||e===27||e===3)return t}return null}function mu(t){var e=t.tag;if(e===5||e===26||e===27||e===6)return t.stateNode;throw Error(o(33))}function bn(t){var e=t[hr];return e||(e=t[hr]={hoistableStyles:new Map,hoistableScripts:new Map}),e}function me(t){t[du]=!0}function vr(t){t[ci]=void 0}var yr=new Set,gr={};function Ja(t,e){xn(t,e),xn(t+"Capture",e)}function xn(t,eLine truncated
|
||||
`).replace(R0,"")}function Dm(t,e){return e=Rm(e),Rm(t)===e}function Rt(t,e,l,a,n,u){switch(l){case"children":if(typeof a=="string")e==="body"||e==="textarea"&&a===""||Tn(t,a);else if(typeof a=="number"||typeof a=="bigint")e!=="body"&&Tn(t,""+a);else return;break;case"className":ri(t,"class",a);break;case"tabIndex":ri(t,"tabindex",a);break;case"dir":case"role":case"viewBox":case"width":case"height":ri(t,l,a);break;case"style":Cr(t,a,u);return;case"data":if(e!=="object"){ri(t,"data",a);break}case"src":case"href":if(a===""&&(e!=="a"||l!=="href")){t.removeAttribute(l);break}if(a==null||typeof a=="function"||typeof a=="symbol"||typeof a=="boolean"){t.removeAttribute(l);break}a=oi(a),t.setAttribute(l,a);break;case"action":case"formAction":if(typeof a=="function"){t.setAttribute(l,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(l==="formAction"?(e!=="input"&&Rt(t,e,"name",n.name,n,null),Rt(t,e,"formEncType",n.formEncType,n,null),Rt(t,e,"formMethod",n.formMethod,n,null),Rt(t,e,"formTarget",n.formTarget,n,null)):(Rt(t,e,"encType",n.encType,n,null),Rt(t,e,"method",n.method,n,null),Rt(t,e,"target",n.target,n,null)));if(a==null||typeof a=="symbol"||typeof a=="boolean"){t.removeAttribute(l);break}a=oi(a),t.setAttribute(l,a);break;case"onClick":a!=null&&(t.onclick=wl);return;case"onScroll":a!=null&&St("scroll",t);return;case"onScrollEnd":a!=null&&St("scrollend",t);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(o(61));if(l=a.__html,l!=null){if(n.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(t.innerHTML=l)}}break;case"multiple":t.multiple=a&&typeof a!="function"&&typeof a!="symbol";break;case"muted":t.muted=a&&typeof a!="function"&&typeof a!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(a==null||typeof a=="function"||typeof a=="boolean"||typeof a=="symbol"){t.removeAttribute("xlink:href");break}l=oi(a),t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",l);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":a!=null&&typeof a!="function"&&typeof a!="symbol"?t.setAttribute(l,a):t.removeAttribute(l);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":a&&typeof a!="function"&&typeof a!="symbol"?t.setAttribute(l,""):t.removeAttribute(l);break;case"capture":case"download":a===!0?t.setAttribute(l,""):a!==!1&&a!=null&&typeof a!="function"&&typeof a!="symbol"?t.setAttribute(l,a):t.removeAttribute(l);break;case"cols":case"rows":case"size":case"span":a!=null&&typeof a!="function"&&typeof a!="symbol"&&!isNaN(a)&&1<=a?t.setAttribute(l,a):t.removeAttribute(l);break;case"rowSpan":case"start":a==null||typeof a=="function"||typeof a=="symbol"||isNaN(a)?t.removeAttribute(l):t.setAttribute(l,a);break;case"popover":St("beforetoggle",t),St("toggle",t),fi(t,"popover",a);break;case"xlinkActuate":ea(t,"http://www.w3.org/1999/xlink","xlink:actuate",a);break;case"xlinkArcrole":ea(t,"http://www.w3.org/1999/xlink","xlink:arcrole",a);break;case"xlinkRole":ea(t,"http://www.w3.org/1999/xlink","xlink:role",a);break;case"xlinkShow":ea(t,"http://www.w3.org/1999/xlink","xlink:show",a);break;case"xlinkTitle":ea(t,"http://www.w3.org/1999/xlink","xlink:title",a);break;case"xlinkType":ea(t,"http://www.w3.org/1999/xlink","xlink:type",a);break;case"xmlBase":ea(t,"http://www.w3.org/XML/1998/namespace","xml:base",a);break;case"xmlLang":ea(t,"http://www.w3.org/XML/1998/namespace","xml:lang",a);break;case"xmlSpace":ea(t,"http://www.w3.org/XML/1998/namespace","xml:space",a);break;case"is":fi(t,"is",a);break;case"innerText":case"textContent":return;default:if(!(2<l.length)||l[0]!=="o"&&l[0]!=="O"||l[1]!=="n"&&l[1]!=="N")l=$h.get(l)||l,fi(t,l,a);else return}_t=!0}function Rf(t,e,l,a,n,u){switch(l){case"style":Cr(t,a,u);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(o(61));if(l=a.__html,l!=null){if(n.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(t.innerHTML=l)}}break;case"children":if(typeof a=="string")Tn(t,a);else if(typeof a=="number"||typeof a=="bigint")Tn(t,""+a);else return;break;case"onScroll":a!=null&&St("scroll",t);return;case"onScrollEnd":a!=null&&St("scroLine truncated
|
||||
`;Ut&&(je+=Ut+`
|
||||
`),Zt&&(je+=(Array.isArray(Zt)?Zt.join(`
|
||||
`+a.stack}}var Vt=Object.prototype.hasOwnProperty,ll=c.unstable_scheduleCallback,ml=c.unstable_cancelCallback,ql=c.unstable_shouldYield,Za=c.unstable_requestPaint,Wt=c.unstable_now,Wl=c.unstable_getCurrentPriorityLevel,vn=c.unstable_ImmediatePriority,yn=c.unstable_UserBlockingPriority,Ke=c.unstable_NormalPriority,La=c.unstable_LowPriority,va=c.unstable_IdlePriority,fu=c.log,ru=c.unstable_setDisableYieldValue,$l=null,pe=null;function hl(t){if(typeof fu=="function"&&ru(t),pe&&typeof pe.setStrictMode=="function")try{pe.setStrictMode($l,t)}catch{}}var be=Math.clz32?Math.clz32:Z,H=Math.log,R=Math.LN2;function Z(t){return t>>>=0,t===0?32:31-(H(t)/R|0)|0}var F=256,Nt=262144,_l=4194304;function De(t){var e=t&42;if(e!==0)return e;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&-t;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function M(t,e,l){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,i=t.pingedLanes;t=t.warmLanes;var f=a&134217727;return f!==0?(a=f&~u,a!==0?n=De(a):(i&=f,i!==0?n=De(i):l||(l=f&~t,l!==0&&(n=De(l))))):(f=a&~u,f!==0?n=De(f):i!==0?n=De(i):l||(l=a&~t,l!==0&&(n=De(l)))),n===0?0:e!==0&&e!==n&&(e&u)===0&&(u=n&-n,l=e&-e,u>=l||u===32&&(l&4194048)!==0)?e:n}function Y(t,e){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&e)===0}function $(t,e){(e&8)!==0&&(e|=e&32);var l=t.entangledLanes;if(l!==0)for(t=t.entanglements,l&=e;0<l;){var a=31-be(l),n=1<<a;e|=t[a],l&=~n}return e}function Bt(t,e){switch(t){case 1:case 2:case 4:case 8:case 64:return e+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Zt(){var t=_l;return _l<<=1,(_l&62914560)===0&&(_l=4194304),t}function Te(t){for(var e=[],l=0;31>l;l++)e.push(t);return e}function Ue(t,e){t.pendingLanes|=e,e!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function ya(t,e,l,a,n,u){var i=t.pendingLanes;t.pendingLanes=l,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=l,t.entangledLanes&=l,t.errorRecoveryDisabledLanes&=l,t.shellSuspendCounter=0;var f=t.entanglements,d=t.expirationTimes,p=t.hiddenUpdates;for(l=i&~l;0<l;){var x=31-be(l),A=1<<x;f[x]=0,d[x]=-1;var g=p[x];if(g!==null)for(p[x]=null,x=0;x<g.length;x++){var j=g[x];j!==null&&(j.lane&=-536870913)}l&=~A}a!==0&&Il(t,a,0),u!==0&&n===0&&t.tag!==0&&(t.suspendedLanes|=u&~(i&~e))}function Il(t,e,l){t.pendingLanes|=e,t.suspendedLanes&=~e;var a=31-be(e);t.entangledLanes|=e,t.entanglements[a]=t.entanglements[a]|1073741824|l&261930}function uc(t,e){var l=t.entangledLanes|=e;for(t=t.entanglements;l;){var a=31-be(l),n=1<<a;n&e|t[a]&e&&(t[a]|=e),l&=~n}}function ou(t,e){var l=e&-e;return l=(l&42)!==0?1:we(l),(l&(t.suspendedLanes|e))!==0?0:l}function we(t){switch(t){case 2:t=1;break;case 8:t=4;break;case 32:t=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:t=128;break;case 268435456:t=134217728;break;default:t=0}return t}function He(t){return t&=-t,2<t?8<t?(t&134217727)!==0?32:268435456:8:2}function cc(){var t=nt.p;return t!==0?t:(t=window.event,t===void 0?32:ph(t.type))}function dr(t,e){var l=nt.p;try{return nt.p=t,e()}finally{nt.p=l}}var Pl=Math.random().toString(36).slice(2),je="__reactFiber$"+Pl,Je="__reactProps$"+Pl,gn="__reactContainer$"+Pl,mr="__reactEvents$"+Pl,Xh="__reactListeners$"+Pl,Vh="__reactHandles$"+Pl,hr="__reactResources$"+Pl,du="__reactMarker$"+Pl,ic="__reactLoad$"+Pl;function sc(t){delete t[je],delete t[Je],delete t[Xh],delete t[Vh]}function ka(t){var e;if(e=t[je])return e;for(var l=t.parentNode;l;){if(e=l[gn]||l[je]){if(l=e.alternate,e.child!==null||l!==null&&l.child!==null)for(t=Pm(t);t!==null;){if(l=t[je])return l;t=Pm(t)}return e}t=l,l=t.parentNode}return null}function Sn(t){if(t=t[je]||t[gn]){var e=t.tag;if(e===5||e===6||e===13||e===31||e===26||e===27||e===3)return t}return null}function mu(t){var e=t.tag;if(e===5||e===26||e===27||e===6)return t.stateNode;throw Error(o(33))}function pn(t){var e=t[hr];return e||(e=t[hr]={hoistableStyles:new Map,hoistableScripts:new Map}),e}function de(t){t[du]=!0}function vr(t){t[ic]=void 0}var yr=new Set,gr={};function Ka(t,e){bn(t,e),bn(t+"Capture",e)}function bn(t,eLine truncated
|
||||
`).replace(M0,"")}function Dm(t,e){return e=Rm(e),Rm(t)===e}function Dt(t,e,l,a,n,u){switch(l){case"children":if(typeof a=="string")e==="body"||e==="textarea"&&a===""||jn(t,a);else if(typeof a=="number"||typeof a=="bigint")e!=="body"&&jn(t,""+a);else return;break;case"className":rc(t,"class",a);break;case"tabIndex":rc(t,"tabindex",a);break;case"dir":case"role":case"viewBox":case"width":case"height":rc(t,l,a);break;case"style":Cr(t,a,u);return;case"data":if(e!=="object"){rc(t,"data",a);break}case"src":case"href":if(a===""&&(e!=="a"||l!=="href")){t.removeAttribute(l);break}if(a==null||typeof a=="function"||typeof a=="symbol"||typeof a=="boolean"){t.removeAttribute(l);break}a=oc(a),t.setAttribute(l,a);break;case"action":case"formAction":if(typeof a=="function"){t.setAttribute(l,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(l==="formAction"?(e!=="input"&&Dt(t,e,"name",n.name,n,null),Dt(t,e,"formEncType",n.formEncType,n,null),Dt(t,e,"formMethod",n.formMethod,n,null),Dt(t,e,"formTarget",n.formTarget,n,null)):(Dt(t,e,"encType",n.encType,n,null),Dt(t,e,"method",n.method,n,null),Dt(t,e,"target",n.target,n,null)));if(a==null||typeof a=="symbol"||typeof a=="boolean"){t.removeAttribute(l);break}a=oc(a),t.setAttribute(l,a);break;case"onClick":a!=null&&(t.onclick=Yl);return;case"onScroll":a!=null&&pt("scroll",t);return;case"onScrollEnd":a!=null&&pt("scrollend",t);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(o(61));if(l=a.__html,l!=null){if(n.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(t.innerHTML=l)}}break;case"multiple":t.multiple=a&&typeof a!="function"&&typeof a!="symbol";break;case"muted":t.muted=a&&typeof a!="function"&&typeof a!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(a==null||typeof a=="function"||typeof a=="boolean"||typeof a=="symbol"){t.removeAttribute("xlink:href");break}l=oc(a),t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",l);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":a!=null&&typeof a!="function"&&typeof a!="symbol"?t.setAttribute(l,a):t.removeAttribute(l);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"credentialless":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":a&&typeof a!="function"&&typeof a!="symbol"?t.setAttribute(l,""):t.removeAttribute(l);break;case"capture":case"download":a===!0?t.setAttribute(l,""):a!==!1&&a!=null&&typeof a!="function"&&typeof a!="symbol"?t.setAttribute(l,a):t.removeAttribute(l);break;case"cols":case"rows":case"size":case"span":a!=null&&typeof a!="function"&&typeof a!="symbol"&&!isNaN(a)&&1<=a?t.setAttribute(l,a):t.removeAttribute(l);break;case"rowSpan":case"start":a==null||typeof a=="function"||typeof a=="symbol"||isNaN(a)?t.removeAttribute(l):t.setAttribute(l,a);break;case"popover":pt("beforetoggle",t),pt("toggle",t),fc(t,"popover",a);break;case"xlinkActuate":ta(t,"http://www.w3.org/1999/xlink","xlink:actuate",a);break;case"xlinkArcrole":ta(t,"http://www.w3.org/1999/xlink","xlink:arcrole",a);break;case"xlinkRole":ta(t,"http://www.w3.org/1999/xlink","xlink:role",a);break;case"xlinkShow":ta(t,"http://www.w3.org/1999/xlink","xlink:show",a);break;case"xlinkTitle":ta(t,"http://www.w3.org/1999/xlink","xlink:title",a);break;case"xlinkType":ta(t,"http://www.w3.org/1999/xlink","xlink:type",a);break;case"xmlBase":ta(t,"http://www.w3.org/XML/1998/namespace","xml:base",a);break;case"xmlLang":ta(t,"http://www.w3.org/XML/1998/namespace","xml:lang",a);break;case"xmlSpace":ta(t,"http://www.w3.org/XML/1998/namespace","xml:space",a);break;case"is":fc(t,"is",a);break;case"innerText":case"textContent":return;default:if(!(2<l.length)||l[0]!=="o"&&l[0]!=="O"||l[1]!=="n"&&l[1]!=="N")l=Fh.get(l)||l,fc(t,l,a);else return}_t=!0}function Rf(t,e,l,a,n,u){switch(l){case"style":Cr(t,a,u);return;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(o(61));if(l=a.__html,l!=null){if(n.children!=null)throw Error(o(60));(u!=null?u.__html:void 0)!==l&&(t.innerHTML=l)}}break;case"children":if(typeof a=="string")jn(t,a);else if(typeof a=="number"||typeof a=="bigint")jn(t,""+a);else return;break;case"onScroll":a!=null&&pt("scroll",t);return;case"onScrollEnd":a!=null&&pt("scroLine truncated
|
||||
`;Bt&&(Te+=Bt+`
|
||||
`),Zt&&(Te+=(Array.isArray(Zt)?Zt.join(`
|
||||
`):String(Zt))+`
|
||||
`),je+=JSON.stringify($,null,2).slice(0,4e3),Ul(je),Se("已返回登录信息,见下方")}catch($){Se("发起失败:"+$.message)}},[]),Nt=y.useCallback(async()=>{const O=K.trim();if(!O){ut("请填要查配额的用户 id");return}try{const Y=await lt(P.adminQuotaUser(O));ut("用户 "+O.slice(0,8)+":本月用量 "+sr(Y.used_usd_micros)+" / 配额 "+sr(Y.quota_usd_micros)+(Y.remaining_usd_micros!==null&&Y.remaining_usd_micros!==void 0?"(剩余 "+sr(Y.remaining_usd_micros)+")":"")+" | 月份 "+(Y.month||""))}catch(Y){ut(cr(Y))}},[K]),_l=y.useCallback(async()=>{if(window.confirm("确定手动触发 sweep 吗?超阈值的陈旧 running 任务会被标为 interrupted。"))try{const Y=(await lt(P.adminSweep,"POST",{})).swept||[];ut("sweep 完成,清理 "+Y.length+" 个任务"+(Y.length?":"+Y.join("、"):""))}catch(O){ut(cr(O))}},[]),De=y.useCallback(async()=>{try{const O=await lt(P.adminBackup,"POST",{});ut("备份完成:backend="+O.backend+" | 路径 "+O.path+" | 大小 "+O.size_bytes+" 字节 | 任务 "+O.task_count+" 行")}catch(O){ut(cr(O))}},[]);return{keySaved:i,keyState:m,quotaText:_,healthText:N,adminGate:B,adminBody:G,adminResult:V,adminUserId:K,setAdminUserId:tt,projects:it,projectId:Xt,setProjectId:ge,projectMsg:Oe,githubRepos:fe,workers:ht,workersSummary:Pt,workersError:re,members:tl,memberMsg:w,memberError:et,skills:vt,apps:ze,mcpServers:v,skillMsg:W,skillError:yt,mcpMsg:xt,mcpOauthMsg:at,mcpOauthBox:Za,envs:Le,envCount:At,envMsg:Wl,envRepoLine:va,envRepoBar:el,envRepoMsg:le,envSelect:ol,setEnvSelect:pe,models:Hl,modelCustomVisible:Bl,refreshHealth:ml,loadQuota:ql,probeAdmin:La,refreshProjects:Wt,loadGithubRepos:$l,loadRelayModels:yn,refreshWorkers:gn,refreshEnvs:Ke,refreshMembers:ka,refreshSkills:ya,saveKeyInput:fu,clearKeyInput:ru,createProject:Il,createEnv:be,archiveEnv:hl,saveEnvRepo:xe,inviteMember:H,changeMemberRole:D,reloadMcp:Z,mcpOauth:F,adminQuota:Nt,adminSweep:_l,adminBackup:De}}function Fy(){const[i,r]=y.useState([]),[m,o]=y.useState(""),[_,M]=y.useState(""),[N,E]=y.useState(""),[B,z]=y.useState(""),G=y.useCallback(async(K,tt)=>{const it=K!==void 0?K:tt;if(!it){r([]);return}try{const jt=await lt(P.tasks(it));r(jt.tasks||[]),o("")}catch(jt){o("加载失败:"+jt.message)}},[]),j=y.useMemo(()=>{const K=B.trim().toLowerCase();return i.filter(tt=>!(_&&tt.status!==_||N&&(tt.executor||"")!==N||K&&!((tt.id||"")+" "+(tt.prompt||"")).toLowerCase().includes(K)))},[i,_,N,B]),V=j.length+" 个任务(共 "+i.length+" 个)",ut=y.useCallback(async(K,tt)=>{const it={...K};tt.length&&(it.upload_id=await Ly(tt));const jt=await lt(P.tasksCreate,"POST",it);return"任务已建:"+de(jt.id)},[]);return{tasks:i,taskError:m,statusFilter:_,setStatusFilter:M,executorFilter:N,setExecutorFilter:E,searchText:B,setSearchText:z,filteredTasks:j,taskCountText:V,refreshTasks:G,dispatch:ut}}function Wy(i,r){const[m,o]=y.useState(null),[_,M]=y.useState(""),[N,E]=y.useState(""),[B,z]=y.useState(""),[G,j]=y.useState(""),[V,ut]=y.useState(!1),[K,tt]=y.useState(""),[it,jt]=y.useState([]),[Xt,ge]=y.useState([]),[Oe,Jt]=y.useState(""),[fe,st]=y.useState([]),[ht,Ft]=y.useState(""),[Pt,kt]=y.useState(""),[re,Dt]=y.useState([]),[tl,U]=y.useState(""),[w,k]=y.useState(""),[et,Tt]=y.useState(""),[vt,te]=y.useState(""),[ze,ne]=y.useState([]),[v,R]=y.useState([]),[W,J]=y.useState(""),[yt,dt]=y.useState([]),[xt,Q]=y.useState(""),[at,Se]=y.useState(""),[Za,Ul]=y.useState(""),[Le,Yt]=y.useState(""),[At,Re]=y.useState([]),[Wl,ee]=y.useState(""),[va,El]=y.useState(null),el=y.useRef(null),ke=y.useRef(null),le=y.useRef(null);le.current=m;const qe=y.useCallback(()=>{if(el.current){try{el.current.abort()}catch{}el.current=null}ke.current&&(clearTimeout(ke.current),ke.current=null)},[]),ol=y.useCallback(async H=>{try{const D=await lt(P.taskAgents(H));ge(D.agents||[]),Jt(D.note||"")}catch(D){ge([]),Jt("子代理链路加载失败:"+D.message)}},[]),pe=y.useCallback(H=>{ke.current&&clearTimeout(ke.current),ke.current=setTimeout(()=>void ol(H),1e3)},[ol]),Hl=y.useCallback(async H=>{if(!H.coordinator_parts){jt([]);return}try{const D=await lt(P.tasksByParent(H.project_id||"",H.id));jt(D.tasks||[])}catch{jt([])}},[]),dl=y.useCallback(async H=>{try{const D=await lt(P.taskFollowups(H));ne(D.followups||[])}catch{ne([])}},[]),Bl=y.useCallback(async H=>{try{const D=await lt(P.taskChatHistory(H));El(D)}catch{El(null)}},[]),we=y.useCallback(async H=>{var Z;const D=H||((Z=le.current)==null?void 0:Z.id);if(D)try{const F=await lt(P.taskReviews(D));st(F.reviews||[]),kt("")}catch(F){kt("评审队列加载失败:"+F.message)}},[]),Vt=y.useCallback(async H=>{var Z;const D=H||((Z=le.current)==null?void 0:Z.id);if(D)try{const F=await lt(P.taskApprovals(D));R(F.approvals||[])}catch(F){J("审批队列加载失败:"+F.message)}},[]),ll=y.useCallback(async H=>{try{const D=await lt(P.taskMessages(H));dt(D.messages||[])}catch{dt([])}},[]),ml=y.useCallback(async H=>{try{const D=await lt(P.taskThread(H)),Z=D.thread||D;let F=Z.turns;F==null&Line truncated
|
||||
`),Te+=JSON.stringify($,null,2).slice(0,4e3),Ul(Te),ge("已返回登录信息,见下方")}catch($){ge("发起失败:"+$.message)}},[]),Nt=y.useCallback(async()=>{const M=st.trim();if(!M){at("请填要查配额的用户 id");return}try{const Y=await lt(P.adminQuotaUser(M));at("用户 "+M.slice(0,8)+":本月用量 "+sr(Y.used_usd_micros)+" / 配额 "+sr(Y.quota_usd_micros)+(Y.remaining_usd_micros!==null&&Y.remaining_usd_micros!==void 0?"(剩余 "+sr(Y.remaining_usd_micros)+")":"")+" | 月份 "+(Y.month||""))}catch(Y){at(ir(Y))}},[st]),_l=y.useCallback(async()=>{if(window.confirm("确定手动触发 sweep 吗?超阈值的陈旧 running 任务会被标为 interrupted。"))try{const Y=(await lt(P.adminSweep,"POST",{})).swept||[];at("sweep 完成,清理 "+Y.length+" 个任务"+(Y.length?":"+Y.join("、"):""))}catch(M){at(ir(M))}},[]),De=y.useCallback(async()=>{try{const M=await lt(P.adminBackup,"POST",{});at("备份完成:backend="+M.backend+" | 路径 "+M.path+" | 大小 "+M.size_bytes+" 字节 | 任务 "+M.task_count+" 行")}catch(M){at(ir(M))}},[]);return{keySaved:c,keyState:m,quotaText:_,healthText:N,adminGate:X,adminBody:G,adminResult:w,adminUserId:st,setAdminUserId:et,projects:k,projectId:Ut,setProjectId:ye,projectMsg:Me,githubRepos:fe,workers:vt,workersSummary:Pt,workersError:re,members:tl,memberMsg:q,memberError:tt,skills:yt,apps:ze,mcpServers:v,skillMsg:W,skillError:gt,mcpMsg:jt,mcpOauthMsg:nt,mcpOauthBox:Va,envs:Le,envCount:Ot,envMsg:Fl,envRepoLine:ha,envRepoBar:el,envRepoMsg:le,envSelect:ol,setEnvSelect:Se,models:Hl,modelCustomVisible:Bl,refreshHealth:ml,loadQuota:ql,probeAdmin:Za,refreshProjects:Wt,loadGithubRepos:Wl,loadRelayModels:vn,refreshWorkers:yn,refreshEnvs:Ke,refreshMembers:La,refreshSkills:va,saveKeyInput:fu,clearKeyInput:ru,createProject:$l,createEnv:pe,archiveEnv:hl,saveEnvRepo:be,inviteMember:H,changeMemberRole:R,reloadMcp:Z,mcpOauth:F,adminQuota:Nt,adminSweep:_l,adminBackup:De}}function ky(){const[c,r]=y.useState([]),[m,o]=y.useState(""),[_,O]=y.useState(""),[N,E]=y.useState(""),[X,D]=y.useState(""),G=y.useCallback(async(st,et)=>{const k=st!==void 0?st:et;if(!k){r([]);return}try{const dt=await lt(P.tasks(k));r(dt.tasks||[]),o("")}catch(dt){o("加载失败:"+dt.message)}},[]),b=y.useMemo(()=>{const st=X.trim().toLowerCase();return c.filter(et=>!(_&&et.status!==_||N&&(et.executor||"")!==N||st&&!((et.id||"")+" "+(et.prompt||"")).toLowerCase().includes(st)))},[c,_,N,X]),w=b.length+" 个任务(共 "+c.length+" 个)",at=y.useCallback(async(st,et)=>{const k={...st};et.length&&(k.upload_id=await Vy(et));const dt=await lt(P.tasksCreate,"POST",k);return"任务已建:"+Oe(dt.id)},[]);return{tasks:c,taskError:m,statusFilter:_,setStatusFilter:O,executorFilter:N,setExecutorFilter:E,searchText:X,setSearchText:D,filteredTasks:b,taskCountText:w,refreshTasks:G,dispatch:at}}function Ky(c,r){const[m,o]=y.useState(null),[_,O]=y.useState(""),[N,E]=y.useState(""),[X,D]=y.useState(""),[G,b]=y.useState(""),[w,at]=y.useState(!1),[st,et]=y.useState(""),[k,dt]=y.useState([]),[Ut,ye]=y.useState([]),[Me,Jt]=y.useState(""),[fe,it]=y.useState([]),[vt,Ft]=y.useState(""),[Pt,kt]=y.useState(""),[re,Ht]=y.useState([]),[tl,U]=y.useState(""),[q,K]=y.useState(""),[tt,xt]=y.useState(""),[yt,te]=y.useState(""),[ze,ne]=y.useState([]),[v,z]=y.useState([]),[W,J]=y.useState(""),[gt,mt]=y.useState([]),[jt,Q]=y.useState(""),[nt,ge]=y.useState(""),[Va,Ul]=y.useState(""),[Le,Gt]=y.useState(""),[Ot,Re]=y.useState([]),[Fl,ee]=y.useState(""),[ha,El]=y.useState(null),el=y.useRef(null),ke=y.useRef(null),le=y.useRef(null);le.current=m;const qe=y.useCallback(()=>{if(el.current){try{el.current.abort()}catch{}el.current=null}ke.current&&(clearTimeout(ke.current),ke.current=null)},[]),ol=y.useCallback(async H=>{try{const R=await lt(P.taskAgents(H));ye(R.agents||[]),Jt(R.note||"")}catch(R){ye([]),Jt("子代理链路加载失败:"+R.message)}},[]),Se=y.useCallback(H=>{ke.current&&clearTimeout(ke.current),ke.current=setTimeout(()=>void ol(H),1e3)},[ol]),Hl=y.useCallback(async H=>{if(!H.coordinator_parts){dt([]);return}try{const R=await lt(P.tasksByParent(H.project_id||"",H.id));dt(R.tasks||[])}catch{dt([])}},[]),dl=y.useCallback(async H=>{try{const R=await lt(P.taskFollowups(H));ne(R.followups||[])}catch{ne([])}},[]),Bl=y.useCallback(async H=>{try{const R=await lt(P.taskChatHistory(H));El(R)}catch{El(null)}},[]),Ye=y.useCallback(async H=>{var Z;const R=H||((Z=le.current)==null?void 0:Z.id);if(R)try{const F=await lt(P.taskReviews(R));it(F.reviews||[]),kt("")}catch(F){kt("评审队列加载失败:"+F.message)}},[]),Vt=y.useCallback(async H=>{var Z;const R=H||((Z=le.current)==null?void 0:Z.id);if(R)try{const F=await lt(P.taskApprovals(R));z(F.approvals||[])}catch(F){J("审批队列加载失败:"+F.message)}},[]),ll=y.useCallback(async H=>{try{const R=await lt(P.taskMessages(H));mt(R.messages||[])}catch{mt([])}},[]),ml=y.useCallback(async H=>{try{const R=await lt(P.taskThread(H)),Z=R.thread||R;let F=Z.turns;F==nLine truncated
|
||||
|
||||
`);Ue=Pl.pop()||"";for(const ui of Pl){const ou=ui.split(`
|
||||
`).filter(Ye=>Ye.indexOf("data: ")===0).map(Ye=>Ye.slice(6)).join(`
|
||||
`);if(ou)try{const Ye=JSON.parse(ou);if(Ye.type==="snapshot")F=Ye.entries||[],Object.keys(Nt).forEach(He=>delete Nt[He]),F.forEach((He,ii)=>{He.id&&(Nt[He.id]=ii)}),_l=Ye.note||"",Dt([...F]),U(_l),pe(H);else if(Ye.type==="entry"){const He=Ye.entry;He.id&&He.id in Nt?F[Nt[He.id]]=He:(He.id&&(Nt[He.id]=F.length),F.push(He)),Dt([...F]),pe(H)}else Ye.type==="done"&&(De=!0,O=Ye.status,k(O))}catch{}}if(De)break}}catch(Y){if(Y&&Y.name==="AbortError")return;U("链路流中断:"+Y.message);return}De&&r()},[qe,pe,r]),$l=y.useCallback(async H=>{qe();try{const D=await lt(P.task(H));o(D);let Z="";D.result_text&&(Z+=`=== result ===
|
||||
`+D.result_text.slice(0,8e3)+`
|
||||
`),D.error_text&&(Z+=`=== error ===
|
||||
`+D.error_text.slice(0,8e3)+`
|
||||
`),Z||(Z="(暂无 result/error 输出)"),M(Z),j(""),ut(!1),tt(""),Q(""),Yt(""),La(D.status);const F=i(D.project_id),Nt=F==="maintainer"||F==="owner",_l=F==="contributor"||Nt,De=cu.includes(D.status),O=[];["failed","interrupted","merge-failed"].includes(D.status)&&Nt||O.push("重试:不可用——仅 failed/interrupted/merge-failed 可重试"+(Nt?"":",且仅 maintainer 可重试")),!De&&_l||O.push("取消:不可用——"+(De?"终态任务不可取消":"仅项目成员(contributor 及以上)可取消")),D.status==="completed"&&Nt||O.push("合并:不可用——仅 completed 可合并"+(Nt?"":",且仅 maintainer 可合并")),D.status==="merged"&&Nt||O.push("提 PR:不可用——仅 merged 可提 PR"+(Nt?"":",且仅 maintainer 可提 PR")),z(O.join(";")),E(""),Wt(H,D.status),ol(H),Hl(D),Bl(H),dl(H),ll(H),ml(H),ql(H),we(H),Vt(H)}catch(D){o(null),M("加载失败:"+D.message)}},[qe,Wt,ol,Hl,Bl,dl,ll,ml,ql,we,Vt,i]),yn=y.useCallback(async()=>{const H=le.current;if(H){try{const D=await lt(P.task(H.id));o(D);let Z="";D.result_text&&(Z+=`=== result ===
|
||||
`+D.result_text.slice(0,8e3)+`
|
||||
`),D.error_text&&(Z+=`=== error ===
|
||||
`+D.error_text.slice(0,8e3)+`
|
||||
`),M(Z||"(暂无 result/error 输出)")}catch{}dl(H.id),Bl(H.id),we(H.id),Vt(H.id),Hl(H),ol(H.id),ll(H.id),ml(H.id),ql(H.id)}},[dl,Bl,we,Vt,Hl,ol,ll,ml,ql]),gn=y.useCallback(async H=>{const D=le.current;if(!D)return;const Z={cancel:"确定取消该任务吗?",merge:"确定把 completed 任务标为 merged 吗?",pr:"确定为该任务提 PR 吗?(会在仓库真实建 PR)"};if(!(Z[H]&&!window.confirm(Z[H])))try{const F=await lt(P.taskAction(D.id,H),"POST",{});E(H+" 已提交:"+JSON.stringify(F).slice(0,300)),r(),await $l(D.id)}catch(F){E(H+" 失败:"+F.message)}},[$l,r]),Ke=y.useCallback(async()=>{const H=le.current;if(H)try{const D=await lt(P.taskCost(H.id));j(JSON.stringify(D,null,2).slice(0,4e3))}catch(D){j("查成本失败:"+D.message)}},[]),ka=y.useCallback(async H=>{const D=le.current;if(D){if(!H.trim()){tt("分支消息必填");return}if(!cu.includes(D.status)){tt("仅终态任务可分支");return}try{const Z=await lt(P.taskFork(D.id),"POST",{message:H.trim()});tt("分支任务已建:"+Z.id.slice(0,8)),r()}catch(Z){tt("分支失败:"+Z.message)}}},[r]),ya=y.useCallback(async H=>{const D=le.current;if(D)try{await lt(P.taskReviews(D.id),"POST",H),Ft("评审已登记(requested)"),await we(D.id)}catch(Z){Ft("登记评审需求失败:"+Z.message)}},[we]),fu=y.useCallback(H=>{const D=le.current;if(!D)return;const Z=window.prompt("输入该条评审的 findings(将写回记录并标为 completed):");Z!==null&<(P.taskReviewFindings(D.id,H),"POST",{findings:Z}).then(()=>void we(D.id)).catch(F=>Ft("写 findings 失败:"+F.message))},[we]),ru=y.useCallback((H,D)=>{const Z=le.current;if(!Z)return;const F=D==="approved"?"approve":"deny";lt(P.taskApprovalDecision(Z.id,H,F),"POST",{}).then(()=>{J("已记录"+(D==="approved"?"允许":"拒绝")+"(当前版本只留回执,不拦截实时行为)"),Vt(Z.id)}).catch(Nt=>J("决定失败:"+Nt.message))},[Vt]),Il=y.useCallback(async(H,D,Z)=>{const F=le.current;if(F){if(!D.trim()){Q("目标任务 id 不能为空");return}if(!Z.trim()){Q("消息正文不能为空");return}try{const Nt=await lt(P.taskMessagesTo(D.trim()),"POST",{from_task_id:F.id,body:Z.trim(),mode:H});Q("已发送("+Nt.delivery+")"),await ll(F.id)}catch(Nt){Q("发送失败:"+Nt.message)}}},[ll]),be=y.useCallback((H,D)=>{const Z=le.current;if(!Z)return;if(!["completed","failed","interrupted"].includes(Z.status)){Yt("仅 completed/failed/interrupted 任务可操作线程(merged/merge-failed 不可改,服务端同样 409)");return}const F={};if(H==="rename"){if(!D.trim()){Yt("新线程名不能为空");return}F.name=D.trim()}lt(P.taskThreadAction(Z.id,H),"POST",F).then(Nt=>{Yt(H+" 已提交:"+JSON.stringify(Nt).slice(0,300)),ml(Z.id),ql(Z.id)}).catch(Nt=>Yt(H+" 失败:"+Nt.message))},[ml,ql]),hl=y.useCallback(async H=>{const D=le.current;if(!D)return;const Z=H.trim();if(!Z){ee("消息不能为空");return}try{cu.includes(D.status)&&D.status!=="merged"?(await lt(P.taskContinue(D.id),"POST",{message:Z}),ee("已重新排队,同一会话继续"),r(),await $l(D.id)):["queued","running"].includes(D.status)?(await lt(P.taskFollowups(D.id),"POST",{body:Z,mode:"direct"}),ee("已直接发送"),await dl(D.id),await Bl(D.id)):ee("merged/merge-failed 任务不可继续,也不可发后续消息")}catch(F){ee("发送失败:"+F.message)}},[$l,r,dl,Bl]),xe=y.useCallback(async()=>{const H=le.current;if(!H){te("先选一个任务");return}try{const D=await lt(P.taskTrace(H.id)),Z=new Blob([JSON.stringify({task_id:H.id,status:D.status,note:D.note||"",count:(D.entries||[]).length,entries:D.entries||[]},null,2)],{type:"application/json"}),F=document.createElement("a");F.href=URL.createObjectURL(Z),F.download="trace-"+H.id.slice(0,8)+".json",document.body.appendChild(F),F.click(),F.remove(),setTimeout(()=>URL.revokeObjectURL(F.href),1e3),te("已下载完整链路 "+(D.entries||[]).length+" 条")}catch(D){te("下载失败:"+D.message)}},[]);return y.useEffect(()=>()=>qe(),[qe]),{currentTask:m,detailBody:_,actionMsg:N,actionReasons:B,costBox:G,forkVisible:V,setForkVisible:ut,forkMsg:K,coordChildren:it,agents:Xt,agentsNote:Oe,reviews:fe,reviewMsg:ht,reviewError:Pt,traceEntries:re,traceNote:tl,traceDone:w,traceKind:et,setTraceKind:Tt,traceMsg:vt,followups:ze,approvals:v,approvalMsg:W,peerMessages:yt,peerMsg:xt,threadText:at,threadGateNote:Za,threadMsg:Le,threadList:At,chatMsg:Wl,chatHistory:va,showDetail:$l,refreshDetailLists:yn,doAction:gn,taskCost:Ke,forkTask:ka,postReview:ya,submitFindings:fu,decideApproval:ru,postPeer:Il,threadAction:be,sendChatMessage:hl,downloadTrace:xe,refreshReviews:()=>void we(),refreshApprovals:()=>void Vt()}}function $y(i){const[r,m]=y.useState([]),[o,_]=y.useState(""),[M,N]=y.useState(null),[E,B]=y.useState(""),z=y.useCallback(async ut=>{const K=ut!==void 0?ut:i();if(!K){m([]);return}try{const tt=await lt(P.projectAutomations(K));m(tt.automations||[])}catch(tt){_("自动化加载失败:"+tt.message)}},[i]),G=y.useCallback(async(ut,K,tt,iLine truncated
|
||||
<style rel="stylesheet" crossorigin>:root{--text:#1d2129;--muted:#667085;--line:#e4e7ec;--line-strong:#d0d5dd;--paper:#ffffff;--card:#ffffff;--bubble-assistant:#f2f2f2;--bubble-user:#bfe0ff;--accent:#3b82f6;--accent-dark:#2563eb;--accent-soft:#eef4ff;--green:#22c55e;--success:#16a34a;--danger:#b42318;--danger-soft:#fef3f2;--amber:#b54708;--purple:#6941c6;--radius:12px;--radius-sm:10px;--shadow:none;--sans:-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;--mono:"IBM Plex Mono",Menlo,Consolas,monospace;--ctl:40px}*{box-sizing:border-box}html,body,#root{height:100%}body{font-family:var(--sans);margin:0;color:var(--text);background:#fff;line-height:1.6;font-size:14px}a{color:var(--accent);text-underline-offset:3px}:focus-visible{outline:3px solid var(--accent);outline-offset:2px}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}.muted{color:var(--muted);font-size:13px;line-height:1.6}.err{color:var(--danger)}.ok{color:var(--success)}button{cursor:pointer;font-weight:600;border-radius:999px}button:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.primary:hover{background:var(--accent-dark)}button.seal{background:var(--accent);border-color:var(--accent);color:#fff}button.seal:hover{background:var(--accent-dark)}button.danger{color:var(--danger);border-color:#fecdca;background:var(--danger-soft)}button.danger:hover{background:#fee4e2}.icon-btn{width:32px;height:32px;padding:0;display:grid;place-items:center;border:1px solid var(--line);border-radius:50%;background:#fff;color:var(--text);font-size:16px;line-height:1}.icon-btn:hover{background:#f9fafb}.muse-app{display:grid;grid-template-columns:56px 260px minmax(0,1fr) 300px;height:100vh;background:#fff}.muse-app.no-right{grid-template-columns:56px 260px minmax(0,1fr)}.icon-rail{border-right:1px solid var(--line);display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 0;overflow-y:auto}.icon-rail button{width:40px;height:40px;border:0;border-radius:12px;background:transparent;display:grid;place-items:center;color:var(--text);padding:0;flex:none}.icon-rail button:hover{background:#f2f2f2}.icon-rail button.active{background:var(--accent-soft);color:var(--accent)}.icon-rail svg{width:22px;height:22px}.list-col{border-right:1px solid var(--line);overflow-y:auto;padding:16px 12px;min-width:0}.search-box{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:999px;padding:8px 12px;background:#fff}.search-box svg{flex:none;color:var(--muted)}.search-box input{border:0;padding:0;flex:1;min-width:0;font-size:14px;background:transparent}.search-box input:focus{box-shadow:none;outline:none}.list-section-head{display:flex;align-items:center;justify-content:space-between;padding:16px 4px 8px;font-weight:600;font-size:14px}.list-section-head button{width:28px;height:28px;padding:0;display:grid;place-items:center;border-radius:50%}.muse-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.muse-item{padding:10px 12px;border-radius:12px;cursor:pointer;overflow:hidden}.muse-item:hover{background:#f9fafb}.muse-item.selected{background:#f2f2f2}.muse-item-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px}.muse-item-sub{display:flex;gap:6px;align-items:center;color:var(--muted);font-size:12px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.task-dot{width:8px;height:8px;border-radius:50%;background:currentColor;flex:none}.center-col{min-width:0;display:flex;flex-direction:column;overflow-y:auto;background:#fff}.center-topbar{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#fff;border-bottom:1px solid var(--line)}.center-inner{max-width:760px;margin:0 auto;width:100%;padding:24px 20px 16px;display:flex;flex-direction:column;gap:20px;flex:1}.right-col{border-left:1px solid var(--line);overflow-y:auto;padding:20px 16px;display:flex;flex-direction:column;gap:20px;min-width:0}.right-profile{text-align:center;position:relative}.right-profile .icon-btn{position:absolute;top:0;right:0}.right-avatar{width:72px;height:72px;border-radius:50%;background:var(--accent-soft);color:var(--accent);display:grid;place-items:center;font-size:28px;font-weight:700;margin:0 auto}.right-name{font-weight:700;font-size:17px;margin-top:10px}.right-status{color:var(--green);font-size:13px;font-weight:600}.right-status.off{color:var(--muted)}.right-icon-row{display:flex;gap:4px;justify-content:space-between;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:10px 4px}.right-icon-row button{width:36px;height:36px;border:0;border-radius:12px;background:transparent;display:grid;place-items:center;color:var(--text);padding:0}.right-icon-row button:hover{background:#f2f2f2}.right-icon-row button.active{background:var(--accent-sLine truncated
|
||||
`);Ue=Il.pop()||"";for(const uc of Il){const ou=uc.split(`
|
||||
`).filter(we=>we.indexOf("data: ")===0).map(we=>we.slice(6)).join(`
|
||||
`);if(ou)try{const we=JSON.parse(ou);if(we.type==="snapshot")F=we.entries||[],Object.keys(Nt).forEach(He=>delete Nt[He]),F.forEach((He,cc)=>{He.id&&(Nt[He.id]=cc)}),_l=we.note||"",Ht([...F]),U(_l),Se(H);else if(we.type==="entry"){const He=we.entry;He.id&&He.id in Nt?F[Nt[He.id]]=He:(He.id&&(Nt[He.id]=F.length),F.push(He)),Ht([...F]),Se(H)}else we.type==="done"&&(De=!0,M=we.status,K(M))}catch{}}if(De)break}}catch(Y){if(Y&&Y.name==="AbortError")return;U("链路流中断:"+Y.message);return}De&&r()},[qe,Se,r]),Wl=y.useCallback(async H=>{qe();try{const R=await lt(P.task(H));o(R);let Z="";R.result_text&&(Z+=`=== result ===
|
||||
`+R.result_text.slice(0,8e3)+`
|
||||
`),R.error_text&&(Z+=`=== error ===
|
||||
`+R.error_text.slice(0,8e3)+`
|
||||
`),Z||(Z="(暂无 result/error 输出)"),O(Z),b(""),at(!1),et(""),Q(""),Gt(""),Za(R.status);const F=c(R.project_id),Nt=F==="maintainer"||F==="owner",_l=F==="contributor"||Nt,De=iu.includes(R.status),M=[];["failed","interrupted","merge-failed"].includes(R.status)&&Nt||M.push("重试:不可用——仅 failed/interrupted/merge-failed 可重试"+(Nt?"":",且仅 maintainer 可重试")),!De&&_l||M.push("取消:不可用——"+(De?"终态任务不可取消":"仅项目成员(contributor 及以上)可取消")),R.status==="completed"&&Nt||M.push("合并:不可用——仅 completed 可合并"+(Nt?"":",且仅 maintainer 可合并")),R.status==="merged"&&Nt||M.push("提 PR:不可用——仅 merged 可提 PR"+(Nt?"":",且仅 maintainer 可提 PR")),D(M.join(";")),E(""),Wt(H,R.status),ol(H),Hl(R),Bl(H),dl(H),ll(H),ml(H),ql(H),Ye(H),Vt(H)}catch(R){o(null),O("加载失败:"+R.message)}},[qe,Wt,ol,Hl,Bl,dl,ll,ml,ql,Ye,Vt,c]),vn=y.useCallback(async()=>{const H=le.current;if(H){try{const R=await lt(P.task(H.id));o(R);let Z="";R.result_text&&(Z+=`=== result ===
|
||||
`+R.result_text.slice(0,8e3)+`
|
||||
`),R.error_text&&(Z+=`=== error ===
|
||||
`+R.error_text.slice(0,8e3)+`
|
||||
`),O(Z||"(暂无 result/error 输出)")}catch{}dl(H.id),Bl(H.id),Ye(H.id),Vt(H.id),Hl(H),ol(H.id),ll(H.id),ml(H.id),ql(H.id)}},[dl,Bl,Ye,Vt,Hl,ol,ll,ml,ql]),yn=y.useCallback(async H=>{const R=le.current;if(!R)return;const Z={cancel:"确定取消该任务吗?",merge:"确定把 completed 任务标为 merged 吗?",pr:"确定为该任务提 PR 吗?(会在仓库真实建 PR)"};if(!(Z[H]&&!window.confirm(Z[H])))try{const F=await lt(P.taskAction(R.id,H),"POST",{});E(H+" 已提交:"+JSON.stringify(F).slice(0,300)),r(),await Wl(R.id)}catch(F){E(H+" 失败:"+F.message)}},[Wl,r]),Ke=y.useCallback(async()=>{const H=le.current;if(H)try{const R=await lt(P.taskCost(H.id));b(JSON.stringify(R,null,2).slice(0,4e3))}catch(R){b("查成本失败:"+R.message)}},[]),La=y.useCallback(async H=>{const R=le.current;if(R){if(!H.trim()){et("分支消息必填");return}if(!iu.includes(R.status)){et("仅终态任务可分支");return}try{const Z=await lt(P.taskFork(R.id),"POST",{message:H.trim()});et("分支任务已建:"+Z.id.slice(0,8)),r()}catch(Z){et("分支失败:"+Z.message)}}},[r]),va=y.useCallback(async H=>{const R=le.current;if(R)try{await lt(P.taskReviews(R.id),"POST",H),Ft("评审已登记(requested)"),await Ye(R.id)}catch(Z){Ft("登记评审需求失败:"+Z.message)}},[Ye]),fu=y.useCallback(H=>{const R=le.current;if(!R)return;const Z=window.prompt("输入该条评审的 findings(将写回记录并标为 completed):");Z!==null&<(P.taskReviewFindings(R.id,H),"POST",{findings:Z}).then(()=>void Ye(R.id)).catch(F=>Ft("写 findings 失败:"+F.message))},[Ye]),ru=y.useCallback((H,R)=>{const Z=le.current;if(!Z)return;const F=R==="approved"?"approve":"deny";lt(P.taskApprovalDecision(Z.id,H,F),"POST",{}).then(()=>{J("已记录"+(R==="approved"?"允许":"拒绝")+"(当前版本只留回执,不拦截实时行为)"),Vt(Z.id)}).catch(Nt=>J("决定失败:"+Nt.message))},[Vt]),$l=y.useCallback(async(H,R,Z)=>{const F=le.current;if(F){if(!R.trim()){Q("目标任务 id 不能为空");return}if(!Z.trim()){Q("消息正文不能为空");return}try{const Nt=await lt(P.taskMessagesTo(R.trim()),"POST",{from_task_id:F.id,body:Z.trim(),mode:H});Q("已发送("+Nt.delivery+")"),await ll(F.id)}catch(Nt){Q("发送失败:"+Nt.message)}}},[ll]),pe=y.useCallback((H,R)=>{const Z=le.current;if(!Z)return;if(!["completed","failed","interrupted"].includes(Z.status)){Gt("仅 completed/failed/interrupted 任务可操作线程(merged/merge-failed 不可改,服务端同样 409)");return}const F={};if(H==="rename"){if(!R.trim()){Gt("新线程名不能为空");return}F.name=R.trim()}lt(P.taskThreadAction(Z.id,H),"POST",F).then(Nt=>{Gt(H+" 已提交:"+JSON.stringify(Nt).slice(0,300)),ml(Z.id),ql(Z.id)}).catch(Nt=>Gt(H+" 失败:"+Nt.message))},[ml,ql]),hl=y.useCallback(async H=>{const R=le.current;if(!R)return;const Z=H.trim();if(!Z){ee("消息不能为空");return}try{iu.includes(R.status)&&R.status!=="merged"?(await lt(P.taskContinue(R.id),"POST",{message:Z}),ee("已重新排队,同一会话继续"),r(),await Wl(R.id)):["queued","running"].includes(R.status)?(await lt(P.taskFollowups(R.id),"POST",{body:Z,mode:"direct"}),ee("已直接发送"),await dl(R.id),await Bl(R.id)):ee("merged/merge-failed 任务不可继续,也不可发后续消息")}catch(F){ee("发送失败:"+F.message)}},[Wl,r,dl,Bl]),be=y.useCallback(async()=>{const H=le.current;if(!H){te("先选一个任务");return}try{const R=await lt(P.taskTrace(H.id)),Z=new Blob([JSON.stringify({task_id:H.id,status:R.status,note:R.note||"",count:(R.entries||[]).length,entries:R.entries||[]},null,2)],{type:"application/json"}),F=document.createElement("a");F.href=URL.createObjectURL(Z),F.download="trace-"+H.id.slice(0,8)+".json",document.body.appendChild(F),F.click(),F.remove(),setTimeout(()=>URL.revokeObjectURL(F.href),1e3),te("已下载完整链路 "+(R.entries||[]).length+" 条")}catch(R){te("下载失败:"+R.message)}},[]);return y.useEffect(()=>()=>qe(),[qe]),{currentTask:m,detailBody:_,actionMsg:N,actionReasons:X,costBox:G,forkVisible:w,setForkVisible:at,forkMsg:st,coordChildren:k,agents:Ut,agentsNote:Me,reviews:fe,reviewMsg:vt,reviewError:Pt,traceEntries:re,traceNote:tl,traceDone:q,traceKind:tt,setTraceKind:xt,traceMsg:yt,followups:ze,approvals:v,approvalMsg:W,peerMessages:gt,peerMsg:jt,threadText:nt,threadGateNote:Va,threadMsg:Le,threadList:Ot,chatMsg:Fl,chatHistory:ha,showDetail:Wl,refreshDetailLists:vn,doAction:yn,taskCost:Ke,forkTask:La,postReview:va,submitFindings:fu,decideApproval:ru,postPeer:$l,threadAction:pe,sendChatMessage:hl,downloadTrace:be,refreshReviews:()=>void Ye(),refreshApprovals:()=>void Vt()}}function Jy(c){const[r,m]=y.useState([]),[o,_]=y.useState(""),[O,N]=y.useState(null),[E,X]=y.useState(""),D=y.useCallback(async at=>{const st=at!==void 0?at:c();if(!st){m([]);return}try{const et=await lt(P.projectAutomations(st));m(et.automations||[])}catch(et){_("自动化加载失败:"+et.message)}},[c]),G=y.useCallback(async(at,st,Line truncated
|
||||
<style rel="stylesheet" crossorigin>:root{--text:#1d2129;--muted:#667085;--line:#e4e7ec;--line-strong:#d0d5dd;--paper:#ffffff;--card:#ffffff;--bubble-assistant:#f2f2f2;--bubble-user:#bfe0ff;--accent:#3b82f6;--accent-dark:#2563eb;--accent-soft:#eef4ff;--green:#22c55e;--success:#16a34a;--danger:#b42318;--danger-soft:#fef3f2;--amber:#b54708;--purple:#6941c6;--radius:12px;--radius-sm:10px;--shadow:none;--sans:-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;--mono:"IBM Plex Mono",Menlo,Consolas,monospace;--ctl:40px}*{box-sizing:border-box}html,body,#root{height:100%}body{font-family:var(--sans);margin:0;color:var(--text);background:#fff;line-height:1.6;font-size:14px}a{color:var(--accent);text-underline-offset:3px}:focus-visible{outline:3px solid var(--accent);outline-offset:2px}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}.muted{color:var(--muted);font-size:13px;line-height:1.6}.err{color:var(--danger)}.ok{color:var(--success)}button{cursor:pointer;font-weight:600;border-radius:999px}button:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.primary:hover{background:var(--accent-dark)}button.seal{background:var(--accent);border-color:var(--accent);color:#fff}button.seal:hover{background:var(--accent-dark)}button.danger{color:var(--danger);border-color:#fecdca;background:var(--danger-soft)}button.danger:hover{background:#fee4e2}.icon-btn{width:32px;height:32px;padding:0;display:grid;place-items:center;border:1px solid var(--line);border-radius:50%;background:#fff;color:var(--text);font-size:16px;line-height:1}.icon-btn:hover{background:#f9fafb}.dash-topbar{position:sticky;top:0;z-index:10;background:#fff;border-bottom:1px solid var(--line);padding:10px 20px 8px}.dash-topbar-row{display:flex;gap:14px;align-items:center;flex-wrap:wrap}.dash-brand{font-weight:700;font-size:17px}.dash-status{font-size:13px;font-weight:600;color:var(--muted)}.dash-status.ok{color:var(--green)}.dash-stamp{margin-left:auto}.dash-nav{display:flex;gap:4px;flex-wrap:wrap;margin-top:8px}.dash-nav a{color:var(--text);text-decoration:none;font-size:13px;font-weight:600;padding:6px 12px;border-radius:999px}.dash-nav a:hover{background:#f2f2f2}.dash-page{max-width:1180px;margin:0 auto;padding:20px;display:flex;flex-direction:column;gap:20px}.dash-section{scroll-margin-top:130px;display:flex;flex-direction:column;gap:20px}.dash-section.card{padding:20px}.dash-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.dash-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;min-width:0}.dash-card-label{color:var(--muted);font-size:13px;font-weight:600}.dash-card-value{font-size:28px;font-weight:700;line-height:1.3;overflow-wrap:anywhere}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:none;padding:20px}.card h2{font-size:17px;margin:0 0 12px;font-weight:600}.card h3{font-size:15px;margin:24px 0 12px;padding-top:20px;border-top:1px solid var(--line);font-weight:600}.card h3:first-of-type{border-top:0;padding-top:0}.composer h2{font-size:20px}.composer textarea.prompt{min-height:148px;font-size:16px;padding:16px 18px;border-radius:12px}.composer textarea.coord{font-family:var(--mono);font-size:13px}.bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:12px 0}.bar>button,.bar>label{display:inline-flex;align-items:center;height:var(--ctl);min-height:var(--ctl);padding:0 16px;box-sizing:border-box;white-space:nowrap}.bar>input,.bar>select{height:var(--ctl);min-height:var(--ctl)}input,select,textarea,button{font:inherit;font-size:14px;padding:10px 13px;border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:#fff;color:var(--text)}input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #3b82f626}button:hover{box-shadow:none}select{-moz-appearance:none;appearance:none;-webkit-appearance:none;cursor:pointer;padding-right:34px;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' fill='none' stroke='%23667085' stroke-width='1.5' stroke-linecap='round'/></svg>");background-repeat:no-repeat;background-position:right 12px center}select::-ms-expand{display:none}select:disabled,input:disabled{color:var(--muted);background:#f9fafb;cursor:not-allowed}input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent)}input[type=file]{height:var(--ctl);display:inline-flex;align-items:center;padding:0 12px;border:1px dashed var(--line-strong);border-radius:999px;background:#fff}input[type=file]::file-selector-button{height:28px;padding:0 12px;margin-right:10px;border:0;border-radius:999px;background:#f2f2f2;color:var(--text);font:inherit;font-size:13px;cursor:pointer}textarea{width:100%;min-height:84px;resize:vertical;lineLine truncated
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
Reference in new issue
Block a user