feat: polish web master-agent controls and dispatch recovery

This commit is contained in:
kris
2026-04-01 07:50:20 +08:00
parent 87093677b8
commit e52932e8ef
8 changed files with 153 additions and 29 deletions

View File

@@ -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({
</div>
<ChatComposer
projectId={detail.project.id}
dispatchPlanRecoveryHint={dispatchPlanState.pendingDispatchPlan ? dispatchPlanState.recoveryHint : null}
initialPendingDispatchPlan={
pendingDispatchPlan
dispatchPlanState.pendingDispatchPlan
? {
planId: pendingDispatchPlan.planId,
summary: pendingDispatchPlan.summary,
targets: (pendingDispatchPlan.targets ?? []).map((target) => ({
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,
})),

View File

@@ -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}
/>
</AppShell>
);