+
+
aside]:!flex [&>aside]:!w-full [&>aside]:!border-l-0 [&>aside]:!bg-transparent",
+ specialAgentConfig && "position-roundtable-agent-detail--special",
+ )}
+ >
toast.info("请在中间对话区发起岗位会商")}
showRecentChats={false}
+ avatarSrc={specialAgentConfig ? agentConfigLogo : undefined}
+ positionName={specialAgentConfig ? positionName : undefined}
+ skillsIcon={
+ specialAgentConfig ? (
+
+ ) : undefined
+ }
+ skillsTitle={specialAgentConfig ? "技能列表" : undefined}
+ showCommonQuestions={specialAgentConfig}
/>
@@ -5271,6 +5754,15 @@ interface ResultItem {
artifactContent?: string | null;
}
+const ANALYSIS_RESULT_TAG_ICONS = [
+ analysisTag1,
+ analysisTag2,
+ analysisTag3,
+ analysisTag4,
+ analysisTag5,
+ analysisTag6,
+] as const;
+
function canOpenDeliverable(item: ResultItem): boolean {
return Boolean(
item.status === "done" &&
@@ -5525,6 +6017,8 @@ function AnalysisResults({
});
}
for (const node of nodes) {
+ // 意图理解节点只负责确认任务意图,不作为分析结果中的交付节点展示。
+ if (isIntentPositionNode(node)) continue;
const seat = seatsByAgentId.get(node.agentId);
const agentName = seat?.name ?? node.agentId;
const artifactCount = node.artifactManifest.length;
@@ -5666,7 +6160,11 @@ function AnalysisResults({
});
}
}
- return items.sort((left, right) => (right.updatedAt ?? "").localeCompare(left.updatedAt ?? ""));
+ // 任务理解智能体只负责确认意图,不会产生可交付的分析产物。
+ // 它仍可在流程详情中查看,但不应作为“分析结果”的成功项展示。
+ return items
+ .filter((item) => item.kind !== "intent")
+ .sort((left, right) => (right.updatedAt ?? "").localeCompare(left.updatedAt ?? ""));
}, [intentObjective, nodes, seatsByAgentId, session?.actionPlanSnapshot, session?.summarySnapshot]);
const positionOptions = useMemo(
() => [
@@ -5754,7 +6252,7 @@ function AnalysisResults({
if (resultItems.length === 0) {
return (
-
+
暂无交付产物
@@ -5766,16 +6264,9 @@ function AnalysisResults({
return (
-
-
-
-
交付产物列表
-
按岗位节点与生成时间展示
-
-
- {visibleItems.length}/{resultItems.length} 项结果
-
-
+
+ {/* 筛选控件暂时隐藏,保留逻辑供后续恢复。 */}
+ {/*
setPositionFilter(String(value))} />
setNodeFilter(String(value))} />
@@ -5784,7 +6275,6 @@ function AnalysisResults({
value={kindFilter}
options={[
{ label: "全部类型", value: "all" },
- { label: "意图理解", value: "intent" },
{ label: "节点交付", value: "delivery" },
{ label: "文件产物", value: "artifact" },
{ label: "方案总结", value: "summary" },
@@ -5793,8 +6283,9 @@ function AnalysisResults({
onChange={(value) => setKindFilter(String(value) as "all" | ResultKind)}
/>
+ */}
{onOpenBuiltinChat && nodes.length > 0 && (
-
+
@@ -5842,11 +6333,11 @@ function AnalysisResults({
)}
{visibleItems.length === 0 ? (
-
+
当前筛选条件下没有结果
) : (
- visibleItems.map((item) => {
+ visibleItems.map((item, index) => {
const displayedTime = item.updatedAt
? new Intl.DateTimeFormat("zh-CN", {
month: "2-digit",
@@ -5856,63 +6347,32 @@ function AnalysisResults({
hour12: false,
}).format(new Date(item.updatedAt))
: intentCompletedAt || "刚刚";
- const stale = item.node?.status === "stale";
- const invalidated = Boolean(item.node?.invalidatedBy);
- const status = item.status ? nodeStatusMeta(item.status) : null;
- const StatusIcon = status?.Icon;
+ const hasDeliveredArtifact = Boolean(item.artifactPath || item.artifactContent?.trim());
+ const displayedProductName =
+ hasDeliveredArtifact || (item.kind !== "delivery" && item.status === "done")
+ ? item.productName
+ : "未交付";
const contents = (
-
-
-
- {item.kind === "artifact" ? : }
-
-
-
-
{desensitize(item.agentName)}
- {status && StatusIcon && (
-
-
- {status.label}
-
- )}
- {(stale || invalidated) && (
-
- 上游已更新
-
- )}
-
-
- {desensitize(item.productName)}
-
-
- {desensitize(item.summary)}
-
-
+
+
+

+
{desensitize(item.agentName)}
-
+
+
{/* Chat list */}
-
- {interactiveMessages.map((msg) => (
-
- ))}
+
+ {showEmptyState ? (
+
{emptyState}
+ ) : (
+ interactiveMessages.map((msg) => (
+
+ ))
+ )}
{!step1AtBottom &&
}
@@ -453,6 +474,9 @@ export function Step1Panel(props: Step1PanelProps) {
)}
+
+ {rightSidebar}
+
);
}
diff --git a/frontend-web/src/roundtable-planning/hooks/useStep1Intent.ts b/frontend-web/src/roundtable-planning/hooks/useStep1Intent.ts
index e019d21a..700c4941 100644
--- a/frontend-web/src/roundtable-planning/hooks/useStep1Intent.ts
+++ b/frontend-web/src/roundtable-planning/hooks/useStep1Intent.ts
@@ -94,6 +94,8 @@ export interface UseStep1IntentOptions {
taskContext?: Record
| null;
/** Optional task-aware welcome bubble text before the first user turn. */
initialWelcomeText?: string;
+ /** Keep the dialogue visually empty while its intent thread is initialising. */
+ showInitialWelcome?: boolean;
/** 主页面统一的 toast 入口。 */
triggerToast: (msg: string) => void;
}
@@ -104,6 +106,7 @@ export interface UseStep1IntentReturn {
intentReady: IntentSummary | null;
intentInitError: string | null;
intentInitErrorDetail: IntentErrorDetail | null;
+ isIntentInitializing: boolean;
isIntentSending: boolean;
pendingIntentClarificationMsgId: number | null;
/** Per-question selections, keyed by `clarificationKey(msgId, clarId, index)`. */
@@ -172,13 +175,21 @@ function intentPhaseLabel(phase: IntentStreamPhase, toolName?: string): string {
}
export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentReturn {
- const { currentStep, selectedModel, taskContext, initialWelcomeText, triggerToast } = options;
+ const {
+ currentStep,
+ selectedModel,
+ taskContext,
+ initialWelcomeText,
+ showInitialWelcome = true,
+ triggerToast,
+ } = options;
const [intentThreadId, setIntentThreadId] = useState(null);
const [intentReady, setIntentReady] = useState(null);
const [intentInitError, setIntentInitError] = useState(null);
const [intentInitErrorDetail, setIntentInitErrorDetail] =
useState(null);
+ const [isIntentInitializing, setIsIntentInitializing] = useState(false);
const [isIntentSending, setIsIntentSending] = useState(false);
const [pendingIntentClarificationMsgId, setPendingIntentClarificationMsgId] =
useState(null);
@@ -230,18 +241,23 @@ export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentRe
setIntentInitError(null);
setIntentInitErrorDetail(null);
setIntentThreadId(null);
+ setIsIntentInitializing(true);
setPendingIntentClarificationMsgId(null);
setIntentClarificationSelections(new Map());
setTimelineEntries([]);
- setInteractiveMessages([
- {
- id: 1,
- sender: "agent",
- senderName: "任务理解智能体",
- content: initialWelcomeTextRef.current || INTENT_WELCOME_TEXT,
- time: nowTime(),
- },
- ]);
+ setInteractiveMessages(
+ showInitialWelcome
+ ? [
+ {
+ id: 1,
+ sender: "agent",
+ senderName: "任务理解智能体",
+ content: initialWelcomeTextRef.current || INTENT_WELCOME_TEXT,
+ time: nowTime(),
+ },
+ ]
+ : [],
+ );
(async () => {
try {
// initIntent 当前不在 thread 上落盘 model,只为占位与兼容;空时由后端
@@ -252,6 +268,7 @@ export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentRe
);
if (step1InitGenRef.current !== myGen) return;
setIntentThreadId(res.thread_id);
+ setIsIntentInitializing(false);
setTimelineEntries([
{
id: 1,
@@ -262,6 +279,7 @@ export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentRe
]);
} catch (err) {
if (step1InitGenRef.current !== myGen) return;
+ setIsIntentInitializing(false);
console.error("init intent failed:", err);
if (err instanceof IntentInitError) {
setIntentInitError(err.detail?.message || err.message);
@@ -272,13 +290,14 @@ export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentRe
}
}
})();
- }, []);
+ }, [showInitialWelcome]);
const resetIntent = useCallback(() => {
stopIntentStream();
step1InitRef.current = false;
step1InitGenRef.current += 1;
setIntentThreadId(null);
+ setIsIntentInitializing(false);
setIntentReady(null);
setIntentInitError(null);
setIntentInitErrorDetail(null);
@@ -654,6 +673,7 @@ export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentRe
// 或继续显示旧会话的澄清选择。
stopIntentStream();
setIsIntentSending(false);
+ setIsIntentInitializing(false);
setPendingIntentClarificationMsgId(null);
setIntentClarificationSelections(new Map());
setIntentThreadId(snapshot.intentThreadId);
@@ -690,6 +710,7 @@ export function useStep1Intent(options: UseStep1IntentOptions): UseStep1IntentRe
intentReady,
intentInitError,
intentInitErrorDetail,
+ isIntentInitializing,
isIntentSending,
pendingIntentClarificationMsgId,
intentClarificationSelections,
diff --git a/frontend-web/src/styles/globals.css b/frontend-web/src/styles/globals.css
index d4e9e639..a130b10a 100644
--- a/frontend-web/src/styles/globals.css
+++ b/frontend-web/src/styles/globals.css
@@ -746,7 +746,7 @@
/* 岗位会商左侧总面板:仅收窄滚动条宽度,沿用全局既有的滑块颜色、圆角和轨道样式。 */
.position-roundtable-sidebar-scrollbar::-webkit-scrollbar {
- width: 8px;
+ width: 5px;
}
.workspace-shell {