diff --git a/src/app/conversations/[projectId]/page.tsx b/src/app/conversations/[projectId]/page.tsx index 335cc45..2befbcd 100644 --- a/src/app/conversations/[projectId]/page.tsx +++ b/src/app/conversations/[projectId]/page.tsx @@ -13,7 +13,7 @@ import { } from "@/components/app-ui"; import { requirePageSession } from "@/lib/boss-auth"; import { listDispatchPlansByProject, readState } from "@/lib/boss-data"; -import { latestPendingDispatchPlan, latestRejectedDispatchPlan } from "@/lib/dispatch-plan-ui"; +import { resolveDispatchPlanComposerState } from "@/lib/dispatch-plan-ui"; import { formatTimestampLabel, getProjectDetailView } from "@/lib/boss-projections"; export const dynamic = "force-dynamic"; @@ -27,13 +27,9 @@ export default async function ProjectChatPage({ const { projectId } = await params; const state = await readState(); const detail = getProjectDetailView(state, projectId, session.account); - const pendingDispatchPlan = detail?.project.isGroup - ? latestPendingDispatchPlan(await listDispatchPlansByProject(projectId)) - : null; - const rejectedDispatchPlan = - detail?.project.isGroup && !pendingDispatchPlan - ? latestRejectedDispatchPlan(await listDispatchPlansByProject(projectId)) - : null; + const dispatchPlanState = detail?.project.isGroup + ? resolveDispatchPlanComposerState(await listDispatchPlansByProject(projectId)) + : resolveDispatchPlanComposerState([]); if (!detail) notFound(); @@ -169,12 +165,13 @@ export default async function ProjectChatPage({ ({ + planId: dispatchPlanState.pendingDispatchPlan.planId, + summary: dispatchPlanState.pendingDispatchPlan.summary, + targets: (dispatchPlanState.pendingDispatchPlan.targets ?? []).map((target) => ({ projectId: target.projectId, threadDisplayName: target.threadDisplayName, })), @@ -182,11 +179,11 @@ export default async function ProjectChatPage({ : null } initialRejectedDispatchPlan={ - rejectedDispatchPlan + dispatchPlanState.rejectedDispatchPlan ? { - planId: rejectedDispatchPlan.planId, - summary: rejectedDispatchPlan.summary, - targets: (rejectedDispatchPlan.targets ?? []).map((target) => ({ + planId: dispatchPlanState.rejectedDispatchPlan.planId, + summary: dispatchPlanState.rejectedDispatchPlan.summary, + targets: (dispatchPlanState.rejectedDispatchPlan.targets ?? []).map((target) => ({ projectId: target.projectId, threadDisplayName: target.threadDisplayName, })), diff --git a/src/app/me/master-agent/page.tsx b/src/app/me/master-agent/page.tsx index 14d89fc..44199ec 100644 --- a/src/app/me/master-agent/page.tsx +++ b/src/app/me/master-agent/page.tsx @@ -1,6 +1,7 @@ import { AppShell, PageNav, StatusBar } from "@/components/app-ui"; import { MasterAgentPromptMemoryClient } from "@/components/master-agent-prompt-memory-client"; import { requirePageSession } from "@/lib/boss-auth"; +import { MASTER_AGENT_CHAT_PAGE_ANCHORS } from "@/lib/master-agent-chat-menu"; import { getMasterAgentPromptPolicy, getProjectAgentControls, @@ -43,6 +44,7 @@ export default async function MasterAgentPromptMemoryPage() { projectControls={projectControls} globalMemories={globalMemories} projectMemories={projectMemories} + anchors={MASTER_AGENT_CHAT_PAGE_ANCHORS} /> ); diff --git a/src/components/app-ui.tsx b/src/components/app-ui.tsx index b089290..1a11456 100644 --- a/src/components/app-ui.tsx +++ b/src/components/app-ui.tsx @@ -867,10 +867,12 @@ export function ChatComposer({ projectId, initialPendingDispatchPlan, initialRejectedDispatchPlan, + dispatchPlanRecoveryHint, }: { projectId: string; initialPendingDispatchPlan?: PendingDispatchPlanState | null; initialRejectedDispatchPlan?: PendingDispatchPlanState | null; + dispatchPlanRecoveryHint?: string | null; }) { const router = useRouter(); const [value, setValue] = useState(""); @@ -1128,6 +1130,11 @@ export function ChatComposer({ {message} ) : null} + {dispatchPlanRecoveryHint ? ( +
+ {dispatchPlanRecoveryHint} +
+ ) : null} {pendingDispatchPlan ? (
等待你确认主 Agent 推荐
@@ -1167,7 +1174,10 @@ export function ChatComposer({
上次推荐已拒绝
{summarizeDispatchPlan(rejectedDispatchPlan)}
-
如果还想继续当前协作,可以直接重新生成推荐,不用把整条需求重新打一遍。
+
+ {dispatchPlanRecoveryHint ?? + "如果还想继续当前协作,可以直接重新生成新的推荐,不用把整条需求重新打一遍。"} +
diff --git a/src/components/master-agent-prompt-memory-client.tsx b/src/components/master-agent-prompt-memory-client.tsx index bfeae9c..07a8b46 100644 --- a/src/components/master-agent-prompt-memory-client.tsx +++ b/src/components/master-agent-prompt-memory-client.tsx @@ -11,6 +11,7 @@ import type { ProjectAgentControls, UserMasterPrompt, } from "@/lib/boss-data"; +import type { MasterAgentChatPageAnchors } from "@/lib/master-agent-chat-menu"; import { formatTimestampLabel } from "@/lib/boss-projections"; type MemoryDraft = { @@ -146,6 +147,7 @@ export function MasterAgentPromptMemoryClient({ projectControls, globalMemories, projectMemories, + anchors, }: { isAdmin: boolean; promptPolicy: MasterAgentPromptPolicy | null; @@ -153,6 +155,7 @@ export function MasterAgentPromptMemoryClient({ projectControls: ProjectAgentControls | null; globalMemories: MasterAgentMemory[]; projectMemories: MasterAgentMemory[]; + anchors: MasterAgentChatPageAnchors; }) { const router = useRouter(); const [busyKey, setBusyKey] = useState(null); @@ -326,7 +329,7 @@ export function MasterAgentPromptMemoryClient({ return (
-
+
主 Agent 提示词
管理员全局主提示词不可被覆盖;用户提示词和当前对话提示词只会追加在后面。 @@ -400,7 +403,7 @@ export function MasterAgentPromptMemoryClient({
-