chore: commit workspace updates

This commit is contained in:
ddCat
2026-09-14 01:11:56 +08:00
parent 01a2d171f5
commit 9727656b2b
491 changed files with 12826 additions and 72249 deletions

View File

@@ -9,11 +9,11 @@ import { MediaPreview } from "@/components/media-preview";
import { ListToolbar, PageHeader, PaginationBar, WorkspacePage } from "@/components/layout/workspace-page";
import { WorkspaceState } from "@/components/layout/workspace-state";
import { CONTENT_MODERATION_ERROR_CODE, generationErrorMessage, isContentModerationError } from "@/lib/generation-error";
import { formatTaskKind, isGenerationTaskSubmissionUncertain, operationOptions, statusLabel } from "@/lib/generation-task-display";
import { formatTaskKind, operationOptions, statusLabel } from "@/lib/generation-task-display";
import { buildVideoOperationPrompt } from "@/lib/prompts";
import { backendProviderConfig, logicalModelIDForConfig } from "@/services/api/generation-task";
import { createAgentSession, createGenerationTask, deleteGenerationTask, formatTaskLog, listGenerationTasks, listTaskLogs, queryFailedVideoProviderTask, queryGenerationTask, refreshGenerationTaskStatus, retryGenerationTask, type CreateTaskInput, type GenerationTask, type TaskLog } from "@/services/api/task-center";
import { createGenerationTask, formatTaskLog, listGenerationTasks, listTaskLogs, queryFailedVideoProviderTask, queryGenerationTask, retryGenerationTask, type CreateTaskInput, type GenerationTask, type TaskLog } from "@/services/api/task-center";
import { syncGenerationTaskToCanvasStore } from "@/lib/canvas/canvas-generation-task-sync";
import { useCanvasStore } from "@/stores/canvas/use-canvas-store";
import { resolveModelRequestConfig, useConfigStore, useEffectiveConfig } from "@/stores/use-config-store";
@@ -299,10 +299,6 @@ export default function TasksPage() {
const runAction = async (id: string) => {
const currentTask = tasksRef.current.find((task) => task.id === id);
if (currentTask && isGenerationTaskSubmissionUncertain(currentTask)) {
message.warning("提交结果尚未确认,不能自动重试;请先核对官方状态,避免重复生成。");
return;
}
setActingId(id);
try {
const next = await retryGenerationTask(id);
@@ -318,47 +314,6 @@ export default function TasksPage() {
}
};
const deleteLocalTask = (task: GenerationTask) => {
if (task.status === "queued" || task.status === "running") {
message.warning("任务正在执行,不能删除本机记录;请等待任务完成");
return;
}
modal.confirm({
title: "删除本机任务记录?",
content: "这只会删除本机任务记录,不会删除已生成的素材。",
okText: "删除本机记录",
okButtonProps: { danger: true },
cancelText: "保留",
onOk: async () => {
setActingId(task.id);
try {
await deleteGenerationTask(task.id);
setTasks((items) => items.filter((item) => item.id !== task.id));
if (detailTask?.id === task.id) setDetailTask(null);
message.success("本机任务记录已删除");
} catch (error) {
message.error(error instanceof Error ? error.message : "删除失败");
} finally {
setActingId("");
}
},
});
};
const refreshLocalTaskStatus = async (task: GenerationTask) => {
setActingId(task.id);
try {
const next = await refreshGenerationTaskStatus(task.id);
setTasks((items) => items.map((item) => (item.id === task.id ? { ...item, ...next } : item)));
setDetailTask((current) => (current?.id === task.id ? { ...current, ...next } : current));
message.success(next.officialStatus ? `官方返回状态:${next.officialStatus}` : "状态已更新");
} catch (error) {
message.error(error instanceof Error ? error.message : "更新状态失败");
} finally {
setActingId("");
}
};
const queryProviderTask = async (task: GenerationTask) => {
setActingId(task.id);
try {
@@ -387,16 +342,7 @@ export default function TasksPage() {
const values = await form.validateFields();
setCreating(true);
try {
if (values.operation === "agent_session") {
const textModel = values.model?.trim() || effectiveConfig.textModel || effectiveConfig.model;
if (!isAiConfigReady(effectiveConfig, textModel)) {
message.error("请先在设置里配置可用的文本模型、Base URL 和 API Key");
return;
}
const requestConfig = resolveModelRequestConfig(effectiveConfig, textModel);
const detail = await createAgentSession({ projectId: values.projectId, prompt: values.prompt, config: backendProviderConfig(requestConfig), ...(logicalModelIDForConfig(requestConfig) ? { logicalModelId: logicalModelIDForConfig(requestConfig) } : {}) });
setTasks((items) => [...detail.tasks, ...items]);
} else {
{
const videoModel = values.model?.trim() || effectiveConfig.videoModel || effectiveConfig.model;
if (values.operation !== "compare_versions" && !isAiConfigReady(effectiveConfig, videoModel)) {
message.error("请先在设置里配置可用的视频模型、Base URL 和 API Key");
@@ -507,7 +453,7 @@ export default function TasksPage() {
</div>
</WorkspacePage>
<Modal className="library-modal" title="新建异步生成任务" open={createOpen} onCancel={() => setCreateOpen(false)} onOk={submitTask} confirmLoading={creating} okText="创建任务">
<Form form={form} layout="vertical" initialValues={{ operation: "agent_session" }}>
<Form form={form} layout="vertical" initialValues={{ operation: "text_to_video" }}>
<Form.Item name="operation" label="任务类型" rules={[{ required: true, message: "请选择任务类型" }]}>
<Select options={operationOptions} />
</Form.Item>
@@ -538,18 +484,7 @@ export default function TasksPage() {
{detailTask.providerCancelStatus ? <InfoItem label="上游取消" value={providerCancelStatusLabel(detailTask)} /> : null}
{detailTask.providerCancelRequestedAt ? <InfoItem label="请求取消时间" value={formatDate(detailTask.providerCancelRequestedAt)} /> : null}
</div>
{detailTask.provider === "dreamina-cli" ? <p className="text-xs leading-5 text-foreground/60">官方状态采用最终一致轮询;转入后台后仍会继续等待并同步官方状态。官方即梦 CLI 当前不支持可靠的官方取消。</p> : null}
<div className="flex flex-wrap justify-end gap-2">
{detailTask.provider === "dreamina-cli" && detailTask.receiptRecorded && detailTask.status === "running" ? (
<Button aria-label="更新官方状态" icon={<RefreshCw className="size-4" />} loading={actingId === detailTask.id} onClick={() => void refreshLocalTaskStatus(detailTask)}>
更新官方状态
</Button>
) : null}
{detailTask.provider === "dreamina-cli" ? (
<Button danger aria-label="删除本机记录" icon={<Trash2 className="size-4" />} loading={actingId === detailTask.id} onClick={() => deleteLocalTask(detailTask)}>
删除本机记录
</Button>
) : null}
{canQueryProviderTask(detailTask) ? <Button icon={<RefreshCw className="size-4" />} loading={actingId === detailTask.id} onClick={() => void queryProviderTask(detailTask)}>手动查询任务</Button> : null}
{isTaskFailed(detailTask) ? <Button icon={<Bug className="size-4" />} onClick={() => navigate(`/settings?section=diagnostics&taskId=${encodeURIComponent(detailTask.id)}${detailTask.projectId ? `&projectId=${encodeURIComponent(detailTask.projectId)}` : ""}`)}>导出诊断包</Button> : null}
</div>

View File

@@ -82,7 +82,7 @@ export function formatModelName(config: AiConfig, task: GenerationTask) {
const model = raw.includes("::") ? raw.split("::").pop()?.trim() || raw : raw;
// 工作流名称是任务快照,不属于模型渠道,不能交给模型展示名解析器再次映射成“系统模型”。
if (task.provider === "runninghub" || task.provider === "comfyui-bridge") return raw || "工作流";
if (task.provider === "runninghub") return raw || "工作流";
if (!model) return "工作流";
if (model === "version-router") return "版本对比工作流";
if (model === "workflow-router") return "工作流路由";