From c978a25b7fbb250884a3503e90abc7f3be9757ac Mon Sep 17 00:00:00 2001 From: Administrator Date: Sat, 27 Jun 2026 15:12:28 +0800 Subject: [PATCH] Fix 3qfx task context fallback --- frontend-web/src/core/auth/task-deeplink.ts | 8 +++++++ frontend-web/src/pages/AgentChatPage.tsx | 24 +++++++++++++++---- .../task-components/TaskFxWorkspace.tsx | 7 +++++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/frontend-web/src/core/auth/task-deeplink.ts b/frontend-web/src/core/auth/task-deeplink.ts index 0ca46a84..673073d5 100644 --- a/frontend-web/src/core/auth/task-deeplink.ts +++ b/frontend-web/src/core/auth/task-deeplink.ts @@ -260,6 +260,14 @@ function buildOpeningText(detail: CopTaskDetail, taskId: string, action?: Action .join("\n"); } +/** + * 3qfx/rwfx 这类“按任务id 直接问答”的任务工作区,在 ``TaskContext`` 丢失但 + * ``login.copTaskDetail`` 仍存在时,可用它重新拼出开场词做前端自恢复。 + */ +export function buildTaskOpeningText(detail: CopTaskDetail, taskId: string): string { + return buildOpeningText(detail, taskId); +} + /** * 据 goPath + 任务详情解析跳转目标。 * - 多智能体会商:返回带 ``roundtablePrefill``(businessCode 让会商页自动选用配置的业务链条; diff --git a/frontend-web/src/pages/AgentChatPage.tsx b/frontend-web/src/pages/AgentChatPage.tsx index b5319a92..e5309bfe 100644 --- a/frontend-web/src/pages/AgentChatPage.tsx +++ b/frontend-web/src/pages/AgentChatPage.tsx @@ -53,6 +53,7 @@ import { env } from "@/env"; import { readTaskContext, taskThreadMetadata } from "@/core/auth/task-purpose"; import { TaskPurposePanel } from "@/strategy-components/components/task-components/TaskPurposePanel"; import { desensitize } from "@/lib/desensitize"; +import { buildTaskOpeningText, readCopTaskDetail } from "@/core/auth/task-deeplink"; /** 内置「模板数据转换器」agent 的稳定 id。仅此 agent 的对话页显示「页面模板 + 渲染预览」调试入口。 */ const TEMPLATE_BUILDER_AGENT_ID = "template-json-builder"; @@ -100,10 +101,25 @@ export default function AgentChatPage({ // 任务深链上下文(taskId + 开场信息):闸门(rwfx)与纯绑定(3qfx/xdfx)都要读取。 const taskCtxOn = !!(taskGate || taskBind); - const taskContext = useMemo( - () => (taskCtxOn ? readTaskContext() : null), - [taskCtxOn], - ); + const taskContext = useMemo(() => { + if (!taskCtxOn) return null; + const stored = readTaskContext(); + if (stored && stored.agentId === agent_id) return stored; + // 3qfx:若任务上下文偶发丢失,但登录深链留下的任务详情仍在,则用它前端兜底重建 + // taskId + openingText,避免 landing 既不自动开始、也没有“开始回答”按钮。 + if (taskBind && !taskGate) { + const detail = readCopTaskDetail(); + const fallbackTaskId = detail?.id == null ? "" : String(detail.id).trim(); + if (detail && fallbackTaskId && agent_id) { + return { + taskId: fallbackTaskId, + agentId: agent_id, + openingText: buildTaskOpeningText(detail, fallbackTaskId), + }; + } + } + return stored; + }, [agent_id, taskBind, taskCtxOn, taskGate]); const taskId = taskCtxOn && taskContext && taskContext.agentId === agent_id ? taskContext.taskId diff --git a/frontend-web/src/strategy-components/components/task-components/TaskFxWorkspace.tsx b/frontend-web/src/strategy-components/components/task-components/TaskFxWorkspace.tsx index bc2cd190..dfa1b7c2 100644 --- a/frontend-web/src/strategy-components/components/task-components/TaskFxWorkspace.tsx +++ b/frontend-web/src/strategy-components/components/task-components/TaskFxWorkspace.tsx @@ -60,7 +60,12 @@ function useChatsBase(taskBase: string): { const { agent_id } = useParams<{ agent_id: string }>(); const agentId = agent_id ?? ""; const ctx = readTaskContext(); - const taskId = ctx?.taskId ?? ""; + const detail = readCopTaskDetail(); + const fallbackTaskId = + detail?.id == null ? "" : String(detail.id).trim(); + // 3qfx 偶发会出现 task context 丢失,但任务详情仍在 sessionStorage 的情况。 + // 这里回退到任务详情里的 taskId,避免左侧对话列表直接失效成“空任务态”。 + const taskId = ctx?.taskId ?? fallbackTaskId; const actionId = ctx?.partitionByAction ? (ctx.actionId ?? "") : ""; return { taskId, agentId, actionId, chatsBase: `${taskBase}/agent/${agentId}/chats` }; }