@tutti-os/agent-gui 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-conversation/index.js +3 -3
- package/dist/agent-message-center/index.js +5 -3
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/agent-rich-text-at-provider.d.ts +1 -15
- package/dist/agent-rich-text-at-provider.js +1 -1
- package/dist/app/renderer/agentactivity.css +25 -0
- package/dist/{chunk-ZEFETOTS.js → chunk-72YSPOHX.js} +84 -87
- package/dist/chunk-72YSPOHX.js.map +1 -0
- package/dist/{chunk-77HBKGHF.js → chunk-KCC3GNPB.js} +1 -1
- package/dist/chunk-KCC3GNPB.js.map +1 -0
- package/dist/{chunk-ITMKZRCT.js → chunk-PKCJR6GC.js} +3 -3
- package/dist/chunk-PKCJR6GC.js.map +1 -0
- package/dist/{chunk-QTZALZIV.js → chunk-PONEQEJ5.js} +5 -29
- package/dist/{chunk-QTZALZIV.js.map → chunk-PONEQEJ5.js.map} +1 -1
- package/dist/{chunk-B7K776UD.js → chunk-Y3AQGWJA.js} +9 -1
- package/dist/chunk-Y3AQGWJA.js.map +1 -0
- package/dist/{chunk-CGBRAWTD.js → chunk-Y5O7BVGU.js} +3 -3
- package/dist/i18n/index.d.ts +8 -0
- package/dist/i18n/index.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1141 -923
- package/dist/index.js.map +1 -1
- package/dist/workspace-agent-generated-files.js +2 -2
- package/package.json +10 -10
- package/dist/chunk-77HBKGHF.js.map +0 -1
- package/dist/chunk-B7K776UD.js.map +0 -1
- package/dist/chunk-ITMKZRCT.js.map +0 -1
- package/dist/chunk-ZEFETOTS.js.map +0 -1
- /package/dist/{chunk-CGBRAWTD.js.map → chunk-Y5O7BVGU.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../agent-message-center/WorkspaceAgentMessageCenterPanel.tsx","../../shared/AgentVerticalScrollArea.tsx","../../agent-message-center/workspaceAgentMessageCenterModel.ts","../../agent-message-center/workspaceAgentMessageCenterDigest.ts","../../agent-message-center/WorkspaceAgentMessageCenterAttentionDeck.tsx","../../agent-message-center/WorkspaceAgentMessageCenterCard.tsx","../../agent-message-center/WorkspaceAgentMessageCenterViewControls.tsx","../../agent-message-center/workspaceAgentMessageCenterViewModel.ts"],"sourcesContent":["import {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type JSX\n} from \"react\";\nimport {\n Button,\n cn,\n Drawer,\n DrawerContent,\n TooltipProvider\n} from \"@tutti-os/ui-system\";\nimport type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport {\n AgentGuiI18nProvider,\n useTranslation,\n type AgentGuiI18nLocale\n} from \"../i18n/index\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isInteractiveMessageCenterItem,\n selectMessageCenterAttentionDeckItems,\n type WorkspaceAgentMessageCenterItem,\n type WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\nimport { WorkspaceAgentMessageCenterAttentionDeck } from \"./WorkspaceAgentMessageCenterAttentionDeck\";\nimport { MessageCenterViewMenu } from \"./WorkspaceAgentMessageCenterViewControls\";\nimport {\n MessageCenterIdentityAvatarMark,\n MessageCenterIdentityLabel,\n resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport {\n buildMessageCenterProviderOptions,\n buildMessageCenterStatusOptions,\n groupMessageCenterItems,\n itemMatchesViewFilters,\n partitionMessageCenterItemsByAgentUser,\n statusFilterSummary,\n type MessageCenterGroupBy,\n type MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport {\n buildWorkspaceAgentInteractivePromptLabels,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nexport type { WorkspaceAgentMessageCenterCardProps } from \"./WorkspaceAgentMessageCenterCard\";\n\nconst MESSAGE_CENTER_TOOLTIP_DELAY_MS = 300;\n\nexport interface WorkspaceAgentMessageCenterPanelProps {\n i18n?: I18nRuntime<string> | null;\n locale?: AgentGuiI18nLocale;\n open: boolean;\n model: WorkspaceAgentMessageCenterModel;\n highlightedItemId?: string | null;\n portalContainer?: HTMLElement | null;\n onClose: () => void;\n onHighlightedItemSettled?: (itemId: string) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onNotificationActioned?: (input: {\n action: string;\n provider: string;\n }) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (input: {\n action?: string;\n agentSessionId: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n promptKind?: string;\n requestId: string;\n }) => Promise<void> | void;\n}\n\nexport const WorkspaceAgentMessageCenterPanel = memo(\n function WorkspaceAgentMessageCenterPanel({\n open,\n i18n,\n locale,\n model,\n highlightedItemId = null,\n portalContainer = null,\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n onSubmitPrompt\n }: WorkspaceAgentMessageCenterPanelProps): JSX.Element | null {\n \"use memo\";\n return (\n <AgentGuiI18nProvider runtime={i18n} locale={locale}>\n <WorkspaceAgentMessageCenterPanelContent\n open={open}\n model={model}\n highlightedItemId={highlightedItemId}\n portalContainer={portalContainer}\n onClose={onClose}\n onHighlightedItemSettled={onHighlightedItemSettled}\n onLinkAction={onLinkAction}\n onNotificationActioned={onNotificationActioned}\n onOpenChat={onOpenChat}\n onSubmitPrompt={onSubmitPrompt}\n />\n </AgentGuiI18nProvider>\n );\n }\n);\n\nfunction WorkspaceAgentMessageCenterPanelContent({\n open,\n model,\n highlightedItemId = null,\n portalContainer = null,\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n onSubmitPrompt\n}: Omit<\n WorkspaceAgentMessageCenterPanelProps,\n \"i18n\" | \"locale\"\n>): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const [groupBy, setGroupBy] = useState<MessageCenterGroupBy>(\"priority\");\n const [statusFilters, setStatusFilters] =\n useState<Set<MessageCenterStatusFilter> | null>(null);\n const [providerFilters, setProviderFilters] = useState<Set<string> | null>(\n null\n );\n const [expandedStackIds, setExpandedStackIds] = useState<Set<string>>(\n () => new Set()\n );\n const [submittingPromptKey, setSubmittingPromptKey] = useState<string | null>(\n null\n );\n const itemNodesRef = useRef<Map<string, HTMLElement>>(new Map());\n const lastScrolledHighlightedItemIdRef = useRef<string | null>(null);\n const lastFilterResetHighlightedItemIdRef = useRef<string | null>(null);\n const statusOptions = useMemo(\n () => buildMessageCenterStatusOptions(model.counts, t),\n [model.counts, t]\n );\n const providerOptions = useMemo(\n () => buildMessageCenterProviderOptions(model.items),\n [model.items]\n );\n const visibleItems = useMemo(\n () =>\n model.items.filter((item) =>\n itemMatchesViewFilters({\n item,\n providerFilters,\n statusFilters\n })\n ),\n [model.items, providerFilters, statusFilters]\n );\n const deckItems = useMemo(\n () => selectMessageCenterAttentionDeckItems(visibleItems),\n [visibleItems]\n );\n const listItems = useMemo(\n () => visibleItems.filter((item) => !isInteractiveMessageCenterItem(item)),\n [visibleItems]\n );\n const itemGroups = useMemo(\n () => groupMessageCenterItems(listItems, groupBy, t),\n [groupBy, t, listItems]\n );\n const highlightedItem = useMemo(\n () =>\n highlightedItemId\n ? (model.items.find((item) => item.id === highlightedItemId) ?? null)\n : null,\n [highlightedItemId, model.items]\n );\n const activeStatusSummary = statusFilterSummary(statusFilters, statusOptions);\n const hasActiveFilters = statusFilters !== null || providerFilters !== null;\n const headerSummary = useMemo(() => {\n if (hasActiveFilters) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryFiltered\", {\n count: visibleItems.length,\n total: model.counts.all\n });\n }\n if (model.counts.waiting > 0) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryWaiting\", {\n count: model.counts.all,\n waiting: model.counts.waiting\n });\n }\n if (model.counts.completed > 0) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryCompleted\", {\n count: model.counts.all,\n completed: model.counts.completed\n });\n }\n return t(\"agentHost.workspaceAgentMessageCenterSummaryCount\", {\n count: model.counts.all\n });\n }, [\n hasActiveFilters,\n model.counts.all,\n model.counts.completed,\n model.counts.waiting,\n t,\n visibleItems.length\n ]);\n\n const submitPrompt = useCallback(\n async (\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }\n ) => {\n const promptKey = `${item.agentSessionId}:${input.requestId}`;\n setSubmittingPromptKey(promptKey);\n try {\n const notificationAction = resolveMessageCenterNotificationAction(\n item,\n input\n );\n if (notificationAction) {\n onNotificationActioned?.({\n action: notificationAction,\n provider: item.provider\n });\n }\n await onSubmitPrompt({\n ...input,\n agentSessionId: item.agentSessionId,\n promptKind: item.pendingPrompt?.kind\n });\n } finally {\n setSubmittingPromptKey((current) =>\n current === promptKey ? null : current\n );\n }\n },\n [onNotificationActioned, onSubmitPrompt]\n );\n const setItemNode = useCallback(\n (itemId: string, node: HTMLElement | null) => {\n if (node) {\n itemNodesRef.current.set(itemId, node);\n } else {\n itemNodesRef.current.delete(itemId);\n }\n },\n []\n );\n const toggleStatusFilter = useCallback(\n (status: MessageCenterStatusFilter) => {\n setStatusFilters((current) => {\n const next = new Set(\n current ?? statusOptions.map((option) => option.value)\n );\n if (next.has(status)) {\n next.delete(status);\n } else {\n next.add(status);\n }\n return next.size === statusOptions.length ? null : next;\n });\n },\n [statusOptions]\n );\n const toggleProviderFilter = useCallback(\n (provider: string) => {\n setProviderFilters((current) => {\n const next = new Set(\n current ?? providerOptions.map((option) => option.value)\n );\n if (next.has(provider)) {\n next.delete(provider);\n } else {\n next.add(provider);\n }\n return next.size === providerOptions.length ? null : next;\n });\n },\n [providerOptions]\n );\n const clearFilters = useCallback(() => {\n setStatusFilters(null);\n setProviderFilters(null);\n }, []);\n const expandStack = useCallback((groupId: string) => {\n setExpandedStackIds((current) => {\n if (current.has(groupId)) {\n return current;\n }\n const next = new Set(current);\n next.add(groupId);\n return next;\n });\n }, []);\n const collapseStack = useCallback((groupId: string) => {\n setExpandedStackIds((current) => {\n if (!current.has(groupId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(groupId);\n return next;\n });\n }, []);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItem) {\n return;\n }\n if (lastFilterResetHighlightedItemIdRef.current === highlightedItem.id) {\n return;\n }\n if (\n itemMatchesViewFilters({\n item: highlightedItem,\n providerFilters,\n statusFilters\n })\n ) {\n return;\n }\n lastFilterResetHighlightedItemIdRef.current = highlightedItem.id;\n setStatusFilters(null);\n setProviderFilters(null);\n }, [highlightedItem, open, providerFilters, statusFilters]);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItemId) {\n return;\n }\n for (const group of itemGroups) {\n for (const stack of partitionMessageCenterItemsByAgentUser(group.items)) {\n if (\n stack.items.length > 1 &&\n stack.items.some((item) => item.id === highlightedItemId)\n ) {\n expandStack(`${group.id}:${stack.id}`);\n return;\n }\n }\n }\n }, [expandStack, highlightedItemId, itemGroups, open]);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItemId) {\n lastScrolledHighlightedItemIdRef.current = null;\n return;\n }\n if (\n highlightedItem &&\n !itemMatchesViewFilters({\n item: highlightedItem,\n providerFilters,\n statusFilters\n })\n ) {\n return;\n }\n if (lastScrolledHighlightedItemIdRef.current === highlightedItemId) {\n return;\n }\n const target = itemNodesRef.current.get(highlightedItemId);\n if (!target) {\n return;\n }\n lastScrolledHighlightedItemIdRef.current = highlightedItemId;\n target.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n target.focus({ preventScroll: true });\n }, [\n expandedStackIds,\n highlightedItem,\n highlightedItemId,\n open,\n providerFilters,\n statusFilters,\n visibleItems\n ]);\n\n useEffect(() => {\n if (!open || !highlightedItemId) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n onHighlightedItemSettled?.(highlightedItemId);\n }, 3200);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [highlightedItemId, onHighlightedItemSettled, open]);\n\n return (\n <Drawer\n open={open}\n direction=\"right\"\n handleOnly\n onOpenChange={(nextOpen: boolean) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DrawerContent\n className={cn(\n \"t-modal nodrag min-h-0 w-[min(440px,calc(100vw-16px))] max-w-none overflow-hidden rounded-none border-y-0 border-r-0 bg-[var(--background-panel)] text-[var(--text-primary)] shadow-side-panel data-[vaul-drawer-direction=right]:rounded-none\",\n \"[-webkit-app-region:no-drag]\"\n )}\n data-testid=\"workspace-agent-message-center\"\n portalContainer={portalContainer ?? undefined}\n showOverlay={false}\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n >\n <TooltipProvider delayDuration={MESSAGE_CENTER_TOOLTIP_DELAY_MS}>\n <div className=\"flex-none border-b border-[var(--border-1)] px-3.5 pt-3 pb-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n </div>\n <div className=\"truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </div>\n </div>\n <MessageCenterViewMenu\n filtersActive={hasActiveFilters}\n groupBy={groupBy}\n providerFilters={providerFilters}\n providerOptions={providerOptions}\n statusFilters={statusFilters}\n statusOptions={statusOptions}\n onClearFilters={clearFilters}\n onGroupByChange={setGroupBy}\n onProviderToggle={toggleProviderFilter}\n onStatusToggle={toggleStatusFilter}\n />\n </div>\n </div>\n\n <AgentVerticalScrollArea\n className=\"min-h-0 flex-1\"\n viewportClassName=\"flex h-full w-full flex-col px-3.5 pt-4 pb-4\"\n scrollbarClassName=\"top-4 bottom-4\"\n syncKey={`${groupBy}:${activeStatusSummary}:${[...deckItems, ...visibleItems].map((item) => item.id).join(\"|\")}`}\n >\n {deckItems.length > 0 || listItems.length > 0 ? (\n <div className=\"flex w-full min-w-0 flex-col gap-4\">\n {deckItems.length > 0 ? (\n <WorkspaceAgentMessageCenterAttentionDeck\n items={deckItems}\n highlightedItemId={highlightedItemId}\n submittingPromptKey={submittingPromptKey}\n registerNode={setItemNode}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(item, input) =>\n void submitPrompt(item, input)\n }\n />\n ) : null}\n {itemGroups.map((group) => (\n <section\n key={group.id}\n className=\"flex min-w-0 flex-col gap-2.5\"\n aria-label={`${group.label} ${group.items.length}`}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3 px-0.5\">\n <MessageCenterGroupHeading group={group} />\n </div>\n {(() => {\n const renderCard = (\n item: WorkspaceAgentMessageCenterItem,\n options: { stackedIndex?: number } = {}\n ) => {\n const highlighted = item.id === highlightedItemId;\n const card = (\n <MessageCenterCard\n key={item.agentSessionId}\n cardRef={(node) => setItemNode(item.id, node)}\n highlighted={highlighted}\n item={item}\n isSubmitting={\n submittingPromptKey ===\n `${item.agentSessionId}:${item.pendingPrompt?.requestId}`\n }\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(input) =>\n void submitPrompt(item, input)\n }\n />\n );\n\n if (options.stackedIndex === undefined) {\n return card;\n }\n\n return (\n <div\n key={item.agentSessionId}\n className=\"min-w-0 motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 motion-safe:duration-200 motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\"\n style={{\n animationDelay: `${Math.min(options.stackedIndex * 24, 96)}ms`\n }}\n >\n {card}\n </div>\n );\n };\n\n return partitionMessageCenterItemsByAgentUser(\n group.items\n ).map((stack) => {\n const firstItem = stack.items[0];\n if (!firstItem) {\n return null;\n }\n if (stack.items.length === 1) {\n return renderCard(firstItem);\n }\n const stackId =\n group.id === stack.id\n ? stack.id\n : `${group.id}:${stack.id}`;\n return (\n <MessageCenterStack\n key={stackId}\n expanded={expandedStackIds.has(stackId)}\n groupId={stackId}\n items={stack.items}\n renderCard={renderCard}\n onCollapse={() => collapseStack(stackId)}\n onExpand={() => expandStack(stackId)}\n />\n );\n });\n })()}\n </section>\n ))}\n </div>\n ) : model.items.length > 0 ? (\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-2.5 px-6 py-8 text-center text-[13px] text-[var(--text-tertiary)]\">\n <span>\n {t(\"agentHost.workspaceAgentMessageCenterFilteredEmpty\")}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"border border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n onClick={clearFilters}\n >\n {t(\"agentHost.workspaceAgentMessageCenterClearFilters\")}\n </Button>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center px-6 py-8 text-center text-[13px] text-[var(--text-tertiary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterEmpty\")}\n </div>\n )}\n </AgentVerticalScrollArea>\n </TooltipProvider>\n </DrawerContent>\n </Drawer>\n );\n}\n\nconst MessageCenterCard = WorkspaceAgentMessageCenterCard;\nconst MessageCenterStack = WorkspaceAgentMessageCenterStack;\n\nfunction MessageCenterGroupHeading({\n group\n}: {\n group: ReturnType<typeof groupMessageCenterItems>[number];\n}): JSX.Element {\n \"use memo\";\n\n if (group.provider) {\n return (\n <h3\n aria-label={`${group.label} · ${group.items.length}`}\n className=\"flex min-w-0 items-center gap-1.5 text-[11px] font-normal leading-4 text-[var(--text-tertiary)]\"\n title={`${group.label} · ${group.items.length}`}\n >\n {group.identity ? (\n <MessageCenterIdentityLabel\n identity={group.identity}\n provider={group.provider}\n />\n ) : (\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <MessageCenterIdentityAvatarMark\n identity={null}\n provider={group.provider}\n userId={group.userId ?? null}\n />\n <span className=\"min-w-0 truncate\">{group.label}</span>\n </span>\n )}\n <span className=\"shrink-0\">· {group.items.length}</span>\n </h3>\n );\n }\n\n return (\n <h3 className=\"truncate text-[11px] font-normal leading-4 text-[var(--text-tertiary)]\">\n {group.label} · {group.items.length}\n </h3>\n );\n}\n","import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type JSX\n} from \"react\";\nimport { CustomScrollArea } from \"../app/renderer/components/ui/custom-scroll-area\";\nimport { cn } from \"../app/renderer/lib/utils\";\n\nexport interface AgentVerticalScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n viewportClassName?: string;\n scrollbarClassName?: string;\n scrollbarThumbClassName?: string;\n syncKey?: unknown;\n}\n\nexport const AgentVerticalScrollArea = forwardRef<\n HTMLDivElement,\n AgentVerticalScrollAreaProps\n>(function AgentVerticalScrollArea(\n {\n children,\n className,\n viewportClassName,\n scrollbarClassName,\n scrollbarThumbClassName,\n syncKey,\n ...props\n },\n forwardedRef\n): JSX.Element {\n \"use memo\";\n return (\n <CustomScrollArea\n ref={forwardedRef}\n className={cn(\"agent-vertical-scroll-area min-h-0 min-w-0\", className)}\n viewportClassName={cn(\n \"min-h-0 min-w-0 overflow-x-hidden overflow-y-auto\",\n viewportClassName\n )}\n scrollbarClassName={cn(\n \"agent-vertical-scroll-area__scrollbar top-2 right-2 bottom-2\",\n scrollbarClassName\n )}\n scrollbarThumbClassName={cn(\n \"agent-vertical-scroll-area__scrollbar-thumb\",\n scrollbarThumbClassName\n )}\n syncKey={syncKey ?? children}\n {...props}\n >\n {children}\n </CustomScrollArea>\n );\n});\n","import {\n selectNeedsAttentionItems,\n selectSessionDisplayStatuses,\n type AgentActivityMessage,\n type AgentActivityNeedsAttentionItem,\n type AgentActivitySession,\n type AgentActivitySnapshot\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport { normalizeAskUserQuestions } from \"../shared/agentConversation/askUserQuestions\";\nimport { extractAgentMcpToolTarget } from \"../shared/agentMcpToolTarget\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"../shared/workspaceAgentSessionSortTime\";\nimport {\n latestPlanTurnId,\n planImplementationPromptFromPlanTurn\n} from \"../shared/agentConversation/planImplementation\";\nimport {\n buildWorkspaceAgentMessageCenterDigest,\n type WorkspaceAgentMessageCenterDigest\n} from \"./workspaceAgentMessageCenterDigest\";\n\nexport interface WorkspaceAgentMessageCenterModel {\n waitingCount: number;\n items: WorkspaceAgentMessageCenterItem[];\n counts: WorkspaceAgentMessageCenterCounts;\n}\n\nexport interface WorkspaceAgentMessageCenterCounts {\n all: number;\n working: number;\n waiting: number;\n completed: number;\n failed: number;\n}\n\nexport interface WorkspaceAgentMessageCenterItem {\n id: string;\n agentSessionId: string;\n provider: string;\n userId: string | null;\n title: string;\n identity: WorkspaceAgentMessageCenterIdentity | null;\n cwd: string;\n status: WorkspaceAgentActivityStatus;\n digest: WorkspaceAgentMessageCenterDigest;\n lastAgentMessageSummary: string;\n lastAgentMessageAtUnixMs: number | null;\n pendingPrompt: AgentConversationPromptVM | null;\n needsAttentionKind: AgentActivityNeedsAttentionItem[\"kind\"] | null;\n needsAttentionSummary: string | null;\n latestTurnOutcome?: WorkspaceAgentMessageCenterTurnOutcome | null;\n sortTimeUnixMs: number;\n}\n\nexport interface WorkspaceAgentMessageCenterTurnOutcome {\n notificationKey: string;\n status: \"completed\" | \"failed\";\n turnId: string | null;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterOptions {\n avoidGroupingEdits?: boolean;\n identityBySessionId?: Record<string, WorkspaceAgentMessageCenterIdentity>;\n promptFallbackLabels?: WorkspaceAgentMessageCenterPromptFallbackLabels;\n workspaceRoot?: string | null;\n}\n\nexport interface WorkspaceAgentMessageCenterIdentity {\n userName: string;\n userAvatarUrl?: string;\n agentName: string;\n agentAvatarUrl?: string;\n}\n\nexport interface WorkspaceAgentMessageCenterPromptFallbackLabels {\n constraintHeader: string;\n inputHeader: string;\n question: string;\n title: string;\n}\n\nconst EMPTY_COUNTS: WorkspaceAgentMessageCenterCounts = {\n all: 0,\n working: 0,\n waiting: 0,\n completed: 0,\n failed: 0\n};\n\nexport function buildWorkspaceAgentMessageCenterModel(\n snapshot: AgentActivitySnapshot,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentMessageCenterModel {\n const needsAttentionBySessionId = latestNeedsAttentionBySessionId(\n selectNeedsAttentionItems(snapshot)\n );\n const displayStatuses = selectSessionDisplayStatuses(snapshot);\n const items = snapshot.sessions\n .filter((session) => session.visible !== false)\n .map((session) => {\n const messages = resolveSessionMessages(snapshot, session);\n const needsAttention =\n needsAttentionBySessionId.get(session.agentSessionId) ?? null;\n const status = displayStatuses.get(session.agentSessionId) ?? \"idle\";\n const lastAgentMessage = latestAgentMessage(messages);\n const title = resolveSessionTitle(session, messages);\n const pendingPrompt =\n pendingPromptFromMessages(messages) ??\n codexPlanImplementationPrompt(session, status, messages) ??\n fallbackPromptFromNeedsAttention(\n needsAttention,\n options.promptFallbackLabels\n );\n const digest = buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle: resolveDigestFallbackTitle(session),\n messages,\n needsAttention,\n pendingPrompt,\n status\n });\n const sortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(\n session,\n {\n messages\n }\n );\n\n return {\n id: `message-center-${session.agentSessionId}`,\n agentSessionId: session.agentSessionId,\n provider: session.provider,\n userId: session.userId?.trim() || null,\n title,\n identity: resolveMessageCenterIdentity(\n session.agentSessionId,\n options.identityBySessionId\n ),\n cwd: session.cwd,\n status,\n digest,\n lastAgentMessageSummary:\n lastAgentMessage?.summary ?? needsAttention?.summary ?? title,\n lastAgentMessageAtUnixMs: lastAgentMessage?.occurredAtUnixMs ?? null,\n pendingPrompt,\n needsAttentionKind: needsAttention?.kind ?? null,\n needsAttentionSummary: needsAttention?.summary ?? null,\n latestTurnOutcome: latestTurnOutcome(session.agentSessionId, messages),\n sortTimeUnixMs\n } satisfies WorkspaceAgentMessageCenterItem;\n });\n\n return {\n waitingCount: items.filter(isWaitingMessageCenterItem).length,\n items: items.sort(compareMessageCenterItems),\n counts: countMessageCenterItems(items)\n };\n}\n\nfunction resolveMessageCenterIdentity(\n agentSessionId: string,\n identityBySessionId:\n | Record<string, WorkspaceAgentMessageCenterIdentity>\n | undefined\n): WorkspaceAgentMessageCenterIdentity | null {\n const identity = identityBySessionId?.[agentSessionId];\n if (!identity) {\n return null;\n }\n const userName = identity.userName.trim();\n const agentName = identity.agentName.trim();\n if (!userName || !agentName) {\n return null;\n }\n const userAvatarUrl = identity.userAvatarUrl?.trim() ?? \"\";\n const agentAvatarUrl = identity.agentAvatarUrl?.trim() ?? \"\";\n return {\n userName,\n ...(userAvatarUrl ? { userAvatarUrl } : {}),\n agentName,\n ...(agentAvatarUrl ? { agentAvatarUrl } : {})\n };\n}\n\nexport function isWaitingMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null || item.needsAttentionKind !== null;\n}\n\nexport function isInteractiveMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null;\n}\n\nexport function selectMessageCenterAttentionDeckItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterItem[] {\n return items.filter(isInteractiveMessageCenterItem);\n}\n\nexport function isCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n item.status === \"completed\" ||\n item.status === \"canceled\" ||\n item.status === \"idle\"\n );\n}\n\nfunction latestNeedsAttentionBySessionId(\n items: readonly AgentActivityNeedsAttentionItem[]\n): Map<string, AgentActivityNeedsAttentionItem> {\n const bySessionId = new Map<string, AgentActivityNeedsAttentionItem>();\n for (const item of items) {\n const previous = bySessionId.get(item.agentSessionId);\n if (!previous || item.occurredAtUnixMs > previous.occurredAtUnixMs) {\n bySessionId.set(item.agentSessionId, item);\n }\n }\n return bySessionId;\n}\n\nfunction resolveSessionMessages(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): AgentActivityMessage[] {\n for (const sessionId of [session.agentSessionId, session.providerSessionId]) {\n const normalized = sessionId?.trim() ?? \"\";\n if (normalized && snapshot.sessionMessagesById[normalized]) {\n return snapshot.sessionMessagesById[normalized];\n }\n }\n return [];\n}\n\nfunction resolveSessionTitle(\n session: AgentActivitySession,\n messages: readonly AgentActivityMessage[]\n): string {\n const title = session.title.trim();\n if (title) {\n return title;\n }\n return (\n firstUserMessageText(messages) || session.provider || session.agentSessionId\n );\n}\n\nfunction resolveDigestFallbackTitle(session: AgentActivitySession): string {\n return session.title.trim() || session.provider || session.agentSessionId;\n}\n\nfunction firstUserMessageText(\n messages: readonly AgentActivityMessage[]\n): string {\n for (const message of messages) {\n if (message.role.trim().toLowerCase() !== \"user\") {\n continue;\n }\n const summary = messageSummary(message);\n if (summary) {\n return summary;\n }\n }\n return \"\";\n}\n\nfunction pendingPromptFromMessages(\n messages: readonly AgentActivityMessage[]\n): AgentConversationPromptVM | null {\n for (const message of [...messages].sort(compareMessagesByRecentTime)) {\n if (isTerminalMessageStatus(message.status)) {\n continue;\n }\n const approval = approvalPromptFromMessage(message);\n if (approval) {\n return approval;\n }\n const askUser = askUserPromptFromMessage(message);\n if (askUser) {\n return askUser;\n }\n const exitPlan = exitPlanPromptFromMessage(message);\n if (exitPlan) {\n return exitPlan;\n }\n }\n return null;\n}\n\nfunction approvalPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!isPermissionMessage(message)) {\n return null;\n }\n const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n const requestId =\n stringValue(input.requestId) ??\n stringValue(payload.requestId) ??\n stringValue(payload.approvalRequestId) ??\n message.messageId;\n const options = [\n ...arrayValue(input.options),\n ...arrayValue(payload.options)\n ].flatMap((option) => {\n const record = recordValue(option);\n const id =\n stringValue(record.optionId) ??\n stringValue(record.id) ??\n stringValue(record.kind);\n if (!id) {\n return [];\n }\n return [\n {\n id,\n label:\n stringValue(record.name) ??\n stringValue(record.label) ??\n stringValue(record.title) ??\n id,\n kind: stringValue(record.kind) ?? id,\n ...(stringValue(record.description)\n ? { description: stringValue(record.description) as string }\n : {})\n }\n ];\n });\n if (options.length === 0) {\n return null;\n }\n const mcpTarget = extractAgentMcpToolTarget({ payload });\n return {\n kind: \"approval\",\n id: `approval:${requestId}`,\n turnId: message.turnId ?? \"turn:unknown\",\n requestId,\n callId: stringValue(payload.callId) ?? message.messageId,\n title: firstNonEmptyString(\n mcpTarget?.displayName ?? null,\n stringValue(payload.summary),\n stringValue(payload.title),\n stringValue(input.title),\n stringValue(input.command),\n messageSummary(message),\n message.kind\n ),\n toolName:\n stringValue(payload.toolName) ??\n stringValue(payload.name) ??\n stringValue(payload.tool),\n status: message.status ?? stringValue(payload.status),\n input: Object.keys(input).length > 0 ? input : payload,\n options,\n output: null,\n occurredAtUnixMs: messageTimeUnixMs(message) || null\n };\n}\n\nfunction askUserPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!isQuestionMessage(message)) {\n return null;\n }\n const payload = recordValue(message.payload);\n // The structured questions live on the tool-call input (payload.input.questions\n // or payload.tool_state.input.questions) — the same source the in-conversation\n // projection reads — so the deck card renders the identical question + options.\n // payload.questions is a legacy fallback for shapes that inline them.\n const toolState = recordValue(payload.tool_state);\n const input =\n Object.keys(recordValue(payload.input)).length > 0\n ? recordValue(payload.input)\n : recordValue(toolState.input);\n const rawQuestions =\n arrayValue(input.questions).length > 0\n ? input.questions\n : payload.questions;\n const questions = normalizeAskUserQuestions(rawQuestions);\n if (questions.length === 0) {\n return null;\n }\n return {\n kind: \"ask-user\",\n requestId:\n stringValue(input.requestId) ??\n stringValue(payload.requestId) ??\n stringValue(payload.interactiveRequestId) ??\n message.messageId,\n title:\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message),\n questions\n };\n}\n\nfunction exitPlanPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!includesAny(normalizedMetadataValues(message), [\"exitplanmode\"])) {\n return null;\n }\n const payload = recordValue(message.payload);\n return {\n kind: \"exit-plan\",\n requestId: stringValue(payload.requestId) ?? message.messageId,\n title:\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message)\n };\n}\n\nfunction codexPlanImplementationPrompt(\n session: AgentActivitySession,\n status: WorkspaceAgentActivityStatus,\n messages: readonly AgentActivityMessage[]\n): AgentConversationPromptVM | null {\n if (session.provider.trim().toLowerCase() !== \"codex\") {\n return null;\n }\n // Only offer once the session has settled to completed/idle — not while it\n // is still working/waiting, and not after failed/canceled (no point asking\n // to implement a plan from a turn that didn't finish cleanly). Mirrors the\n // codex TUI gate but evaluated against the latest turn rather than a\n // transient per-turn flag.\n if (status !== \"completed\" && status !== \"idle\") {\n return null;\n }\n const planTurnId = latestPlanTurnId(messages);\n if (!planTurnId) {\n return null;\n }\n // Title from the plan message itself (matching latestPlanTurnId's plan-item\n // detection), not whichever message in the turn happens to come first.\n const planMessage = messages.find(\n (item) =>\n item.turnId?.trim() === planTurnId &&\n recordValue(item.payload).messageKind === \"plan\"\n );\n const title = planMessage ? messageSummary(planMessage) : \"\";\n return planImplementationPromptFromPlanTurn(planTurnId, title);\n}\n\nfunction latestAgentMessage(\n messages: readonly AgentActivityMessage[]\n): { summary: string; occurredAtUnixMs: number } | null {\n return messages.reduce<{ summary: string; occurredAtUnixMs: number } | null>(\n (latest, message) => {\n if (!isAgentMessageRole(message.role)) {\n return latest;\n }\n const summary = messageSummary(message);\n if (!summary) {\n return latest;\n }\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (!latest || occurredAtUnixMs >= latest.occurredAtUnixMs) {\n return { summary, occurredAtUnixMs };\n }\n return latest;\n },\n null\n );\n}\n\nfunction latestTurnOutcome(\n agentSessionId: string,\n messages: readonly AgentActivityMessage[]\n): WorkspaceAgentMessageCenterTurnOutcome | null {\n const latest = messages\n .flatMap((message) => {\n const status = outcomeStatusFromMessage(message);\n if (!status) {\n return [];\n }\n const turnId = message.turnId?.trim() || null;\n const messageId = message.messageId.trim();\n const notificationSubject = turnId\n ? `turn:${turnId}`\n : `message:${messageId}`;\n return [\n {\n notificationKey: `${agentSessionId}:${notificationSubject}:${status}`,\n status,\n turnId,\n sortMessage: message\n }\n ];\n })\n .sort((left, right) =>\n compareMessagesByRecentTime(left.sortMessage, right.sortMessage)\n )[0];\n\n if (!latest) {\n return null;\n }\n return {\n notificationKey: latest.notificationKey,\n status: latest.status,\n turnId: latest.turnId\n };\n}\n\nfunction outcomeStatusFromMessage(\n message: AgentActivityMessage\n): WorkspaceAgentMessageCenterTurnOutcome[\"status\"] | null {\n if (!isAgentMessageRole(message.role)) {\n return null;\n }\n const payload = recordValue(message.payload);\n const status = (message.status ?? stringValue(payload.status) ?? \"\")\n .trim()\n .toLowerCase();\n switch (status) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"error\":\n case \"failed\":\n return \"failed\";\n default:\n return null;\n }\n}\n\nfunction fallbackPromptFromNeedsAttention(\n item: AgentActivityNeedsAttentionItem | null,\n labels: WorkspaceAgentMessageCenterPromptFallbackLabels | undefined\n): AgentConversationPromptVM | null {\n if (!item || item.kind === \"permission\" || !labels) {\n return null;\n }\n return {\n kind: \"ask-user\",\n requestId: requestIdFromNeedsAttentionItem(item),\n title: item.summary || item.title || labels.title,\n questions: [\n {\n id: \"response\",\n header:\n item.kind === \"constraint\"\n ? labels.constraintHeader\n : labels.inputHeader,\n question: item.summary || item.title || labels.question,\n options: [],\n multiSelect: false,\n answer: null\n }\n ]\n };\n}\n\nfunction requestIdFromNeedsAttentionItem(\n item: AgentActivityNeedsAttentionItem\n): string {\n const [, messageId] = item.id.split(\":\", 2);\n return messageId?.trim() || item.id;\n}\n\nfunction countMessageCenterItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterCounts {\n return items.reduce<WorkspaceAgentMessageCenterCounts>(\n (counts, item) => {\n counts.all += 1;\n if (isWaitingMessageCenterItem(item)) {\n counts.waiting += 1;\n return counts;\n }\n if (isCompletedMessageCenterItem(item)) {\n counts.completed += 1;\n return counts;\n }\n switch (item.status) {\n case \"working\":\n counts.working += 1;\n break;\n case \"failed\":\n counts.failed += 1;\n break;\n default:\n break;\n }\n return counts;\n },\n { ...EMPTY_COUNTS }\n );\n}\n\nfunction compareMessageCenterItems(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): number {\n const leftWaiting = isWaitingMessageCenterItem(left);\n const rightWaiting = isWaitingMessageCenterItem(right);\n if (leftWaiting !== rightWaiting) {\n return leftWaiting ? -1 : 1;\n }\n return (\n right.sortTimeUnixMs - left.sortTimeUnixMs ||\n left.agentSessionId.localeCompare(right.agentSessionId)\n );\n}\n\nfunction isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n switch (status?.trim().toLowerCase()) {\n case \"answered\":\n case \"canceled\":\n case \"cancelled\":\n case \"completed\":\n case \"failed\":\n case \"rejected\":\n case \"resolved\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isPermissionMessage(message: AgentActivityMessage): boolean {\n return includesAny(normalizedMetadataValues(message), [\n \"permission\",\n \"approval\"\n ]);\n}\n\nfunction isQuestionMessage(message: AgentActivityMessage): boolean {\n return includesAny(normalizedMetadataValues(message), [\n \"ask_user\",\n \"ask-user\",\n \"askuserquestion\",\n \"question\"\n ]);\n}\n\nfunction normalizedMetadataValues(message: AgentActivityMessage): string {\n const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n return [\n message.kind,\n message.status ?? \"\",\n stringValue(payload.type) ?? \"\",\n stringValue(payload.action) ?? \"\",\n stringValue(payload.requestType) ?? \"\",\n stringValue(payload.callType) ?? \"\",\n stringValue(payload.toolName) ?? \"\",\n stringValue(payload.name) ?? \"\",\n stringValue(payload.status) ?? \"\",\n stringValue(input.type) ?? \"\",\n stringValue(input.action) ?? \"\",\n stringValue(input.requestType) ?? \"\",\n stringValue(input.callType) ?? \"\",\n stringValue(input.toolName) ?? \"\",\n stringValue(input.name) ?? \"\",\n stringValue(input.status) ?? \"\"\n ]\n .join(\" \")\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nfunction compareMessagesByRecentTime(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n messageTimeUnixMs(right) - messageTimeUnixMs(left) ||\n right.version - left.version ||\n right.messageId.localeCompare(left.messageId)\n );\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) =>\n value.includes(needle.replace(/[_\\s-]+/g, \"\").toLowerCase())\n );\n}\n\nfunction messageSummary(message: AgentActivityMessage): string {\n return firstNonEmptyString(\n stringValue(message.payload.summary),\n stringValue(message.payload.text),\n stringValue(message.payload.content),\n stringValue(message.payload.message),\n stringValue(message.payload.body),\n stringValue(message.payload.title)\n );\n}\n\nfunction messageTimeUnixMs(message: AgentActivityMessage): number {\n return (\n positiveNumber(message.occurredAtUnixMs) ??\n positiveNumber(message.completedAtUnixMs) ??\n positiveNumber(message.startedAtUnixMs) ??\n positiveNumber(message.version) ??\n 0\n );\n}\n\nfunction firstNonEmptyString(...values: Array<string | null>): string {\n return values.find((value) => value !== null && value.length > 0) ?? \"\";\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n","import type {\n AgentActivityMessage,\n AgentActivityNeedsAttentionItem\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport { extractAgentMcpToolTarget } from \"../shared/agentMcpToolTarget\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\n\nexport type WorkspaceAgentMessageCenterDigestPrimaryKind =\n | \"input-required\"\n | \"error\"\n | \"outcome\"\n | \"progress\"\n | \"summary\";\n\nexport interface WorkspaceAgentMessageCenterDigestPrimary {\n kind: WorkspaceAgentMessageCenterDigestPrimaryKind;\n summary: string;\n occurredAtUnixMs: number | null;\n}\n\nexport interface WorkspaceAgentMessageCenterDigest {\n primary: WorkspaceAgentMessageCenterDigestPrimary;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterDigestInput {\n fallbackTitle: string;\n messages: readonly AgentActivityMessage[];\n needsAttention: AgentActivityNeedsAttentionItem | null;\n pendingPrompt: AgentConversationPromptVM | null;\n status: WorkspaceAgentActivityStatus;\n}\n\nexport function buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle,\n messages,\n needsAttention,\n pendingPrompt,\n status\n}: BuildWorkspaceAgentMessageCenterDigestInput): WorkspaceAgentMessageCenterDigest {\n const latestAgentMessage = latestAgentMessageSummary(messages);\n const fallbackSummary = firstNonEmptyString(\n latestAgentMessage?.summary ?? null,\n needsAttention?.summary ?? null,\n pendingPromptSummary(pendingPrompt),\n fallbackTitle\n );\n if (pendingPrompt || needsAttention) {\n return {\n primary: {\n kind: \"input-required\",\n summary: firstNonEmptyString(\n pendingPromptSummary(pendingPrompt),\n needsAttention?.summary ?? null,\n fallbackSummary\n ),\n occurredAtUnixMs:\n needsAttention?.occurredAtUnixMs ??\n promptTimeUnixMs(pendingPrompt) ??\n latestAgentMessage?.occurredAtUnixMs ??\n null\n }\n };\n }\n if (status === \"failed\") {\n return {\n primary: {\n kind: \"error\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n }\n if (status === \"completed\" || status === \"canceled\" || status === \"idle\") {\n return {\n primary: {\n kind: \"outcome\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n }\n if (status === \"working\") {\n return {\n primary: {\n kind: \"progress\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n }\n return {\n primary: {\n kind: \"summary\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n}\n\nfunction latestAgentMessageSummary(\n messages: readonly AgentActivityMessage[]\n): { summary: string; occurredAtUnixMs: number } | null {\n return messages.reduce<{ summary: string; occurredAtUnixMs: number } | null>(\n (latest, message) => {\n if (!isAgentMessageRole(message.role)) {\n return latest;\n }\n const summary = meaningfulMessageSummary(message);\n if (!summary) {\n return latest;\n }\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (!latest || occurredAtUnixMs >= latest.occurredAtUnixMs) {\n return { summary, occurredAtUnixMs };\n }\n return latest;\n },\n null\n );\n}\n\nfunction pendingPromptSummary(\n prompt: AgentConversationPromptVM | null\n): string | null {\n if (!prompt) {\n return null;\n }\n switch (prompt.kind) {\n case \"ask-user\":\n return firstNonEmptyString(\n prompt.title,\n prompt.questions[0]?.question ?? null\n );\n case \"approval\":\n case \"exit-plan\":\n case \"plan-implementation\":\n return prompt.title;\n }\n}\n\nfunction promptTimeUnixMs(\n prompt: AgentConversationPromptVM | null\n): number | null {\n if (!prompt || !(\"occurredAtUnixMs\" in prompt)) {\n return null;\n }\n return positiveNumber(prompt.occurredAtUnixMs);\n}\n\nfunction isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\ntype MessageSummarySource =\n | \"payload.summary\"\n | \"payload.text\"\n | \"payload.content\"\n | \"payload.message\"\n | \"payload.body\"\n | \"tool.error\"\n | \"tool.output\"\n | \"tool.input\"\n | \"payload.title\";\n\ninterface MessageSummaryCandidate {\n source: MessageSummarySource;\n summary: string;\n}\n\nfunction meaningfulMessageSummary(message: AgentActivityMessage): string {\n for (const candidate of messageSummaryCandidates(message)) {\n if (!isGenericToolLabelSummary(message, candidate)) {\n return decorateMessageSummary(message, candidate);\n }\n }\n return \"\";\n}\n\nfunction messageSummaryCandidates(\n message: AgentActivityMessage\n): MessageSummaryCandidate[] {\n const explicitCandidates = [\n summaryCandidate(\"payload.summary\", message.payload.summary),\n summaryCandidate(\"payload.text\", message.payload.text),\n summaryCandidate(\"payload.content\", message.payload.content),\n summaryCandidate(\"payload.message\", message.payload.message),\n summaryCandidate(\"payload.body\", message.payload.body)\n ];\n if (!isToolLikeMessage(message)) {\n return [\n ...explicitCandidates,\n summaryCandidate(\"payload.title\", message.payload.title)\n ].filter((candidate): candidate is MessageSummaryCandidate =>\n Boolean(candidate)\n );\n }\n return [\n ...explicitCandidates,\n toolErrorSummaryCandidate(message.payload),\n toolOutputSummaryCandidate(message.payload),\n toolInputSummaryCandidate(message.payload),\n summaryCandidate(\"payload.title\", message.payload.title)\n ].filter((candidate): candidate is MessageSummaryCandidate =>\n Boolean(candidate)\n );\n}\n\nfunction summaryCandidate(\n source: MessageSummarySource,\n value: unknown\n): MessageSummaryCandidate | null {\n const summary = normalizeSummaryText(stringValue(value));\n return summary ? { source, summary } : null;\n}\n\nfunction toolErrorSummaryCandidate(\n payload: Record<string, unknown>\n): MessageSummaryCandidate | null {\n const error = recordValue(payload.error);\n const rawOutput = recordValue(error.rawOutput);\n return summaryCandidate(\n \"tool.error\",\n firstNonEmptyString(\n stringValue(payload.error),\n stringValue(error.summary),\n stringValue(error.message),\n stringValue(error.detail),\n stringValue(error.text),\n textFromContentValue(error.content),\n stringValue(error.output),\n stringValue(error.stdout),\n stringValue(error.stderr),\n stringValue(error.aggregated_output),\n stringValue(error.formatted_output),\n stringValue(rawOutput.stdout),\n stringValue(rawOutput.stderr),\n stringValue(rawOutput.aggregated_output),\n stringValue(rawOutput.formatted_output),\n stringValue(error.error)\n )\n );\n}\n\nfunction toolOutputSummaryCandidate(\n payload: Record<string, unknown>\n): MessageSummaryCandidate | null {\n const output = recordValue(payload.output);\n const rawOutput = recordValue(output.rawOutput);\n return summaryCandidate(\n \"tool.output\",\n firstNonEmptyString(\n stringValue(output.summary),\n stringValue(output.message),\n stringValue(output.text),\n textFromContentValue(output.content),\n stringValue(output.content),\n stringValue(output.result),\n stringValue(output.output),\n stringValue(output.stdout),\n stringValue(output.stderr),\n stringValue(output.aggregated_output),\n stringValue(output.formatted_output),\n stringValue(rawOutput.stdout),\n stringValue(rawOutput.stderr),\n stringValue(rawOutput.aggregated_output),\n stringValue(rawOutput.formatted_output),\n stringValue(payload.result)\n )\n );\n}\n\nfunction toolInputSummaryCandidate(\n payload: Record<string, unknown>\n): MessageSummaryCandidate | null {\n const input = recordValue(payload.input);\n const rawInput = recordValue(input.rawInput);\n const action = recordValue(input.action);\n return summaryCandidate(\n \"tool.input\",\n firstNonEmptyString(\n stringValue(input.summary),\n stringValue(input.command),\n stringValue(input.cmd),\n stringValue(rawInput.command),\n stringValue(rawInput.cmd),\n stringValue(input.path),\n stringValue(input.file_path),\n stringValue(input.fileName),\n stringValue(input.filename),\n stringValue(input.query),\n stringArrayFirstValue(input.search_query),\n stringArrayFirstValue(input.searchQuery),\n stringValue(input.url),\n stringValue(input.pattern),\n stringValue(input.glob),\n stringValue(input.regex),\n stringValue(input.prompt),\n stringValue(action.query),\n stringValue(action.url)\n )\n );\n}\n\nfunction isGenericToolLabelSummary(\n message: AgentActivityMessage,\n candidate: MessageSummaryCandidate\n): boolean {\n if (!isToolLikeMessage(message)) {\n return false;\n }\n const normalizedSummary = normalizeToken(candidate.summary);\n if (!normalizedSummary) {\n return true;\n }\n if (structuralToolLabelTokens(message).has(normalizedSummary)) {\n return true;\n }\n return (\n candidate.source === \"payload.title\" &&\n !hasToolDigestSignal(message) &&\n looksLikeBareLabel(candidate.summary)\n );\n}\n\nfunction decorateMessageSummary(\n message: AgentActivityMessage,\n candidate: MessageSummaryCandidate\n): string {\n if (!isToolLikeMessage(message)) {\n return candidate.summary;\n }\n const mcpTarget = extractAgentMcpToolTarget({ payload: message.payload });\n if (!mcpTarget) {\n return candidate.summary;\n }\n if (candidate.summary.includes(mcpTarget.displayName)) {\n return candidate.summary;\n }\n return `${mcpTarget.displayName}: ${candidate.summary}`;\n}\n\nfunction isToolLikeMessage(message: AgentActivityMessage): boolean {\n const payload = recordValue(message.payload);\n const normalizedKind = normalizeToken(message.kind);\n const normalizedType = [\n stringValue(payload.type),\n stringValue(payload.action),\n stringValue(payload.requestType)\n ]\n .map((value) => normalizeToken(value ?? \"\"))\n .join(\" \");\n return (\n includesAny(normalizedKind, [\"call\", \"tool\"]) ||\n includesAny(normalizedType, [\"call\", \"tool\"]) ||\n Boolean(\n stringValue(payload.callType) ||\n stringValue(payload.toolName) ||\n stringValue(payload.tool) ||\n hasRecordValue(payload.input) ||\n hasRecordValue(payload.output) ||\n hasRecordValue(payload.error)\n )\n );\n}\n\nfunction structuralToolLabelTokens(message: AgentActivityMessage): Set<string> {\n const payload = recordValue(message.payload);\n const metadata = recordValue(payload.metadata);\n return new Set(\n [\n message.kind,\n message.status,\n stringValue(payload.type),\n stringValue(payload.action),\n stringValue(payload.requestType),\n stringValue(payload.callType),\n stringValue(payload.toolName),\n stringValue(payload.name),\n stringValue(payload.tool),\n stringValue(metadata.callType),\n stringValue(metadata.toolName),\n stringValue(metadata.name),\n stringValue(metadata.tool)\n ]\n .map((value) => normalizeToken(value ?? \"\"))\n .filter(Boolean)\n );\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) => value.includes(normalizeToken(needle)));\n}\n\nfunction hasToolDigestSignal(message: AgentActivityMessage): boolean {\n const payload = recordValue(message.payload);\n return Boolean(\n toolErrorSummaryCandidate(payload) ||\n toolOutputSummaryCandidate(payload) ||\n toolInputSummaryCandidate(payload)\n );\n}\n\nfunction looksLikeBareLabel(value: string): boolean {\n const trimmed = value.trim();\n return (\n trimmed.length > 0 &&\n trimmed.length <= 40 &&\n !/\\s/u.test(trimmed) &&\n !/[/:\\\\.[\\]{}()=#?&]/u.test(trimmed)\n );\n}\n\nfunction normalizeToken(value: string): string {\n return value.replace(/[_\\s.-]+/g, \"\").toLowerCase();\n}\n\nfunction messageTimeUnixMs(message: AgentActivityMessage): number {\n return (\n positiveNumber(message.occurredAtUnixMs) ??\n positiveNumber(message.completedAtUnixMs) ??\n positiveNumber(message.startedAtUnixMs) ??\n positiveNumber(message.version) ??\n 0\n );\n}\n\nfunction firstNonEmptyString(...values: Array<string | null>): string {\n return (\n values.find((value) => value !== null && value.trim().length > 0) ?? \"\"\n );\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction stringArrayFirstValue(value: unknown): string | null {\n if (!Array.isArray(value)) {\n return null;\n }\n return (\n value.map(stringValue).find((item): item is string => Boolean(item)) ?? null\n );\n}\n\nfunction textFromContentValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (Array.isArray(value)) {\n return (\n value\n .map(textFromContentValue)\n .find((item): item is string => Boolean(item)) ?? null\n );\n }\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n return firstNonEmptyString(\n stringValue(record.text),\n \"content\" in record ? textFromContentValue(record.content) : null\n );\n}\n\nfunction normalizeSummaryText(value: string | null): string | null {\n if (!value) {\n return null;\n }\n return value\n .replace(/^#{1,6}\\s+error\\s*\\n+/iu, \"\")\n .replace(/\\s+/gu, \" \")\n .trim();\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction hasRecordValue(value: unknown): boolean {\n return Object.keys(recordValue(value)).length > 0;\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n","import { useEffect, useMemo, useRef, useState, type JSX } from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport { WorkspaceAgentMessageCenterCard } from \"./WorkspaceAgentMessageCenterCard\";\nimport type { WorkspaceAgentMessageCenterItem } from \"./workspaceAgentMessageCenterModel\";\n\nconst DECK_MAX_PEEK = 2;\nconst DECK_NEW_CARD_COOLDOWN_MS = 500;\nconst DECK_LEAVE_ANIMATION_FALLBACK_MS = 420;\n\nexport interface WorkspaceAgentMessageCenterAttentionDeckProps {\n items: WorkspaceAgentMessageCenterItem[];\n highlightedItemId?: string | null;\n submittingPromptKey: string | null;\n registerNode?: (itemId: string, node: HTMLElement | null) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }\n ) => void;\n}\n\nexport function WorkspaceAgentMessageCenterAttentionDeck({\n items,\n highlightedItemId = null,\n submittingPromptKey,\n registerNode,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt\n}: WorkspaceAgentMessageCenterAttentionDeckProps): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n\n const ordered = useMemo(\n () => orderDeckItems(items, highlightedItemId),\n [items, highlightedItemId]\n );\n\n // Derive topRequestId using optional chaining so it is safe when ordered[0] is undefined.\n // All hooks must run before the early-return guard.\n const topRequestId = ordered[0]?.pendingPrompt?.requestId ?? null;\n const topPromotedByHighlight =\n ordered[0]?.id === highlightedItemId && highlightedItemId !== null;\n const previousTopRequestIdRef = useRef<string | null>(null);\n const [cooldownRequestId, setCooldownRequestId] = useState<string | null>(\n null\n );\n\n useEffect(() => {\n const previousTopRequestId = previousTopRequestIdRef.current;\n previousTopRequestIdRef.current = topRequestId;\n if (\n !topRequestId ||\n topPromotedByHighlight ||\n previousTopRequestId === null ||\n previousTopRequestId === topRequestId\n ) {\n return undefined;\n }\n setCooldownRequestId(topRequestId);\n const timeoutId = window.setTimeout(() => {\n setCooldownRequestId((current) =>\n current === topRequestId ? null : current\n );\n }, DECK_NEW_CARD_COOLDOWN_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [topPromotedByHighlight, topRequestId]);\n\n const isTopCoolingDown =\n cooldownRequestId !== null && cooldownRequestId === topRequestId;\n\n const previousTopItemRef = useRef<WorkspaceAgentMessageCenterItem | null>(\n null\n );\n const [leavingItem, setLeavingItem] =\n useState<WorkspaceAgentMessageCenterItem | null>(null);\n\n useEffect(() => {\n const previousTopItem = previousTopItemRef.current;\n previousTopItemRef.current = ordered[0] ?? null;\n if (\n previousTopItem &&\n previousTopItem.id !== (ordered[0]?.id ?? null) &&\n !items.some((item) => item.id === previousTopItem.id)\n ) {\n setLeavingItem(previousTopItem);\n const timeoutId = window.setTimeout(() => {\n setLeavingItem((current) =>\n current?.id === previousTopItem.id ? null : current\n );\n }, DECK_LEAVE_ANIMATION_FALLBACK_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }\n return undefined;\n }, [items, ordered]);\n\n const topItem = ordered[0];\n if (!topItem) {\n return null;\n }\n\n const peekCount = Math.min(ordered.length - 1, DECK_MAX_PEEK);\n const topIsSubmitting =\n submittingPromptKey ===\n `${topItem.agentSessionId}:${topItem.pendingPrompt?.requestId}`;\n\n return (\n <section\n className=\"flex min-w-0 flex-col gap-2.5\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\")}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3 px-0.5\">\n <div className=\"truncate text-xs font-bold leading-4 text-[var(--text-tertiary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\")} ·{\" \"}\n {ordered.length}\n </div>\n </div>\n <div\n className={cn(\n \"relative min-w-0\",\n peekCount > 1 ? \"pb-[18px]\" : peekCount > 0 && \"pb-[10px]\"\n )}\n data-testid=\"workspace-agent-message-center-attention-deck\"\n data-deck-count={ordered.length}\n data-deck-peek-count={peekCount}\n data-deck-top-item-id={topItem.id}\n >\n {leavingItem ? (\n <div\n key={`leaving-${leavingItem.agentSessionId}`}\n aria-hidden=\"true\"\n inert\n data-deck-leaving-item-id={leavingItem.id}\n className=\"pointer-events-none absolute inset-x-0 top-0 z-20 min-w-0 motion-safe:animate-out motion-safe:fade-out-0 motion-safe:slide-out-to-top-2 motion-safe:duration-300 motion-safe:ease-[cubic-bezier(0.4,0,0.2,1)] motion-reduce:hidden\"\n onAnimationEnd={(event) => {\n if (event.target === event.currentTarget) {\n setLeavingItem((current) =>\n current?.id === leavingItem.id ? null : current\n );\n }\n }}\n >\n <WorkspaceAgentMessageCenterCard\n interactive={false}\n isSubmitting={false}\n item={leavingItem}\n onOpenChat={onOpenChat}\n onSubmitPrompt={() => {}}\n />\n </div>\n ) : null}\n <div\n key={topItem.id}\n className={cn(\n \"relative min-w-0 rounded-lg motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 motion-safe:duration-300 motion-reduce:animate-none\",\n peekCount > 1\n ? \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2),0_14px_0_-8px_var(--background-fronted),0_14px_0_-7px_var(--line-2)]\"\n : peekCount > 0 &&\n \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2)]\"\n )}\n >\n <WorkspaceAgentMessageCenterCard\n cardRef={\n registerNode\n ? (node) => registerNode(topItem.id, node)\n : undefined\n }\n highlighted={topItem.id === highlightedItemId}\n interactive\n isSubmitting={topIsSubmitting || isTopCoolingDown}\n item={topItem}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(input) => onSubmitPrompt(topItem, input)}\n />\n </div>\n </div>\n </section>\n );\n}\n\nfunction orderDeckItems(\n items: readonly WorkspaceAgentMessageCenterItem[],\n highlightedItemId: string | null\n): WorkspaceAgentMessageCenterItem[] {\n if (!highlightedItemId) {\n return [...items];\n }\n const index = items.findIndex((item) => item.id === highlightedItemId);\n if (index <= 0) {\n return [...items];\n }\n const next = [...items];\n const [picked] = next.splice(index, 1);\n return picked ? [picked, ...next] : next;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type ReactNode\n} from \"react\";\nimport { ChevronDown, ChevronUp, ExternalLink, Info } from \"lucide-react\";\nimport {\n Button,\n cn,\n StatusDot,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport { normalizeAgentTitleText } from \"../shared/utils/agentTitleText\";\nimport { AgentInteractivePromptSurface } from \"../shared/agentConversation/components/AgentInteractivePromptSurface\";\nimport { AgentMessageMarkdown } from \"../shared/AgentMessageMarkdown\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport { managedAgentRoundedIconUrl } from \"../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../shared/workspaceAgentActivityStatusLabel\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport userAvatarPlaceholderUrl from \"../app/renderer/assets/icons/user-avatar-placeholder.png\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n highlighted?: boolean;\n interactive?: boolean;\n isSubmitting: boolean;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }) => void;\n}\n\nfunction stopMessageCenterTextPointerPropagation(\n event: ReactPointerEvent<HTMLElement>\n): void {\n event.stopPropagation();\n}\n\nexport function WorkspaceAgentMessageCenterCard({\n cardRef,\n highlighted = false,\n interactive = true,\n item,\n isSubmitting,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt\n}: WorkspaceAgentMessageCenterCardProps): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n const prompt = item.pendingPrompt;\n const displayTitle = normalizeAgentTitleText(item.title);\n const summary = messageCenterVisibleSummary(item);\n const displayStatus = statusClass(item);\n const statusLabel = workspaceAgentActivityStatusLabel(displayStatus, t);\n\n return (\n <article\n ref={cardRef}\n className={cn(\n \"workspace-agent-message-center__card group/message-card flex min-w-0 flex-col gap-2.5 rounded-lg border border-[var(--line-2)] bg-[var(--background-fronted)] p-3.5 outline outline-0 outline-offset-2 outline-transparent transition-[background-color,border-color,outline-color]\",\n isWaitingMessageCenterItem(item) &&\n \"agent-gui-edge-glow border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)]\",\n highlighted && \"outline-2 outline-[var(--accent)]\"\n )}\n data-highlighted={highlighted ? \"true\" : undefined}\n data-message-center-digest-kind={item.digest.primary.kind}\n data-message-center-item-id={item.id}\n data-waiting={isWaitingMessageCenterItem(item) ? \"true\" : undefined}\n data-status={displayStatus}\n tabIndex={highlighted ? -1 : undefined}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2.5\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <h3\n className=\"workspace-agent-message-center__copy-text min-w-0 truncate text-[13px] font-bold leading-5 text-[var(--text-secondary)]\"\n onPointerDown={stopMessageCenterTextPointerPropagation}\n >\n {displayTitle}\n </h3>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-[min(360px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n >\n {displayTitle}\n </TooltipContent>\n </Tooltip>\n {item.cwd ? <ProjectPathInfo path={item.cwd} /> : null}\n </div>\n <span\n className=\"workspace-agent-message-center__status inline-flex shrink-0 items-center gap-1.5 text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n data-status={displayStatus}\n title={statusLabel}\n >\n <StatusDot\n tone={messageCenterStatusTone(item)}\n pulse={\n isWaitingMessageCenterItem(item) || item.status === \"working\"\n }\n size=\"sm\"\n title={statusLabel}\n />\n <span>{statusLabel}</span>\n </span>\n </div>\n\n {summary ? (\n <MessageCenterSummary\n item={item}\n onLinkAction={onLinkAction}\n summary={summary}\n emptyLabel={t(\"agentHost.workspaceAgentMessageCenterNoSummary\")}\n />\n ) : null}\n\n {prompt && interactive ? (\n <div className=\"min-w-0\">\n <AgentInteractivePromptSurface\n embedded\n variant=\"compact\"\n keyboardShortcuts={false}\n prompt={prompt}\n isSubmitting={isSubmitting}\n onSubmit={onSubmitPrompt}\n labels={buildWorkspaceAgentInteractivePromptLabels(\n t,\n item.provider\n )}\n />\n </div>\n ) : null}\n\n <MessageCenterOpenChatButton\n provider={item.provider}\n item={item}\n label={t(\"agentHost.workspaceAgentMessageCenterOpenChat\")}\n onOpenChat={onOpenChat}\n // Interactive deck cards only offer the primary decision inline; the\n // jump to the conversation is the path for everything else (e.g.\n // refining a plan), so keep it always visible rather than hover-only.\n alwaysVisible={interactive && prompt !== null}\n />\n </article>\n );\n}\n\nconst STACK_PRESENCE_FALLBACK_MS = 380;\n\nfunction useStackRegionPresence(visible: boolean): {\n closing: boolean;\n mounted: boolean;\n onAnimationEnd: (event: ReactAnimationEvent<HTMLDivElement>) => void;\n} {\n const [mounted, setMounted] = useState(visible);\n const closing = mounted && !visible;\n\n useLayoutEffect(() => {\n if (visible) {\n setMounted(true);\n }\n }, [visible]);\n\n useEffect(() => {\n if (!closing) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n setMounted(false);\n }, STACK_PRESENCE_FALLBACK_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [closing]);\n\n const onAnimationEnd = useCallback(\n (event: ReactAnimationEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget && closing) {\n setMounted(false);\n }\n },\n [closing]\n );\n\n return { closing, mounted, onAnimationEnd };\n}\n\nexport function WorkspaceAgentMessageCenterStack({\n className,\n expanded,\n groupId,\n items,\n renderCard,\n onCollapse,\n onExpand\n}: {\n className?: string;\n expanded: boolean;\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n renderCard: (\n item: WorkspaceAgentMessageCenterItem,\n options?: { stackedIndex?: number }\n ) => ReactNode;\n onCollapse: () => void;\n onExpand: () => void;\n}): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const summaryRegion = useStackRegionPresence(!expanded);\n const cardsRegion = useStackRegionPresence(expanded);\n if (items.length < 2) {\n return null;\n }\n const collapseLabel = t(\n \"agentHost.workspaceAgentMessageCenterCollapseStackAria\"\n );\n\n return (\n <div\n className={cn(\"relative flex min-w-0 flex-col\", className)}\n data-stack-count={items.length}\n data-stack-motion=\"smooth\"\n data-stack-state={expanded ? \"expanded\" : \"collapsed\"}\n data-stack-top-item-id={items[0]?.id}\n data-testid={`workspace-agent-message-stack-${groupId}`}\n >\n {summaryRegion.mounted ? (\n <div\n className={cn(\n \"workspace-agent-message-center__stack-rest min-w-0\",\n summaryRegion.closing\n ? \"workspace-agent-message-center__stack-rest--closing\"\n : \"workspace-agent-message-center__stack-rest--opening\"\n )}\n onAnimationEnd={summaryRegion.onAnimationEnd}\n >\n <div\n className=\"min-h-0 min-w-0 overflow-hidden\"\n aria-hidden={summaryRegion.closing ? true : undefined}\n inert={summaryRegion.closing ? true : undefined}\n >\n <MessageCenterStackSummary\n groupId={groupId}\n items={items}\n onExpand={onExpand}\n />\n </div>\n </div>\n ) : null}\n\n {cardsRegion.mounted ? (\n <div\n className={cn(\n \"workspace-agent-message-center__stack-rest min-w-0\",\n cardsRegion.closing\n ? \"workspace-agent-message-center__stack-rest--closing\"\n : \"workspace-agent-message-center__stack-rest--opening\"\n )}\n onAnimationEnd={cardsRegion.onAnimationEnd}\n >\n <div\n className=\"min-h-0 min-w-0 overflow-hidden\"\n aria-hidden={cardsRegion.closing ? true : undefined}\n inert={cardsRegion.closing ? true : undefined}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2 px-0.5 pb-1.5\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-[13px] font-semibold leading-4 text-[var(--text-tertiary)]\">\n <MessageCenterIdentityAvatarMark\n identity={items[0]?.identity ?? null}\n provider={items[0]?.provider ?? \"\"}\n userId={items[0]?.userId ?? null}\n />\n <span className=\"min-w-0 truncate\">\n {t(\"agentHost.workspaceAgentMessageCenterStackSummaryCount\", {\n count: items.length\n })}\n </span>\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={collapseLabel}\n className=\"size-6 text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n onClick={onCollapse}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" align=\"center\">\n {collapseLabel}\n </TooltipContent>\n </Tooltip>\n </div>\n <div className=\"flex min-w-0 flex-col gap-2.5\">\n {items.map((item, stackedIndex) =>\n renderCard(item, { stackedIndex })\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MessageCenterStackSummary({\n groupId,\n items,\n onExpand\n}: {\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n onExpand: () => void;\n}): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const firstItem = items[0];\n const hasWaiting = items.some((item) => isWaitingMessageCenterItem(item));\n if (!firstItem) {\n return null;\n }\n\n return (\n <button\n type=\"button\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterExpandStackAria\", {\n count: items.length\n })}\n className={cn(\n \"group/stack-peek relative block w-full min-w-0 rounded-lg text-left outline-none focus-visible:ring-2 focus-visible:ring-[var(--accent)]\",\n items.length > 2 ? \"pb-[18px]\" : \"pb-[10px]\"\n )}\n data-stack-summary-count={items.length}\n data-stack-provider={firstItem.provider}\n data-stack-user-id={firstItem.userId ?? \"\"}\n data-testid={`workspace-agent-message-stack-summary-${groupId}`}\n onClick={onExpand}\n >\n <span\n className={cn(\n \"relative z-10 flex min-w-0 flex-col gap-2 rounded-lg border border-[var(--line-2)] bg-[var(--background-fronted)] p-3.5 transition-[background-color,border-color] duration-200 group-hover/stack-peek:bg-[var(--transparency-hover)]\",\n items.length > 2\n ? \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2),0_14px_0_-8px_var(--background-fronted),0_14px_0_-7px_var(--line-2)]\"\n : \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2)]\",\n hasWaiting &&\n \"border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)]\"\n )}\n >\n <span className=\"flex min-w-0 items-center justify-between gap-2.5\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <MessageCenterIdentityAvatarMark\n identity={firstItem.identity}\n provider={firstItem.provider}\n userId={firstItem.userId}\n />\n <span className=\"min-w-0 truncate text-[13px] font-bold leading-5 text-[var(--text-secondary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterStackSummaryCount\", {\n count: items.length\n })}\n </span>\n </span>\n <ChevronDown\n className=\"size-4 shrink-0 text-[var(--text-tertiary)] transition-transform duration-200 group-hover/stack-peek:translate-y-0.5 motion-reduce:transition-none\"\n aria-hidden=\"true\"\n />\n </span>\n <span className=\"min-w-0 rounded-md bg-transparency-block p-2.5 text-[13px] leading-[1.45] text-[var(--text-primary)]\">\n <span className=\"line-clamp-2 min-w-0 [overflow-wrap:anywhere]\">\n {messageCenterStackPreviewText(firstItem)}\n </span>\n </span>\n </span>\n </button>\n );\n}\n\nfunction messageCenterStackPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return (\n item.digest.primary.summary.trim() ||\n item.lastAgentMessageSummary.trim() ||\n normalizeAgentTitleText(item.title)\n );\n}\n\nexport function resolveMessageCenterNotificationAction(\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n }\n): string | null {\n if (input.action) {\n return normalizeMessageCenterNotificationAction(input.action);\n }\n\n if (!input.optionId) {\n return null;\n }\n\n const prompt = item.pendingPrompt;\n const option =\n prompt && \"options\" in prompt\n ? prompt.options.find((candidate) => candidate.id === input.optionId)\n : null;\n const optionToken = `${option?.kind ?? \"\"}:${input.optionId}`.toLowerCase();\n if (optionToken.includes(\"allow\") || optionToken.includes(\"accept\")) {\n return \"accept\";\n }\n if (\n optionToken.includes(\"deny\") ||\n optionToken.includes(\"reject\") ||\n optionToken.includes(\"disallow\")\n ) {\n return \"reject\";\n }\n return input.optionId;\n}\n\nexport function buildWorkspaceAgentInteractivePromptLabels(\n t: ReturnType<typeof useTranslation>[\"t\"],\n provider?: string\n) {\n return {\n approvalLead: t(\"agentHost.agentGui.approvalRequired\", {\n provider: provider\n ? workspaceAgentProviderLabel(provider)\n : t(\"agentHost.workspaceAgentsGenericAgentName\")\n }),\n planLead: t(\"agentHost.agentGui.planLead\"),\n planModes: [\n {\n id: \"acceptEdits\",\n label: t(\"agentHost.agentGui.planModes.acceptEdits.label\"),\n description: t(\"agentHost.agentGui.planModes.acceptEdits.description\")\n },\n {\n id: \"default\",\n label: t(\"agentHost.agentGui.planModes.askFirst.label\"),\n description: t(\"agentHost.agentGui.planModes.askFirst.description\")\n },\n {\n id: \"bypassPermissions\",\n label: t(\"agentHost.agentGui.planModes.allowAll.label\"),\n description: t(\"agentHost.agentGui.planModes.allowAll.description\")\n }\n ],\n stayInPlan: t(\"agentHost.agentGui.stayInPlan\"),\n sendFeedback: t(\"agentHost.agentGui.sendFeedback\"),\n feedbackPlaceholder: t(\"agentHost.agentGui.feedbackPlaceholder\"),\n previousQuestion: t(\"agentHost.agentGui.previousQuestion\"),\n nextQuestion: t(\"agentHost.agentGui.nextQuestion\"),\n submitAnswers: t(\"agentHost.agentGui.submitAnswers\"),\n answerPlaceholder: t(\"agentHost.agentGui.answerPlaceholder\"),\n waitingForAnswer: t(\"agentHost.agentGui.waitingForAnswer\"),\n planImplementationLead: t(\"agentHost.agentGui.planImplementationLead\"),\n planImplementationConfirm: t(\n \"agentHost.agentGui.planImplementationConfirm\"\n ),\n planImplementationFeedbackPlaceholder: t(\n \"agentHost.agentGui.planImplementationFeedbackPlaceholder\"\n ),\n planImplementationSend: t(\"agentHost.agentGui.planImplementationSend\"),\n planImplementationSkip: t(\"agentHost.agentGui.planImplementationSkip\")\n };\n}\n\nfunction normalizeMessageCenterNotificationAction(action: string): string {\n switch (action) {\n case \"allow\":\n return \"accept\";\n case \"deny\":\n return \"reject\";\n default:\n return action;\n }\n}\n\nfunction messageCenterVisibleSummary(\n item: WorkspaceAgentMessageCenterItem\n): string {\n const summary = item.digest.primary.summary.trim();\n if (\n item.pendingPrompt?.kind === \"approval\" &&\n isGenericApprovalSummary(summary)\n ) {\n return \"\";\n }\n return summary;\n}\n\nfunction isGenericApprovalSummary(summary: string): boolean {\n const normalized = summary.trim().toLowerCase();\n return normalized === \"approval\";\n}\n\nfunction MessageCenterSummary({\n emptyLabel,\n item,\n onLinkAction,\n summary\n}: {\n emptyLabel: string;\n item: WorkspaceAgentMessageCenterItem;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n summary: string;\n}): JSX.Element {\n \"use memo\";\n const summaryRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const handleLinkAction = useCallback(\n (action: WorkspaceLinkAction): void => {\n onLinkAction?.(\n action.type === \"open-agent-session\" && !action.provider\n ? { ...action, provider: item.provider }\n : action\n );\n },\n [item.provider, onLinkAction]\n );\n\n useLayoutEffect(() => {\n const element = summaryRef.current;\n if (!element) {\n return;\n }\n\n const updateOverflowState = () => {\n setIsOverflowing(element.scrollHeight > element.clientHeight + 1);\n };\n\n updateOverflowState();\n const resizeObserver = new ResizeObserver(updateOverflowState);\n resizeObserver.observe(element);\n return () => {\n resizeObserver.disconnect();\n };\n }, [summary]);\n\n return (\n <AgentVerticalScrollArea\n ref={summaryRef}\n className={cn(\n \"workspace-agent-message-center__summary workspace-agent-message-center__copy-text max-h-[160px] min-w-0 rounded-md bg-transparency-block text-[13px] leading-[1.45] text-[var(--text-primary)] [overflow-wrap:anywhere]\",\n isOverflowing && \"workspace-agent-message-center__summary--overflowing\"\n )}\n viewportClassName=\"workspace-agent-message-center__copy-text max-h-[160px] p-2.5 pr-4\"\n onPointerDown={stopMessageCenterTextPointerPropagation}\n scrollbarClassName=\"top-2 bottom-2 right-1.5\"\n syncKey={summary}\n >\n {summary ? (\n <AgentMessageMarkdown\n content={summary}\n className=\"[&_a]:text-[var(--tutti-purple)] [&_code]:text-[var(--text-secondary)] [&_hr]:border-t-[color-mix(in_srgb,var(--text-primary)_14%,transparent)] [&_ol]:!bg-transparent [&_p]:m-0 [&_th]:bg-[color-mix(in_srgb,var(--background-panel)_94%,var(--text-primary))] [&_th]:text-[var(--text-primary)] [&_ul]:!bg-transparent text-[var(--text-primary)]\"\n onLinkAction={handleLinkAction}\n workspaceLinkContext={{\n workspaceRoot: item.cwd || null,\n basePath: item.cwd,\n source: \"agent-markdown\"\n }}\n enableImageZoom\n />\n ) : (\n emptyLabel\n )}\n </AgentVerticalScrollArea>\n );\n}\n\nfunction MessageCenterOpenChatButton({\n alwaysVisible = false,\n item,\n label,\n onOpenChat,\n provider\n}: {\n alwaysVisible?: boolean;\n item: WorkspaceAgentMessageCenterItem;\n label: string;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n return (\n <div className=\"workspace-agent-message-center__footer flex min-w-0 items-center justify-between gap-2\">\n <MessageCenterIdentityLabel\n identity={item.identity}\n provider={provider}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"default\"\n className={cn(\n \"workspace-agent-message-center__open-chat-button h-auto gap-1.5 border-0 bg-transparent p-0 text-[var(--agent-gui-accent)] shadow-none transition-[color,opacity,visibility] hover:bg-transparent hover:text-[var(--agent-gui-accent)] focus-visible:bg-transparent focus-visible:text-[var(--agent-gui-accent)] active:bg-transparent\",\n !alwaysVisible &&\n \"invisible opacity-0 group-hover/message-card:visible group-hover/message-card:opacity-100 group-focus-within/message-card:visible group-focus-within/message-card:opacity-100\"\n )}\n onClick={() =>\n onOpenChat({\n agentSessionId: item.agentSessionId,\n provider: item.provider\n })\n }\n >\n <ExternalLink\n className=\"size-[15px]\"\n strokeWidth={2.2}\n aria-hidden=\"true\"\n />\n {label}\n </Button>\n </div>\n );\n}\n\nexport function MessageCenterIdentityLabel({\n identity,\n provider\n}: {\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n if (!identity) {\n return <AgentProviderLabel provider={provider} />;\n }\n\n const agentAvatarUrl =\n identity.agentAvatarUrl?.trim() || managedAgentRoundedIconUrl(provider);\n const title = `${identity.userName} & ${identity.agentName}`;\n\n return (\n <span\n className=\"workspace-agent-message-center__identity inline-flex min-w-0 max-w-full items-center gap-2\"\n title={title}\n >\n <MessageCenterIdentityAvatarStack\n userAvatarUrl={identity.userAvatarUrl}\n userName={identity.userName}\n agentAvatarUrl={agentAvatarUrl}\n />\n <span className=\"workspace-agent-message-center__identity-names flex min-w-0 items-center gap-1 truncate text-[var(--text-secondary)]\">\n <span className=\"min-w-0 truncate\">{identity.userName}</span>\n <span className=\"shrink-0 text-[var(--text-tertiary)]\">&</span>\n <span className=\"min-w-0 truncate\">{identity.agentName}</span>\n </span>\n </span>\n );\n}\n\nexport function MessageCenterIdentityAvatarMark({\n identity,\n provider,\n userId\n}: {\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n userId?: string | null;\n}): JSX.Element {\n \"use memo\";\n\n const userName = identity?.userName.trim() || userId?.trim() || \"\";\n if (!userName) {\n return (\n <img\n src={managedAgentRoundedIconUrl(provider)}\n alt=\"\"\n className=\"size-5 shrink-0 rounded-full\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n aria-hidden=\"true\"\n />\n );\n }\n\n return (\n <MessageCenterIdentityAvatarStack\n userAvatarUrl={identity?.userAvatarUrl}\n userName={userName}\n agentAvatarUrl={\n identity?.agentAvatarUrl?.trim() || managedAgentRoundedIconUrl(provider)\n }\n />\n );\n}\n\nexport function MessageCenterIdentityAvatarStack({\n agentAvatarUrl,\n userAvatarUrl: rawUserAvatarUrl,\n userName\n}: {\n agentAvatarUrl: string;\n userAvatarUrl?: string;\n userName: string;\n}): JSX.Element {\n \"use memo\";\n const [userAvatarFailed, setUserAvatarFailed] = useState(false);\n const userAvatarUrl = rawUserAvatarUrl?.trim() ?? \"\";\n const userImageUrl =\n userAvatarUrl.length > 0 && !userAvatarFailed\n ? userAvatarUrl\n : userAvatarPlaceholderUrl;\n\n useEffect(() => {\n setUserAvatarFailed(false);\n }, [userAvatarUrl]);\n\n return (\n <span\n className=\"workspace-agent-message-center__identity-avatar-stack inline-flex w-9 shrink-0 items-center\"\n aria-hidden=\"true\"\n >\n <span className=\"inline-flex size-5 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)] ring-2 ring-[var(--background-fronted)]\">\n <img\n src={userImageUrl}\n alt={userName}\n className=\"size-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={() => {\n setUserAvatarFailed(true);\n }}\n />\n </span>\n <span className=\"-ml-1.5 inline-flex size-5 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)] ring-2 ring-[var(--background-fronted)]\">\n <img\n src={agentAvatarUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n}\n\nfunction ProjectPathInfo({ path }: { path: string }): JSX.Element {\n \"use memo\";\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"workspace-agent-message-center__project-info-button invisible inline-flex size-5 shrink-0 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-[background-color,color,opacity,visibility] group-hover/message-card:visible group-hover/message-card:opacity-100 group-focus-within/message-card:visible group-focus-within/message-card:opacity-100 hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] focus-visible:bg-[var(--transparency-hover)] focus-visible:text-[var(--text-primary)] focus-visible:outline-none\"\n aria-label={path}\n >\n <Info className=\"size-3.5\" strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-[320px] text-[11px] [overflow-wrap:anywhere]\"\n >\n {path}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction AgentProviderLabel({ provider }: { provider: string }): JSX.Element {\n \"use memo\";\n const label = workspaceAgentProviderLabel(provider);\n\n return (\n <span className=\"workspace-agent-message-center__provider inline-flex min-w-0 max-w-full items-center gap-1.5\">\n <img\n src={managedAgentRoundedIconUrl(provider)}\n alt=\"\"\n className=\"workspace-agent-message-center__provider-icon size-5 shrink-0 rounded-full\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n aria-hidden=\"true\"\n />\n <span className=\"workspace-agent-message-center__provider-name min-w-0 truncate text-[var(--text-secondary)]\">\n {label}\n </span>\n </span>\n );\n}\n\nfunction statusClass(item: WorkspaceAgentMessageCenterItem): string {\n if (isWaitingMessageCenterItem(item)) {\n return \"waiting\";\n }\n if (item.status === \"idle\") {\n return \"completed\";\n }\n return item.status;\n}\n\nfunction messageCenterStatusTone(\n item: WorkspaceAgentMessageCenterItem\n): \"amber\" | \"blue\" | \"green\" | \"neutral\" | \"red\" {\n if (isWaitingMessageCenterItem(item)) {\n return \"amber\";\n }\n if (item.status === \"completed\" || item.status === \"idle\") {\n return \"green\";\n }\n if (item.status === \"canceled\") {\n return \"amber\";\n }\n if (item.status === \"failed\") {\n return \"red\";\n }\n if (item.status === \"working\") {\n return \"blue\";\n }\n return \"neutral\";\n}\n","import type { JSX } from \"react\";\nimport { ListFilter } from \"lucide-react\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport {\n messageCenterGroupLabel,\n type MessageCenterGroupBy,\n type MessageCenterProviderOption,\n type MessageCenterStatusFilter,\n type MessageCenterStatusOption\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport function MessageCenterViewMenu({\n filtersActive = false,\n groupBy,\n providerFilters,\n providerOptions,\n statusFilters,\n statusOptions,\n onClearFilters,\n onGroupByChange,\n onProviderToggle,\n onStatusToggle\n}: {\n filtersActive?: boolean;\n groupBy: MessageCenterGroupBy;\n providerFilters: Set<string> | null;\n providerOptions: MessageCenterProviderOption[];\n statusFilters: Set<MessageCenterStatusFilter> | null;\n statusOptions: MessageCenterStatusOption[];\n onClearFilters: () => void;\n onGroupByChange: (groupBy: MessageCenterGroupBy) => void;\n onProviderToggle: (provider: string) => void;\n onStatusToggle: (status: MessageCenterStatusFilter) => void;\n}): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterViewOptions\")}\n title={t(\"agentHost.workspaceAgentMessageCenterViewOptions\")}\n className={cn(\n \"relative size-8 shrink-0 rounded-md border bg-[var(--background-fronted)] shadow-none\",\n filtersActive\n ? \"border-[var(--border-focus)] text-[var(--accent)]\"\n : \"border-[var(--line-2)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n )}\n >\n <ListFilter className=\"size-4\" strokeWidth={2.1} aria-hidden=\"true\" />\n {filtersActive ? (\n <span\n aria-label={t(\n \"agentHost.workspaceAgentMessageCenterFilterActive\"\n )}\n className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full border border-[var(--background-panel)] bg-[var(--accent)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={8}\n className=\"min-w-[240px] p-1.5\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterGroupBy\")}\n </DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={groupBy}\n onValueChange={(value) =>\n onGroupByChange(value as MessageCenterGroupBy)\n }\n >\n {([\"priority\", \"status\", \"agent\", \"time\"] as const).map((value) => (\n <DropdownMenuRadioItem key={value} value={value}>\n {messageCenterGroupLabel(value, t)}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n\n <DropdownMenuSeparator />\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterFilterStatus\")}\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {statusOptions.map((option) => (\n <DropdownMenuCheckboxItem\n key={option.value}\n aria-label={`${option.label} ${option.count}`}\n checked={\n statusFilters === null || statusFilters.has(option.value)\n }\n onCheckedChange={() => onStatusToggle(option.value)}\n onSelect={(event) => event.preventDefault()}\n >\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n <span className=\"ml-auto text-[11px] text-[var(--text-tertiary)]\">\n {option.count}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n\n {providerOptions.length > 0 ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterFilterAgent\")}\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {providerOptions.map((option) => (\n <DropdownMenuCheckboxItem\n key={option.value}\n aria-label={`${option.label} ${option.count}`}\n checked={\n providerFilters === null ||\n providerFilters.has(option.value)\n }\n onCheckedChange={() => onProviderToggle(option.value)}\n onSelect={(event) => event.preventDefault()}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {option.label}\n </span>\n <span className=\"ml-auto text-[11px] text-[var(--text-tertiary)]\">\n {option.count}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n </>\n ) : null}\n\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onClearFilters}>\n {t(\"agentHost.workspaceAgentMessageCenterClearFilters\")}\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { TranslateFn } from \"../i18n/index\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem,\n type WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport type MessageCenterGroupBy = \"priority\" | \"status\" | \"agent\" | \"time\";\nexport type MessageCenterStatusFilter =\n | \"waiting\"\n | \"working\"\n | \"completed\"\n | \"failed\";\n\nexport type MessageCenterTranslate = TranslateFn;\n\nexport interface MessageCenterStatusOption {\n count: number;\n label: string;\n value: MessageCenterStatusFilter;\n}\n\nexport interface MessageCenterProviderOption {\n count: number;\n label: string;\n value: string;\n}\n\nexport interface MessageCenterGroup {\n id: string;\n identity?: WorkspaceAgentMessageCenterIdentity | null;\n label: string;\n items: WorkspaceAgentMessageCenterItem[];\n provider?: string;\n userId?: string | null;\n}\n\nexport interface MessageCenterAgentUserStack {\n id: string;\n provider: string;\n userId: string | null;\n items: WorkspaceAgentMessageCenterItem[];\n}\n\nexport function partitionMessageCenterItemsByAgentUser(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): MessageCenterAgentUserStack[] {\n const stacks = new Map<string, MessageCenterAgentUserStack>();\n for (const item of items) {\n const stackId = messageCenterAgentUserStackId(item);\n const stack = stacks.get(stackId);\n if (stack) {\n stack.items.push(item);\n } else {\n stacks.set(stackId, {\n id: stackId,\n provider: item.provider,\n userId: item.userId,\n items: [item]\n });\n }\n }\n return [...stacks.values()];\n}\n\nexport function messageCenterAgentUserStackId(\n item: Pick<WorkspaceAgentMessageCenterItem, \"provider\" | \"userId\">\n): string {\n const provider = item.provider.trim().toLowerCase() || \"unknown-agent\";\n const userId = item.userId?.trim() || \"unknown-user\";\n return `agent-user:${provider}:${userId}`;\n}\n\nexport function buildMessageCenterStatusOptions(\n counts: WorkspaceAgentMessageCenterModel[\"counts\"],\n t: MessageCenterTranslate\n): MessageCenterStatusOption[] {\n return [\n {\n count: counts.waiting,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWaiting\"),\n value: \"waiting\"\n },\n {\n count: counts.failed,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterFailed\"),\n value: \"failed\"\n },\n {\n count: counts.working,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n value: \"working\"\n },\n {\n count: counts.completed,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n value: \"completed\"\n }\n ];\n}\n\nexport function buildMessageCenterProviderOptions(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): MessageCenterProviderOption[] {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.provider, (counts.get(item.provider) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([value, count]) => ({\n count,\n label: workspaceAgentProviderLabel(value),\n value\n }))\n .sort((left, right) => left.label.localeCompare(right.label));\n}\n\nexport function itemMatchesViewFilters({\n item,\n providerFilters,\n statusFilters\n}: {\n item: WorkspaceAgentMessageCenterItem;\n providerFilters: Set<string> | null;\n statusFilters: Set<MessageCenterStatusFilter> | null;\n}): boolean {\n if (\n statusFilters &&\n !statusFilters.has(messageCenterStatusFilterValue(item))\n ) {\n return false;\n }\n if (providerFilters && !providerFilters.has(item.provider)) {\n return false;\n }\n return true;\n}\n\nexport function messageCenterStatusFilterValue(\n item: WorkspaceAgentMessageCenterItem\n): MessageCenterStatusFilter {\n if (isWaitingMessageCenterItem(item)) {\n return \"waiting\";\n }\n if (item.status === \"failed\") {\n return \"failed\";\n }\n if (item.status === \"working\") {\n return \"working\";\n }\n return \"completed\";\n}\n\nexport function groupMessageCenterItems(\n items: readonly WorkspaceAgentMessageCenterItem[],\n groupBy: MessageCenterGroupBy,\n t: MessageCenterTranslate\n): MessageCenterGroup[] {\n switch (groupBy) {\n case \"status\":\n return groupByFixedDefinitions(items, [\n {\n id: \"waiting\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWaiting\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"waiting\"\n },\n {\n id: \"failed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterFailed\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"failed\"\n },\n {\n id: \"working\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"working\"\n },\n {\n id: \"completed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"completed\"\n }\n ]);\n case \"agent\":\n return groupByDynamicKey(items, (item) => ({\n id: messageCenterAgentUserStackId(item),\n identity: item.identity,\n label: messageCenterAgentUserGroupLabel(item),\n provider: item.provider,\n userId: item.userId\n }));\n case \"time\":\n return groupByFixedDefinitions(items, [\n {\n id: \"today\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupToday\"),\n match: (item) => messageCenterTimeGroup(item) === \"today\"\n },\n {\n id: \"yesterday\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupYesterday\"),\n match: (item) => messageCenterTimeGroup(item) === \"yesterday\"\n },\n {\n id: \"previous-seven-days\",\n label: t(\n \"agentHost.workspaceAgentMessageCenterGroupPreviousSevenDays\"\n ),\n match: (item) =>\n messageCenterTimeGroup(item) === \"previous-seven-days\"\n },\n {\n id: \"older\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupOlder\"),\n match: (item) => messageCenterTimeGroup(item) === \"older\"\n }\n ]);\n case \"priority\":\n default: {\n const nowUnixMs = Date.now();\n return groupByFixedDefinitions(items, [\n {\n id: \"needs-attention\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\"),\n match: (item) =>\n messageCenterStatusFilterValue(item) === \"waiting\" ||\n messageCenterStatusFilterValue(item) === \"failed\"\n },\n {\n id: \"working\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"working\"\n },\n {\n id: \"recently-completed\",\n label: t(\n \"agentHost.workspaceAgentMessageCenterGroupRecentlyCompleted\"\n ),\n match: (item) => isRecentlyCompletedMessageCenterItem(item, nowUnixMs)\n },\n {\n id: \"completed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n match: (item) =>\n messageCenterStatusFilterValue(item) === \"completed\" &&\n !isRecentlyCompletedMessageCenterItem(item, nowUnixMs)\n }\n ]);\n }\n }\n}\n\nfunction messageCenterAgentUserGroupLabel(\n item: WorkspaceAgentMessageCenterItem\n): string {\n if (item.identity) {\n return `${item.identity.userName} & ${item.identity.agentName}`;\n }\n return workspaceAgentProviderLabel(item.provider);\n}\n\nconst RECENTLY_COMPLETED_WINDOW_MS = 10 * 60 * 1000;\n\nexport function isRecentlyCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem,\n nowUnixMs: number\n): boolean {\n if (messageCenterStatusFilterValue(item) !== \"completed\") {\n return false;\n }\n const completedAtUnixMs =\n item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n if (completedAtUnixMs <= 0) {\n return false;\n }\n return completedAtUnixMs >= nowUnixMs - RECENTLY_COMPLETED_WINDOW_MS;\n}\n\nexport function messageCenterGroupLabel(\n groupBy: MessageCenterGroupBy,\n t: MessageCenterTranslate\n): string {\n switch (groupBy) {\n case \"status\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupStatus\");\n case \"agent\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupAgent\");\n case \"time\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupTime\");\n case \"priority\":\n default:\n return t(\"agentHost.workspaceAgentMessageCenterGroupPriority\");\n }\n}\n\nexport function statusFilterSummary(\n statusFilters: Set<MessageCenterStatusFilter> | null,\n statusOptions: readonly MessageCenterStatusOption[]\n): string {\n if (statusFilters === null || statusFilters.size === statusOptions.length) {\n return statusOptions.map((option) => option.label).join(\", \");\n }\n return statusOptions\n .filter((option) => statusFilters.has(option.value))\n .map((option) => option.label)\n .join(\", \");\n}\n\nfunction groupByFixedDefinitions(\n items: readonly WorkspaceAgentMessageCenterItem[],\n definitions: Array<{\n id: string;\n label: string;\n match: (item: WorkspaceAgentMessageCenterItem) => boolean;\n }>\n): MessageCenterGroup[] {\n return definitions\n .map((definition) => ({\n id: definition.id,\n label: definition.label,\n items: items.filter(definition.match)\n }))\n .filter((group) => group.items.length > 0);\n}\n\nfunction groupByDynamicKey(\n items: readonly WorkspaceAgentMessageCenterItem[],\n keyForItem: (item: WorkspaceAgentMessageCenterItem) => {\n id: string;\n identity?: WorkspaceAgentMessageCenterIdentity | null;\n label: string;\n provider?: string;\n userId?: string | null;\n }\n): MessageCenterGroup[] {\n const groups = new Map<string, MessageCenterGroup>();\n for (const item of items) {\n const key = keyForItem(item);\n const group = groups.get(key.id);\n if (group) {\n group.items.push(item);\n if (!group.identity && key.identity) {\n group.identity = key.identity;\n group.label = key.label;\n }\n } else {\n groups.set(key.id, { ...key, items: [item] });\n }\n }\n return [...groups.values()];\n}\n\nfunction messageCenterTimeGroup(\n item: WorkspaceAgentMessageCenterItem\n): \"older\" | \"previous-seven-days\" | \"today\" | \"yesterday\" {\n const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n if (timestamp <= 0) {\n return \"older\";\n }\n const ageMs = Date.now() - timestamp;\n const dayMs = 24 * 60 * 60 * 1000;\n if (ageMs < dayMs) {\n return \"today\";\n }\n if (ageMs < dayMs * 2) {\n return \"yesterday\";\n }\n if (ageMs < dayMs * 7) {\n return \"previous-seven-days\";\n }\n return \"older\";\n}\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","cn","AgentVerticalScrollArea","latestAgentMessage","recordValue","stringValue","firstNonEmptyString","messageTimeUnixMs","includesAny","isAgentMessageRole","positiveNumber","useEffect","useRef","useState","cn","cn","jsx","cn","jsx","jsxs","useRef","useState","useEffect","cn","Button","cn","jsx","jsxs","Button","cn","jsx","jsxs","WorkspaceAgentMessageCenterPanel","useState","useRef","useMemo","useCallback","useLayoutEffect","useEffect","cn","Button"]}
|
|
1
|
+
{"version":3,"sources":["../../agent-message-center/WorkspaceAgentMessageCenterPanel.tsx","../../shared/AgentVerticalScrollArea.tsx","../../agent-message-center/workspaceAgentMessageCenterModel.ts","../../agent-message-center/workspaceAgentMessageCenterDigest.ts","../../agent-message-center/WorkspaceAgentMessageCenterAttentionDeck.tsx","../../agent-message-center/WorkspaceAgentMessageCenterCard.tsx","../../agent-message-center/WorkspaceAgentMessageCenterViewControls.tsx","../../agent-message-center/workspaceAgentMessageCenterViewModel.ts"],"sourcesContent":["import {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type JSX\n} from \"react\";\nimport {\n Button,\n cn,\n Drawer,\n DrawerContent,\n TooltipProvider\n} from \"@tutti-os/ui-system\";\nimport type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport {\n AgentGuiI18nProvider,\n useTranslation,\n type AgentGuiI18nLocale\n} from \"../i18n/index\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isInteractiveMessageCenterItem,\n selectMessageCenterAttentionDeckItems,\n type WorkspaceAgentMessageCenterItem,\n type WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\nimport { WorkspaceAgentMessageCenterAttentionDeck } from \"./WorkspaceAgentMessageCenterAttentionDeck\";\nimport { MessageCenterViewMenu } from \"./WorkspaceAgentMessageCenterViewControls\";\nimport {\n MessageCenterIdentityAvatarMark,\n MessageCenterIdentityLabel,\n resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport {\n buildMessageCenterProviderOptions,\n buildMessageCenterStatusOptions,\n groupMessageCenterItems,\n itemMatchesViewFilters,\n partitionMessageCenterItemsByAgentUser,\n statusFilterSummary,\n type MessageCenterGroupBy,\n type MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport {\n buildWorkspaceAgentInteractivePromptLabels,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nexport type { WorkspaceAgentMessageCenterCardProps } from \"./WorkspaceAgentMessageCenterCard\";\n\nconst MESSAGE_CENTER_TOOLTIP_DELAY_MS = 300;\n\nexport interface WorkspaceAgentMessageCenterPanelProps {\n i18n?: I18nRuntime<string> | null;\n locale?: AgentGuiI18nLocale;\n open: boolean;\n model: WorkspaceAgentMessageCenterModel;\n highlightedItemId?: string | null;\n portalContainer?: HTMLElement | null;\n onClose: () => void;\n onHighlightedItemSettled?: (itemId: string) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onNotificationActioned?: (input: {\n action: string;\n provider: string;\n }) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (input: {\n action?: string;\n agentSessionId: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n promptKind?: string;\n requestId: string;\n }) => Promise<void> | void;\n}\n\nexport const WorkspaceAgentMessageCenterPanel = memo(\n function WorkspaceAgentMessageCenterPanel({\n open,\n i18n,\n locale,\n model,\n highlightedItemId = null,\n portalContainer = null,\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n onSubmitPrompt\n }: WorkspaceAgentMessageCenterPanelProps): JSX.Element | null {\n \"use memo\";\n return (\n <AgentGuiI18nProvider runtime={i18n} locale={locale}>\n <WorkspaceAgentMessageCenterPanelContent\n open={open}\n model={model}\n highlightedItemId={highlightedItemId}\n portalContainer={portalContainer}\n onClose={onClose}\n onHighlightedItemSettled={onHighlightedItemSettled}\n onLinkAction={onLinkAction}\n onNotificationActioned={onNotificationActioned}\n onOpenChat={onOpenChat}\n onSubmitPrompt={onSubmitPrompt}\n />\n </AgentGuiI18nProvider>\n );\n }\n);\n\nfunction WorkspaceAgentMessageCenterPanelContent({\n open,\n model,\n highlightedItemId = null,\n portalContainer = null,\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n onSubmitPrompt\n}: Omit<\n WorkspaceAgentMessageCenterPanelProps,\n \"i18n\" | \"locale\"\n>): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const [groupBy, setGroupBy] = useState<MessageCenterGroupBy>(\"priority\");\n const [statusFilters, setStatusFilters] =\n useState<Set<MessageCenterStatusFilter> | null>(null);\n const [providerFilters, setProviderFilters] = useState<Set<string> | null>(\n null\n );\n const [expandedStackIds, setExpandedStackIds] = useState<Set<string>>(\n () => new Set()\n );\n const [submittingPromptKey, setSubmittingPromptKey] = useState<string | null>(\n null\n );\n const itemNodesRef = useRef<Map<string, HTMLElement>>(new Map());\n const lastScrolledHighlightedItemIdRef = useRef<string | null>(null);\n const lastFilterResetHighlightedItemIdRef = useRef<string | null>(null);\n const statusOptions = useMemo(\n () => buildMessageCenterStatusOptions(model.counts, t),\n [model.counts, t]\n );\n const providerOptions = useMemo(\n () => buildMessageCenterProviderOptions(model.items),\n [model.items]\n );\n const visibleItems = useMemo(\n () =>\n model.items.filter((item) =>\n itemMatchesViewFilters({\n item,\n providerFilters,\n statusFilters\n })\n ),\n [model.items, providerFilters, statusFilters]\n );\n const deckItems = useMemo(\n () => selectMessageCenterAttentionDeckItems(visibleItems),\n [visibleItems]\n );\n const listItems = useMemo(\n () => visibleItems.filter((item) => !isInteractiveMessageCenterItem(item)),\n [visibleItems]\n );\n const itemGroups = useMemo(\n () => groupMessageCenterItems(listItems, groupBy, t),\n [groupBy, t, listItems]\n );\n const highlightedItem = useMemo(\n () =>\n highlightedItemId\n ? (model.items.find((item) => item.id === highlightedItemId) ?? null)\n : null,\n [highlightedItemId, model.items]\n );\n const activeStatusSummary = statusFilterSummary(statusFilters, statusOptions);\n const hasActiveFilters = statusFilters !== null || providerFilters !== null;\n const headerSummary = useMemo(() => {\n if (hasActiveFilters) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryFiltered\", {\n count: visibleItems.length,\n total: model.counts.all\n });\n }\n if (model.counts.waiting > 0) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryWaiting\", {\n count: model.counts.all,\n waiting: model.counts.waiting\n });\n }\n if (model.counts.completed > 0) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryCompleted\", {\n count: model.counts.all,\n completed: model.counts.completed\n });\n }\n return t(\"agentHost.workspaceAgentMessageCenterSummaryCount\", {\n count: model.counts.all\n });\n }, [\n hasActiveFilters,\n model.counts.all,\n model.counts.completed,\n model.counts.waiting,\n t,\n visibleItems.length\n ]);\n\n const submitPrompt = useCallback(\n async (\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }\n ) => {\n const promptKey = `${item.agentSessionId}:${input.requestId}`;\n setSubmittingPromptKey(promptKey);\n try {\n const notificationAction = resolveMessageCenterNotificationAction(\n item,\n input\n );\n if (notificationAction) {\n onNotificationActioned?.({\n action: notificationAction,\n provider: item.provider\n });\n }\n await onSubmitPrompt({\n ...input,\n agentSessionId: item.agentSessionId,\n promptKind: item.pendingPrompt?.kind\n });\n } finally {\n setSubmittingPromptKey((current) =>\n current === promptKey ? null : current\n );\n }\n },\n [onNotificationActioned, onSubmitPrompt]\n );\n const setItemNode = useCallback(\n (itemId: string, node: HTMLElement | null) => {\n if (node) {\n itemNodesRef.current.set(itemId, node);\n } else {\n itemNodesRef.current.delete(itemId);\n }\n },\n []\n );\n const toggleStatusFilter = useCallback(\n (status: MessageCenterStatusFilter) => {\n setStatusFilters((current) => {\n const next = new Set(\n current ?? statusOptions.map((option) => option.value)\n );\n if (next.has(status)) {\n next.delete(status);\n } else {\n next.add(status);\n }\n return next.size === statusOptions.length ? null : next;\n });\n },\n [statusOptions]\n );\n const toggleProviderFilter = useCallback(\n (provider: string) => {\n setProviderFilters((current) => {\n const next = new Set(\n current ?? providerOptions.map((option) => option.value)\n );\n if (next.has(provider)) {\n next.delete(provider);\n } else {\n next.add(provider);\n }\n return next.size === providerOptions.length ? null : next;\n });\n },\n [providerOptions]\n );\n const clearFilters = useCallback(() => {\n setStatusFilters(null);\n setProviderFilters(null);\n }, []);\n const expandStack = useCallback((groupId: string) => {\n setExpandedStackIds((current) => {\n if (current.has(groupId)) {\n return current;\n }\n const next = new Set(current);\n next.add(groupId);\n return next;\n });\n }, []);\n const collapseStack = useCallback((groupId: string) => {\n setExpandedStackIds((current) => {\n if (!current.has(groupId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(groupId);\n return next;\n });\n }, []);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItem) {\n return;\n }\n if (lastFilterResetHighlightedItemIdRef.current === highlightedItem.id) {\n return;\n }\n if (\n itemMatchesViewFilters({\n item: highlightedItem,\n providerFilters,\n statusFilters\n })\n ) {\n return;\n }\n lastFilterResetHighlightedItemIdRef.current = highlightedItem.id;\n setStatusFilters(null);\n setProviderFilters(null);\n }, [highlightedItem, open, providerFilters, statusFilters]);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItemId) {\n return;\n }\n for (const group of itemGroups) {\n for (const stack of partitionMessageCenterItemsByAgentUser(group.items)) {\n if (\n stack.items.length > 1 &&\n stack.items.some((item) => item.id === highlightedItemId)\n ) {\n expandStack(`${group.id}:${stack.id}`);\n return;\n }\n }\n }\n }, [expandStack, highlightedItemId, itemGroups, open]);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItemId) {\n lastScrolledHighlightedItemIdRef.current = null;\n return;\n }\n if (\n highlightedItem &&\n !itemMatchesViewFilters({\n item: highlightedItem,\n providerFilters,\n statusFilters\n })\n ) {\n return;\n }\n if (lastScrolledHighlightedItemIdRef.current === highlightedItemId) {\n return;\n }\n const target = itemNodesRef.current.get(highlightedItemId);\n if (!target) {\n return;\n }\n lastScrolledHighlightedItemIdRef.current = highlightedItemId;\n target.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n target.focus({ preventScroll: true });\n }, [\n expandedStackIds,\n highlightedItem,\n highlightedItemId,\n open,\n providerFilters,\n statusFilters,\n visibleItems\n ]);\n\n useEffect(() => {\n if (!open || !highlightedItemId) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n onHighlightedItemSettled?.(highlightedItemId);\n }, 3200);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [highlightedItemId, onHighlightedItemSettled, open]);\n\n return (\n <Drawer\n open={open}\n direction=\"right\"\n handleOnly\n onOpenChange={(nextOpen: boolean) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DrawerContent\n className={cn(\n \"t-modal nodrag min-h-0 w-[min(440px,calc(100vw-16px))] max-w-none overflow-hidden rounded-none border-y-0 border-r-0 bg-[var(--background-panel)] text-[var(--text-primary)] shadow-side-panel data-[vaul-drawer-direction=right]:rounded-none\",\n \"[-webkit-app-region:no-drag]\"\n )}\n data-testid=\"workspace-agent-message-center\"\n portalContainer={portalContainer ?? undefined}\n showOverlay={false}\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n >\n <TooltipProvider delayDuration={MESSAGE_CENTER_TOOLTIP_DELAY_MS}>\n <div className=\"flex-none border-b border-[var(--border-1)] px-3.5 pt-3 pb-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n </div>\n <div className=\"truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </div>\n </div>\n <MessageCenterViewMenu\n filtersActive={hasActiveFilters}\n groupBy={groupBy}\n providerFilters={providerFilters}\n providerOptions={providerOptions}\n statusFilters={statusFilters}\n statusOptions={statusOptions}\n onClearFilters={clearFilters}\n onGroupByChange={setGroupBy}\n onProviderToggle={toggleProviderFilter}\n onStatusToggle={toggleStatusFilter}\n />\n </div>\n </div>\n\n <AgentVerticalScrollArea\n className=\"min-h-0 flex-1\"\n viewportClassName=\"flex h-full w-full flex-col px-3.5 pt-4 pb-4\"\n scrollbarClassName=\"top-4 bottom-4\"\n syncKey={`${groupBy}:${activeStatusSummary}:${[...deckItems, ...visibleItems].map((item) => item.id).join(\"|\")}`}\n >\n {deckItems.length > 0 || listItems.length > 0 ? (\n <div className=\"flex w-full min-w-0 flex-col gap-4\">\n {deckItems.length > 0 ? (\n <WorkspaceAgentMessageCenterAttentionDeck\n items={deckItems}\n highlightedItemId={highlightedItemId}\n submittingPromptKey={submittingPromptKey}\n registerNode={setItemNode}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(item, input) =>\n void submitPrompt(item, input)\n }\n />\n ) : null}\n {itemGroups.map((group) => (\n <section\n key={group.id}\n className=\"flex min-w-0 flex-col gap-2.5\"\n aria-label={`${group.label} ${group.items.length}`}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3 px-0.5\">\n <MessageCenterGroupHeading group={group} />\n </div>\n {(() => {\n const renderCard = (\n item: WorkspaceAgentMessageCenterItem,\n options: { stackedIndex?: number } = {}\n ) => {\n const highlighted = item.id === highlightedItemId;\n const card = (\n <MessageCenterCard\n key={item.agentSessionId}\n cardRef={(node) => setItemNode(item.id, node)}\n highlighted={highlighted}\n item={item}\n isSubmitting={\n submittingPromptKey ===\n `${item.agentSessionId}:${item.pendingPrompt?.requestId}`\n }\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(input) =>\n void submitPrompt(item, input)\n }\n />\n );\n\n if (options.stackedIndex === undefined) {\n return card;\n }\n\n return (\n <div\n key={item.agentSessionId}\n className=\"min-w-0 motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 motion-safe:duration-200 motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\"\n style={{\n animationDelay: `${Math.min(options.stackedIndex * 24, 96)}ms`\n }}\n >\n {card}\n </div>\n );\n };\n\n return partitionMessageCenterItemsByAgentUser(\n group.items\n ).map((stack) => {\n const firstItem = stack.items[0];\n if (!firstItem) {\n return null;\n }\n if (stack.items.length === 1) {\n return renderCard(firstItem);\n }\n const stackId =\n group.id === stack.id\n ? stack.id\n : `${group.id}:${stack.id}`;\n return (\n <MessageCenterStack\n key={stackId}\n expanded={expandedStackIds.has(stackId)}\n groupId={stackId}\n items={stack.items}\n renderCard={renderCard}\n onCollapse={() => collapseStack(stackId)}\n onExpand={() => expandStack(stackId)}\n />\n );\n });\n })()}\n </section>\n ))}\n </div>\n ) : model.items.length > 0 ? (\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-2.5 px-6 py-8 text-center text-[13px] text-[var(--text-tertiary)]\">\n <span>\n {t(\"agentHost.workspaceAgentMessageCenterFilteredEmpty\")}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"border border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n onClick={clearFilters}\n >\n {t(\"agentHost.workspaceAgentMessageCenterClearFilters\")}\n </Button>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center px-6 py-8 text-center text-[13px] text-[var(--text-tertiary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterEmpty\")}\n </div>\n )}\n </AgentVerticalScrollArea>\n </TooltipProvider>\n </DrawerContent>\n </Drawer>\n );\n}\n\nconst MessageCenterCard = WorkspaceAgentMessageCenterCard;\nconst MessageCenterStack = WorkspaceAgentMessageCenterStack;\n\nfunction MessageCenterGroupHeading({\n group\n}: {\n group: ReturnType<typeof groupMessageCenterItems>[number];\n}): JSX.Element {\n \"use memo\";\n\n if (group.provider) {\n return (\n <h3\n aria-label={`${group.label} · ${group.items.length}`}\n className=\"flex min-w-0 items-center gap-1.5 text-[11px] font-normal leading-4 text-[var(--text-tertiary)]\"\n title={`${group.label} · ${group.items.length}`}\n >\n {group.identity ? (\n <MessageCenterIdentityLabel\n identity={group.identity}\n provider={group.provider}\n />\n ) : (\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <MessageCenterIdentityAvatarMark\n identity={null}\n provider={group.provider}\n userId={group.userId ?? null}\n />\n <span className=\"min-w-0 truncate\">{group.label}</span>\n </span>\n )}\n <span className=\"shrink-0\">· {group.items.length}</span>\n </h3>\n );\n }\n\n return (\n <h3 className=\"truncate text-[11px] font-normal leading-4 text-[var(--text-tertiary)]\">\n {group.label} · {group.items.length}\n </h3>\n );\n}\n","import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type JSX\n} from \"react\";\nimport { CustomScrollArea } from \"../app/renderer/components/ui/custom-scroll-area\";\nimport { cn } from \"../app/renderer/lib/utils\";\n\nexport interface AgentVerticalScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n viewportClassName?: string;\n scrollbarClassName?: string;\n scrollbarThumbClassName?: string;\n syncKey?: unknown;\n}\n\nexport const AgentVerticalScrollArea = forwardRef<\n HTMLDivElement,\n AgentVerticalScrollAreaProps\n>(function AgentVerticalScrollArea(\n {\n children,\n className,\n viewportClassName,\n scrollbarClassName,\n scrollbarThumbClassName,\n syncKey,\n ...props\n },\n forwardedRef\n): JSX.Element {\n \"use memo\";\n return (\n <CustomScrollArea\n ref={forwardedRef}\n className={cn(\"agent-vertical-scroll-area min-h-0 min-w-0\", className)}\n viewportClassName={cn(\n \"min-h-0 min-w-0 overflow-x-hidden overflow-y-auto\",\n viewportClassName\n )}\n scrollbarClassName={cn(\n \"agent-vertical-scroll-area__scrollbar top-2 right-2 bottom-2\",\n scrollbarClassName\n )}\n scrollbarThumbClassName={cn(\n \"agent-vertical-scroll-area__scrollbar-thumb\",\n scrollbarThumbClassName\n )}\n syncKey={syncKey ?? children}\n {...props}\n >\n {children}\n </CustomScrollArea>\n );\n});\n","import {\n selectNeedsAttentionItems,\n selectSessionDisplayStatuses,\n type AgentActivityMessage,\n type AgentActivityNeedsAttentionItem,\n type AgentActivitySession,\n type AgentActivitySnapshot\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport { normalizeAskUserQuestions } from \"../shared/agentConversation/askUserQuestions\";\nimport { extractAgentMcpToolTarget } from \"../shared/agentMcpToolTarget\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"../shared/workspaceAgentSessionSortTime\";\nimport {\n latestPlanTurnId,\n planImplementationPromptFromPlanTurn\n} from \"../shared/agentConversation/planImplementation\";\nimport {\n buildWorkspaceAgentMessageCenterDigest,\n type WorkspaceAgentMessageCenterDigest\n} from \"./workspaceAgentMessageCenterDigest\";\n\nexport interface WorkspaceAgentMessageCenterModel {\n waitingCount: number;\n items: WorkspaceAgentMessageCenterItem[];\n counts: WorkspaceAgentMessageCenterCounts;\n}\n\nexport interface WorkspaceAgentMessageCenterCounts {\n all: number;\n working: number;\n waiting: number;\n completed: number;\n failed: number;\n}\n\nexport interface WorkspaceAgentMessageCenterItem {\n id: string;\n agentSessionId: string;\n provider: string;\n userId: string | null;\n title: string;\n identity: WorkspaceAgentMessageCenterIdentity | null;\n cwd: string;\n status: WorkspaceAgentActivityStatus;\n digest: WorkspaceAgentMessageCenterDigest;\n lastAgentMessageSummary: string;\n lastAgentMessageAtUnixMs: number | null;\n pendingPrompt: AgentConversationPromptVM | null;\n needsAttentionKind: AgentActivityNeedsAttentionItem[\"kind\"] | null;\n needsAttentionSummary: string | null;\n latestTurnOutcome?: WorkspaceAgentMessageCenterTurnOutcome | null;\n sortTimeUnixMs: number;\n}\n\nexport interface WorkspaceAgentMessageCenterTurnOutcome {\n notificationKey: string;\n status: \"completed\" | \"failed\";\n turnId: string | null;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterOptions {\n avoidGroupingEdits?: boolean;\n identityBySessionId?: Record<string, WorkspaceAgentMessageCenterIdentity>;\n promptFallbackLabels?: WorkspaceAgentMessageCenterPromptFallbackLabels;\n workspaceRoot?: string | null;\n}\n\nexport interface WorkspaceAgentMessageCenterIdentity {\n userName: string;\n userAvatarUrl?: string;\n agentName: string;\n agentAvatarUrl?: string;\n}\n\nexport interface WorkspaceAgentMessageCenterPromptFallbackLabels {\n constraintHeader: string;\n inputHeader: string;\n question: string;\n title: string;\n}\n\nconst EMPTY_COUNTS: WorkspaceAgentMessageCenterCounts = {\n all: 0,\n working: 0,\n waiting: 0,\n completed: 0,\n failed: 0\n};\n\nexport function buildWorkspaceAgentMessageCenterModel(\n snapshot: AgentActivitySnapshot,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentMessageCenterModel {\n const needsAttentionBySessionId = latestNeedsAttentionBySessionId(\n selectNeedsAttentionItems(snapshot)\n );\n const displayStatuses = selectSessionDisplayStatuses(snapshot);\n const items = snapshot.sessions\n .filter((session) => session.visible !== false)\n .map((session) => {\n const messages = resolveSessionMessages(snapshot, session);\n const needsAttention =\n needsAttentionBySessionId.get(session.agentSessionId) ?? null;\n const status = displayStatuses.get(session.agentSessionId) ?? \"idle\";\n const lastAgentMessage = latestAgentMessage(messages);\n const title = resolveSessionTitle(session, messages);\n const pendingPrompt =\n pendingPromptFromMessages(messages) ??\n codexPlanImplementationPrompt(session, status, messages) ??\n fallbackPromptFromNeedsAttention(\n needsAttention,\n options.promptFallbackLabels\n );\n const digest = buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle: resolveDigestFallbackTitle(session),\n messages,\n needsAttention,\n pendingPrompt,\n status\n });\n const sortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(\n session,\n {\n messages\n }\n );\n\n return {\n id: `message-center-${session.agentSessionId}`,\n agentSessionId: session.agentSessionId,\n provider: session.provider,\n userId: session.userId?.trim() || null,\n title,\n identity: resolveMessageCenterIdentity(\n session.agentSessionId,\n options.identityBySessionId\n ),\n cwd: session.cwd,\n status,\n digest,\n lastAgentMessageSummary:\n lastAgentMessage?.summary ?? needsAttention?.summary ?? title,\n lastAgentMessageAtUnixMs: lastAgentMessage?.occurredAtUnixMs ?? null,\n pendingPrompt,\n needsAttentionKind: needsAttention?.kind ?? null,\n needsAttentionSummary: needsAttention?.summary ?? null,\n latestTurnOutcome: latestTurnOutcome(session.agentSessionId, messages),\n sortTimeUnixMs\n } satisfies WorkspaceAgentMessageCenterItem;\n });\n\n return {\n waitingCount: items.filter(isWaitingMessageCenterItem).length,\n items: items.sort(compareMessageCenterItems),\n counts: countMessageCenterItems(items)\n };\n}\n\nfunction resolveMessageCenterIdentity(\n agentSessionId: string,\n identityBySessionId:\n | Record<string, WorkspaceAgentMessageCenterIdentity>\n | undefined\n): WorkspaceAgentMessageCenterIdentity | null {\n const identity = identityBySessionId?.[agentSessionId];\n if (!identity) {\n return null;\n }\n const userName = identity.userName.trim();\n const agentName = identity.agentName.trim();\n if (!userName || !agentName) {\n return null;\n }\n const userAvatarUrl = identity.userAvatarUrl?.trim() ?? \"\";\n const agentAvatarUrl = identity.agentAvatarUrl?.trim() ?? \"\";\n return {\n userName,\n ...(userAvatarUrl ? { userAvatarUrl } : {}),\n agentName,\n ...(agentAvatarUrl ? { agentAvatarUrl } : {})\n };\n}\n\nexport function isWaitingMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null || item.needsAttentionKind !== null;\n}\n\nexport function isInteractiveMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null;\n}\n\nexport function selectMessageCenterAttentionDeckItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterItem[] {\n return items.filter(isInteractiveMessageCenterItem);\n}\n\nexport function isCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n item.status === \"completed\" ||\n item.status === \"canceled\" ||\n item.status === \"idle\"\n );\n}\n\nfunction latestNeedsAttentionBySessionId(\n items: readonly AgentActivityNeedsAttentionItem[]\n): Map<string, AgentActivityNeedsAttentionItem> {\n const bySessionId = new Map<string, AgentActivityNeedsAttentionItem>();\n for (const item of items) {\n const previous = bySessionId.get(item.agentSessionId);\n if (!previous || item.occurredAtUnixMs > previous.occurredAtUnixMs) {\n bySessionId.set(item.agentSessionId, item);\n }\n }\n return bySessionId;\n}\n\nfunction resolveSessionMessages(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): AgentActivityMessage[] {\n for (const sessionId of [session.agentSessionId, session.providerSessionId]) {\n const normalized = sessionId?.trim() ?? \"\";\n if (normalized && snapshot.sessionMessagesById[normalized]) {\n return snapshot.sessionMessagesById[normalized];\n }\n }\n return [];\n}\n\nfunction resolveSessionTitle(\n session: AgentActivitySession,\n messages: readonly AgentActivityMessage[]\n): string {\n const title = session.title.trim();\n if (title) {\n return title;\n }\n return (\n firstUserMessageText(messages) || session.provider || session.agentSessionId\n );\n}\n\nfunction resolveDigestFallbackTitle(session: AgentActivitySession): string {\n return session.title.trim() || session.provider || session.agentSessionId;\n}\n\nfunction firstUserMessageText(\n messages: readonly AgentActivityMessage[]\n): string {\n for (const message of messages) {\n if (message.role.trim().toLowerCase() !== \"user\") {\n continue;\n }\n const summary = messageSummary(message);\n if (summary) {\n return summary;\n }\n }\n return \"\";\n}\n\nfunction pendingPromptFromMessages(\n messages: readonly AgentActivityMessage[]\n): AgentConversationPromptVM | null {\n for (const message of [...messages].sort(compareMessagesByRecentTime)) {\n if (isTerminalMessageStatus(message.status)) {\n continue;\n }\n const approval = approvalPromptFromMessage(message);\n if (approval) {\n return approval;\n }\n const askUser = askUserPromptFromMessage(message);\n if (askUser) {\n return askUser;\n }\n const exitPlan = exitPlanPromptFromMessage(message);\n if (exitPlan) {\n return exitPlan;\n }\n }\n return null;\n}\n\nfunction approvalPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!isPermissionMessage(message)) {\n return null;\n }\n const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n const requestId =\n stringValue(input.requestId) ??\n stringValue(payload.requestId) ??\n stringValue(payload.approvalRequestId) ??\n message.messageId;\n const options = [\n ...arrayValue(input.options),\n ...arrayValue(payload.options)\n ].flatMap((option) => {\n const record = recordValue(option);\n const id =\n stringValue(record.optionId) ??\n stringValue(record.id) ??\n stringValue(record.kind);\n if (!id) {\n return [];\n }\n return [\n {\n id,\n label:\n stringValue(record.name) ??\n stringValue(record.label) ??\n stringValue(record.title) ??\n id,\n kind: stringValue(record.kind) ?? id,\n ...(stringValue(record.description)\n ? { description: stringValue(record.description) as string }\n : {})\n }\n ];\n });\n if (options.length === 0) {\n return null;\n }\n const mcpTarget = extractAgentMcpToolTarget({ payload });\n return {\n kind: \"approval\",\n id: `approval:${requestId}`,\n turnId: message.turnId ?? \"turn:unknown\",\n requestId,\n callId: stringValue(payload.callId) ?? message.messageId,\n title: firstNonEmptyString(\n mcpTarget?.displayName ?? null,\n stringValue(payload.summary),\n stringValue(payload.title),\n stringValue(input.title),\n stringValue(input.command),\n messageSummary(message),\n message.kind\n ),\n toolName:\n stringValue(payload.toolName) ??\n stringValue(payload.name) ??\n stringValue(payload.tool),\n status: message.status ?? stringValue(payload.status),\n input: Object.keys(input).length > 0 ? input : payload,\n options,\n output: null,\n occurredAtUnixMs: messageTimeUnixMs(message) || null\n };\n}\n\nfunction askUserPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!isQuestionMessage(message)) {\n return null;\n }\n const payload = recordValue(message.payload);\n // The structured questions live on the tool-call input (payload.input.questions\n // or payload.tool_state.input.questions) — the same source the in-conversation\n // projection reads — so the deck card renders the identical question + options.\n // payload.questions is a legacy fallback for shapes that inline them.\n const toolState = recordValue(payload.tool_state);\n const input =\n Object.keys(recordValue(payload.input)).length > 0\n ? recordValue(payload.input)\n : recordValue(toolState.input);\n const rawQuestions =\n arrayValue(input.questions).length > 0\n ? input.questions\n : payload.questions;\n const questions = normalizeAskUserQuestions(rawQuestions);\n if (questions.length === 0) {\n return null;\n }\n return {\n kind: \"ask-user\",\n requestId:\n stringValue(input.requestId) ??\n stringValue(payload.requestId) ??\n stringValue(payload.interactiveRequestId) ??\n message.messageId,\n title:\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message),\n questions\n };\n}\n\nfunction exitPlanPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!includesAny(normalizedMetadataValues(message), [\"exitplanmode\"])) {\n return null;\n }\n const payload = recordValue(message.payload);\n return {\n kind: \"exit-plan\",\n requestId: stringValue(payload.requestId) ?? message.messageId,\n title:\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message)\n };\n}\n\nfunction codexPlanImplementationPrompt(\n session: AgentActivitySession,\n status: WorkspaceAgentActivityStatus,\n messages: readonly AgentActivityMessage[]\n): AgentConversationPromptVM | null {\n if (session.provider.trim().toLowerCase() !== \"codex\") {\n return null;\n }\n // Only offer once the session has settled to completed/idle — not while it\n // is still working/waiting, and not after failed/canceled (no point asking\n // to implement a plan from a turn that didn't finish cleanly). Mirrors the\n // codex TUI gate but evaluated against the latest turn rather than a\n // transient per-turn flag.\n if (status !== \"completed\" && status !== \"idle\") {\n return null;\n }\n const planTurnId = latestPlanTurnId(messages);\n if (!planTurnId) {\n return null;\n }\n // Title from the plan message itself (matching latestPlanTurnId's plan-item\n // detection), not whichever message in the turn happens to come first.\n const planMessage = messages.find(\n (item) =>\n item.turnId?.trim() === planTurnId &&\n recordValue(item.payload).messageKind === \"plan\"\n );\n const title = planMessage ? messageSummary(planMessage) : \"\";\n return planImplementationPromptFromPlanTurn(planTurnId, title);\n}\n\nfunction latestAgentMessage(\n messages: readonly AgentActivityMessage[]\n): { summary: string; occurredAtUnixMs: number } | null {\n return messages.reduce<{ summary: string; occurredAtUnixMs: number } | null>(\n (latest, message) => {\n if (!isAgentMessageRole(message.role)) {\n return latest;\n }\n const summary = messageSummary(message);\n if (!summary) {\n return latest;\n }\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (!latest || occurredAtUnixMs >= latest.occurredAtUnixMs) {\n return { summary, occurredAtUnixMs };\n }\n return latest;\n },\n null\n );\n}\n\nfunction latestTurnOutcome(\n agentSessionId: string,\n messages: readonly AgentActivityMessage[]\n): WorkspaceAgentMessageCenterTurnOutcome | null {\n const latest = messages\n .flatMap((message) => {\n const status = outcomeStatusFromMessage(message);\n if (!status) {\n return [];\n }\n const turnId = message.turnId?.trim() || null;\n const messageId = message.messageId.trim();\n const notificationSubject = turnId\n ? `turn:${turnId}`\n : `message:${messageId}`;\n return [\n {\n notificationKey: `${agentSessionId}:${notificationSubject}:${status}`,\n status,\n turnId,\n sortMessage: message\n }\n ];\n })\n .sort((left, right) =>\n compareMessagesByRecentTime(left.sortMessage, right.sortMessage)\n )[0];\n\n if (!latest) {\n return null;\n }\n return {\n notificationKey: latest.notificationKey,\n status: latest.status,\n turnId: latest.turnId\n };\n}\n\nfunction outcomeStatusFromMessage(\n message: AgentActivityMessage\n): WorkspaceAgentMessageCenterTurnOutcome[\"status\"] | null {\n if (!isAgentMessageRole(message.role)) {\n return null;\n }\n const payload = recordValue(message.payload);\n const status = (message.status ?? stringValue(payload.status) ?? \"\")\n .trim()\n .toLowerCase();\n switch (status) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"error\":\n case \"failed\":\n return \"failed\";\n default:\n return null;\n }\n}\n\nfunction fallbackPromptFromNeedsAttention(\n item: AgentActivityNeedsAttentionItem | null,\n labels: WorkspaceAgentMessageCenterPromptFallbackLabels | undefined\n): AgentConversationPromptVM | null {\n if (!item || item.kind === \"permission\" || !labels) {\n return null;\n }\n return {\n kind: \"ask-user\",\n requestId: requestIdFromNeedsAttentionItem(item),\n title: item.summary || item.title || labels.title,\n questions: [\n {\n id: \"response\",\n header:\n item.kind === \"constraint\"\n ? labels.constraintHeader\n : labels.inputHeader,\n question: item.summary || item.title || labels.question,\n options: [],\n multiSelect: false,\n answer: null\n }\n ]\n };\n}\n\nfunction requestIdFromNeedsAttentionItem(\n item: AgentActivityNeedsAttentionItem\n): string {\n const [, messageId] = item.id.split(\":\", 2);\n return messageId?.trim() || item.id;\n}\n\nfunction countMessageCenterItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterCounts {\n return items.reduce<WorkspaceAgentMessageCenterCounts>(\n (counts, item) => {\n counts.all += 1;\n if (isWaitingMessageCenterItem(item)) {\n counts.waiting += 1;\n return counts;\n }\n if (isCompletedMessageCenterItem(item)) {\n counts.completed += 1;\n return counts;\n }\n switch (item.status) {\n case \"working\":\n counts.working += 1;\n break;\n case \"failed\":\n counts.failed += 1;\n break;\n default:\n break;\n }\n return counts;\n },\n { ...EMPTY_COUNTS }\n );\n}\n\nfunction compareMessageCenterItems(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): number {\n const leftWaiting = isWaitingMessageCenterItem(left);\n const rightWaiting = isWaitingMessageCenterItem(right);\n if (leftWaiting !== rightWaiting) {\n return leftWaiting ? -1 : 1;\n }\n return (\n right.sortTimeUnixMs - left.sortTimeUnixMs ||\n left.agentSessionId.localeCompare(right.agentSessionId)\n );\n}\n\nfunction isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n switch (status?.trim().toLowerCase()) {\n case \"answered\":\n case \"canceled\":\n case \"cancelled\":\n case \"completed\":\n case \"failed\":\n case \"rejected\":\n case \"resolved\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isPermissionMessage(message: AgentActivityMessage): boolean {\n return includesAny(normalizedMetadataValues(message), [\n \"permission\",\n \"approval\"\n ]);\n}\n\nfunction isQuestionMessage(message: AgentActivityMessage): boolean {\n return includesAny(normalizedMetadataValues(message), [\n \"ask_user\",\n \"ask-user\",\n \"askuserquestion\",\n \"question\"\n ]);\n}\n\nfunction normalizedMetadataValues(message: AgentActivityMessage): string {\n const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n return [\n message.kind,\n message.status ?? \"\",\n stringValue(payload.type) ?? \"\",\n stringValue(payload.action) ?? \"\",\n stringValue(payload.requestType) ?? \"\",\n stringValue(payload.callType) ?? \"\",\n stringValue(payload.toolName) ?? \"\",\n stringValue(payload.name) ?? \"\",\n stringValue(payload.status) ?? \"\",\n stringValue(input.type) ?? \"\",\n stringValue(input.action) ?? \"\",\n stringValue(input.requestType) ?? \"\",\n stringValue(input.callType) ?? \"\",\n stringValue(input.toolName) ?? \"\",\n stringValue(input.name) ?? \"\",\n stringValue(input.status) ?? \"\"\n ]\n .join(\" \")\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nfunction compareMessagesByRecentTime(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n messageTimeUnixMs(right) - messageTimeUnixMs(left) ||\n right.version - left.version ||\n right.messageId.localeCompare(left.messageId)\n );\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) =>\n value.includes(needle.replace(/[_\\s-]+/g, \"\").toLowerCase())\n );\n}\n\nfunction messageSummary(message: AgentActivityMessage): string {\n return firstNonEmptyString(\n stringValue(message.payload.summary),\n stringValue(message.payload.displayPrompt),\n stringValue(message.payload.text),\n stringValue(message.payload.content),\n stringValue(message.payload.message),\n stringValue(message.payload.body),\n stringValue(message.payload.title)\n );\n}\n\nfunction messageTimeUnixMs(message: AgentActivityMessage): number {\n return (\n positiveNumber(message.occurredAtUnixMs) ??\n positiveNumber(message.completedAtUnixMs) ??\n positiveNumber(message.startedAtUnixMs) ??\n positiveNumber(message.version) ??\n 0\n );\n}\n\nfunction firstNonEmptyString(...values: Array<string | null>): string {\n return values.find((value) => value !== null && value.length > 0) ?? \"\";\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n","import type {\n AgentActivityMessage,\n AgentActivityNeedsAttentionItem\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport { extractAgentMcpToolTarget } from \"../shared/agentMcpToolTarget\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\n\nexport type WorkspaceAgentMessageCenterDigestPrimaryKind =\n | \"input-required\"\n | \"error\"\n | \"outcome\"\n | \"progress\"\n | \"summary\";\n\nexport interface WorkspaceAgentMessageCenterDigestPrimary {\n kind: WorkspaceAgentMessageCenterDigestPrimaryKind;\n summary: string;\n occurredAtUnixMs: number | null;\n}\n\nexport interface WorkspaceAgentMessageCenterDigest {\n primary: WorkspaceAgentMessageCenterDigestPrimary;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterDigestInput {\n fallbackTitle: string;\n messages: readonly AgentActivityMessage[];\n needsAttention: AgentActivityNeedsAttentionItem | null;\n pendingPrompt: AgentConversationPromptVM | null;\n status: WorkspaceAgentActivityStatus;\n}\n\nexport function buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle,\n messages,\n needsAttention,\n pendingPrompt,\n status\n}: BuildWorkspaceAgentMessageCenterDigestInput): WorkspaceAgentMessageCenterDigest {\n const latestAgentMessage = latestAgentMessageSummary(messages);\n const fallbackSummary = firstNonEmptyString(\n latestAgentMessage?.summary ?? null,\n needsAttention?.summary ?? null,\n pendingPromptSummary(pendingPrompt),\n fallbackTitle\n );\n if (pendingPrompt || needsAttention) {\n return {\n primary: {\n kind: \"input-required\",\n summary: firstNonEmptyString(\n pendingPromptSummary(pendingPrompt),\n needsAttention?.summary ?? null,\n fallbackSummary\n ),\n occurredAtUnixMs:\n needsAttention?.occurredAtUnixMs ??\n promptTimeUnixMs(pendingPrompt) ??\n latestAgentMessage?.occurredAtUnixMs ??\n null\n }\n };\n }\n if (status === \"failed\") {\n return {\n primary: {\n kind: \"error\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n }\n if (status === \"completed\" || status === \"canceled\" || status === \"idle\") {\n return {\n primary: {\n kind: \"outcome\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n }\n if (status === \"working\") {\n return {\n primary: {\n kind: \"progress\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n }\n return {\n primary: {\n kind: \"summary\",\n summary: fallbackSummary,\n occurredAtUnixMs: latestAgentMessage?.occurredAtUnixMs ?? null\n }\n };\n}\n\nfunction latestAgentMessageSummary(\n messages: readonly AgentActivityMessage[]\n): { summary: string; occurredAtUnixMs: number } | null {\n return messages.reduce<{ summary: string; occurredAtUnixMs: number } | null>(\n (latest, message) => {\n if (!isAgentMessageRole(message.role)) {\n return latest;\n }\n const summary = meaningfulMessageSummary(message);\n if (!summary) {\n return latest;\n }\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (!latest || occurredAtUnixMs >= latest.occurredAtUnixMs) {\n return { summary, occurredAtUnixMs };\n }\n return latest;\n },\n null\n );\n}\n\nfunction pendingPromptSummary(\n prompt: AgentConversationPromptVM | null\n): string | null {\n if (!prompt) {\n return null;\n }\n switch (prompt.kind) {\n case \"ask-user\":\n return firstNonEmptyString(\n prompt.title,\n prompt.questions[0]?.question ?? null\n );\n case \"approval\":\n case \"exit-plan\":\n case \"plan-implementation\":\n return prompt.title;\n }\n}\n\nfunction promptTimeUnixMs(\n prompt: AgentConversationPromptVM | null\n): number | null {\n if (!prompt || !(\"occurredAtUnixMs\" in prompt)) {\n return null;\n }\n return positiveNumber(prompt.occurredAtUnixMs);\n}\n\nfunction isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\ntype MessageSummarySource =\n | \"payload.summary\"\n | \"payload.displayPrompt\"\n | \"payload.text\"\n | \"payload.content\"\n | \"payload.message\"\n | \"payload.body\"\n | \"tool.error\"\n | \"tool.output\"\n | \"tool.input\"\n | \"payload.title\";\n\ninterface MessageSummaryCandidate {\n source: MessageSummarySource;\n summary: string;\n}\n\nfunction meaningfulMessageSummary(message: AgentActivityMessage): string {\n for (const candidate of messageSummaryCandidates(message)) {\n if (!isGenericToolLabelSummary(message, candidate)) {\n return decorateMessageSummary(message, candidate);\n }\n }\n return \"\";\n}\n\nfunction messageSummaryCandidates(\n message: AgentActivityMessage\n): MessageSummaryCandidate[] {\n const explicitCandidates = [\n summaryCandidate(\"payload.summary\", message.payload.summary),\n summaryCandidate(\"payload.displayPrompt\", message.payload.displayPrompt),\n summaryCandidate(\"payload.text\", message.payload.text),\n summaryCandidate(\"payload.content\", message.payload.content),\n summaryCandidate(\"payload.message\", message.payload.message),\n summaryCandidate(\"payload.body\", message.payload.body)\n ];\n if (!isToolLikeMessage(message)) {\n return [\n ...explicitCandidates,\n summaryCandidate(\"payload.title\", message.payload.title)\n ].filter((candidate): candidate is MessageSummaryCandidate =>\n Boolean(candidate)\n );\n }\n return [\n ...explicitCandidates,\n toolErrorSummaryCandidate(message.payload),\n toolOutputSummaryCandidate(message.payload),\n toolInputSummaryCandidate(message.payload),\n summaryCandidate(\"payload.title\", message.payload.title)\n ].filter((candidate): candidate is MessageSummaryCandidate =>\n Boolean(candidate)\n );\n}\n\nfunction summaryCandidate(\n source: MessageSummarySource,\n value: unknown\n): MessageSummaryCandidate | null {\n const summary = normalizeSummaryText(stringValue(value));\n return summary ? { source, summary } : null;\n}\n\nfunction toolErrorSummaryCandidate(\n payload: Record<string, unknown>\n): MessageSummaryCandidate | null {\n const error = recordValue(payload.error);\n const rawOutput = recordValue(error.rawOutput);\n return summaryCandidate(\n \"tool.error\",\n firstNonEmptyString(\n stringValue(payload.error),\n stringValue(error.summary),\n stringValue(error.message),\n stringValue(error.detail),\n stringValue(error.text),\n textFromContentValue(error.content),\n stringValue(error.output),\n stringValue(error.stdout),\n stringValue(error.stderr),\n stringValue(error.aggregated_output),\n stringValue(error.formatted_output),\n stringValue(rawOutput.stdout),\n stringValue(rawOutput.stderr),\n stringValue(rawOutput.aggregated_output),\n stringValue(rawOutput.formatted_output),\n stringValue(error.error)\n )\n );\n}\n\nfunction toolOutputSummaryCandidate(\n payload: Record<string, unknown>\n): MessageSummaryCandidate | null {\n const output = recordValue(payload.output);\n const rawOutput = recordValue(output.rawOutput);\n return summaryCandidate(\n \"tool.output\",\n firstNonEmptyString(\n stringValue(output.summary),\n stringValue(output.message),\n stringValue(output.text),\n textFromContentValue(output.content),\n stringValue(output.content),\n stringValue(output.result),\n stringValue(output.output),\n stringValue(output.stdout),\n stringValue(output.stderr),\n stringValue(output.aggregated_output),\n stringValue(output.formatted_output),\n stringValue(rawOutput.stdout),\n stringValue(rawOutput.stderr),\n stringValue(rawOutput.aggregated_output),\n stringValue(rawOutput.formatted_output),\n stringValue(payload.result)\n )\n );\n}\n\nfunction toolInputSummaryCandidate(\n payload: Record<string, unknown>\n): MessageSummaryCandidate | null {\n const input = recordValue(payload.input);\n const rawInput = recordValue(input.rawInput);\n const action = recordValue(input.action);\n return summaryCandidate(\n \"tool.input\",\n firstNonEmptyString(\n stringValue(input.summary),\n stringValue(input.command),\n stringValue(input.cmd),\n stringValue(rawInput.command),\n stringValue(rawInput.cmd),\n stringValue(input.path),\n stringValue(input.file_path),\n stringValue(input.fileName),\n stringValue(input.filename),\n stringValue(input.query),\n stringArrayFirstValue(input.search_query),\n stringArrayFirstValue(input.searchQuery),\n stringValue(input.url),\n stringValue(input.pattern),\n stringValue(input.glob),\n stringValue(input.regex),\n stringValue(input.prompt),\n stringValue(action.query),\n stringValue(action.url)\n )\n );\n}\n\nfunction isGenericToolLabelSummary(\n message: AgentActivityMessage,\n candidate: MessageSummaryCandidate\n): boolean {\n if (!isToolLikeMessage(message)) {\n return false;\n }\n const normalizedSummary = normalizeToken(candidate.summary);\n if (!normalizedSummary) {\n return true;\n }\n if (structuralToolLabelTokens(message).has(normalizedSummary)) {\n return true;\n }\n return (\n candidate.source === \"payload.title\" &&\n !hasToolDigestSignal(message) &&\n looksLikeBareLabel(candidate.summary)\n );\n}\n\nfunction decorateMessageSummary(\n message: AgentActivityMessage,\n candidate: MessageSummaryCandidate\n): string {\n if (!isToolLikeMessage(message)) {\n return candidate.summary;\n }\n const mcpTarget = extractAgentMcpToolTarget({ payload: message.payload });\n if (!mcpTarget) {\n return candidate.summary;\n }\n if (candidate.summary.includes(mcpTarget.displayName)) {\n return candidate.summary;\n }\n return `${mcpTarget.displayName}: ${candidate.summary}`;\n}\n\nfunction isToolLikeMessage(message: AgentActivityMessage): boolean {\n const payload = recordValue(message.payload);\n const normalizedKind = normalizeToken(message.kind);\n const normalizedType = [\n stringValue(payload.type),\n stringValue(payload.action),\n stringValue(payload.requestType)\n ]\n .map((value) => normalizeToken(value ?? \"\"))\n .join(\" \");\n return (\n includesAny(normalizedKind, [\"call\", \"tool\"]) ||\n includesAny(normalizedType, [\"call\", \"tool\"]) ||\n Boolean(\n stringValue(payload.callType) ||\n stringValue(payload.toolName) ||\n stringValue(payload.tool) ||\n hasRecordValue(payload.input) ||\n hasRecordValue(payload.output) ||\n hasRecordValue(payload.error)\n )\n );\n}\n\nfunction structuralToolLabelTokens(message: AgentActivityMessage): Set<string> {\n const payload = recordValue(message.payload);\n const metadata = recordValue(payload.metadata);\n return new Set(\n [\n message.kind,\n message.status,\n stringValue(payload.type),\n stringValue(payload.action),\n stringValue(payload.requestType),\n stringValue(payload.callType),\n stringValue(payload.toolName),\n stringValue(payload.name),\n stringValue(payload.tool),\n stringValue(metadata.callType),\n stringValue(metadata.toolName),\n stringValue(metadata.name),\n stringValue(metadata.tool)\n ]\n .map((value) => normalizeToken(value ?? \"\"))\n .filter(Boolean)\n );\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) => value.includes(normalizeToken(needle)));\n}\n\nfunction hasToolDigestSignal(message: AgentActivityMessage): boolean {\n const payload = recordValue(message.payload);\n return Boolean(\n toolErrorSummaryCandidate(payload) ||\n toolOutputSummaryCandidate(payload) ||\n toolInputSummaryCandidate(payload)\n );\n}\n\nfunction looksLikeBareLabel(value: string): boolean {\n const trimmed = value.trim();\n return (\n trimmed.length > 0 &&\n trimmed.length <= 40 &&\n !/\\s/u.test(trimmed) &&\n !/[/:\\\\.[\\]{}()=#?&]/u.test(trimmed)\n );\n}\n\nfunction normalizeToken(value: string): string {\n return value.replace(/[_\\s.-]+/g, \"\").toLowerCase();\n}\n\nfunction messageTimeUnixMs(message: AgentActivityMessage): number {\n return (\n positiveNumber(message.occurredAtUnixMs) ??\n positiveNumber(message.completedAtUnixMs) ??\n positiveNumber(message.startedAtUnixMs) ??\n positiveNumber(message.version) ??\n 0\n );\n}\n\nfunction firstNonEmptyString(...values: Array<string | null>): string {\n return (\n values.find((value) => value !== null && value.trim().length > 0) ?? \"\"\n );\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction stringArrayFirstValue(value: unknown): string | null {\n if (!Array.isArray(value)) {\n return null;\n }\n return (\n value.map(stringValue).find((item): item is string => Boolean(item)) ?? null\n );\n}\n\nfunction textFromContentValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (Array.isArray(value)) {\n return (\n value\n .map(textFromContentValue)\n .find((item): item is string => Boolean(item)) ?? null\n );\n }\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n return firstNonEmptyString(\n stringValue(record.text),\n \"content\" in record ? textFromContentValue(record.content) : null\n );\n}\n\nfunction normalizeSummaryText(value: string | null): string | null {\n if (!value) {\n return null;\n }\n return value\n .replace(/^#{1,6}\\s+error\\s*\\n+/iu, \"\")\n .replace(/\\s+/gu, \" \")\n .trim();\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction hasRecordValue(value: unknown): boolean {\n return Object.keys(recordValue(value)).length > 0;\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n","import { useEffect, useMemo, useRef, useState, type JSX } from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport { WorkspaceAgentMessageCenterCard } from \"./WorkspaceAgentMessageCenterCard\";\nimport type { WorkspaceAgentMessageCenterItem } from \"./workspaceAgentMessageCenterModel\";\n\nconst DECK_MAX_PEEK = 2;\nconst DECK_NEW_CARD_COOLDOWN_MS = 500;\nconst DECK_LEAVE_ANIMATION_FALLBACK_MS = 420;\n\nexport interface WorkspaceAgentMessageCenterAttentionDeckProps {\n items: WorkspaceAgentMessageCenterItem[];\n highlightedItemId?: string | null;\n submittingPromptKey: string | null;\n registerNode?: (itemId: string, node: HTMLElement | null) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }\n ) => void;\n}\n\nexport function WorkspaceAgentMessageCenterAttentionDeck({\n items,\n highlightedItemId = null,\n submittingPromptKey,\n registerNode,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt\n}: WorkspaceAgentMessageCenterAttentionDeckProps): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n\n const ordered = useMemo(\n () => orderDeckItems(items, highlightedItemId),\n [items, highlightedItemId]\n );\n\n // Derive topRequestId using optional chaining so it is safe when ordered[0] is undefined.\n // All hooks must run before the early-return guard.\n const topRequestId = ordered[0]?.pendingPrompt?.requestId ?? null;\n const topPromotedByHighlight =\n ordered[0]?.id === highlightedItemId && highlightedItemId !== null;\n const previousTopRequestIdRef = useRef<string | null>(null);\n const [cooldownRequestId, setCooldownRequestId] = useState<string | null>(\n null\n );\n\n useEffect(() => {\n const previousTopRequestId = previousTopRequestIdRef.current;\n previousTopRequestIdRef.current = topRequestId;\n if (\n !topRequestId ||\n topPromotedByHighlight ||\n previousTopRequestId === null ||\n previousTopRequestId === topRequestId\n ) {\n return undefined;\n }\n setCooldownRequestId(topRequestId);\n const timeoutId = window.setTimeout(() => {\n setCooldownRequestId((current) =>\n current === topRequestId ? null : current\n );\n }, DECK_NEW_CARD_COOLDOWN_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [topPromotedByHighlight, topRequestId]);\n\n const isTopCoolingDown =\n cooldownRequestId !== null && cooldownRequestId === topRequestId;\n\n const previousTopItemRef = useRef<WorkspaceAgentMessageCenterItem | null>(\n null\n );\n const [leavingItem, setLeavingItem] =\n useState<WorkspaceAgentMessageCenterItem | null>(null);\n\n useEffect(() => {\n const previousTopItem = previousTopItemRef.current;\n previousTopItemRef.current = ordered[0] ?? null;\n if (\n previousTopItem &&\n previousTopItem.id !== (ordered[0]?.id ?? null) &&\n !items.some((item) => item.id === previousTopItem.id)\n ) {\n setLeavingItem(previousTopItem);\n const timeoutId = window.setTimeout(() => {\n setLeavingItem((current) =>\n current?.id === previousTopItem.id ? null : current\n );\n }, DECK_LEAVE_ANIMATION_FALLBACK_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }\n return undefined;\n }, [items, ordered]);\n\n const topItem = ordered[0];\n if (!topItem) {\n return null;\n }\n\n const peekCount = Math.min(ordered.length - 1, DECK_MAX_PEEK);\n const topIsSubmitting =\n submittingPromptKey ===\n `${topItem.agentSessionId}:${topItem.pendingPrompt?.requestId}`;\n\n return (\n <section\n className=\"flex min-w-0 flex-col gap-2.5\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\")}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3 px-0.5\">\n <div className=\"truncate text-xs font-bold leading-4 text-[var(--text-tertiary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\")} ·{\" \"}\n {ordered.length}\n </div>\n </div>\n <div\n className={cn(\n \"relative min-w-0\",\n peekCount > 1 ? \"pb-[18px]\" : peekCount > 0 && \"pb-[10px]\"\n )}\n data-testid=\"workspace-agent-message-center-attention-deck\"\n data-deck-count={ordered.length}\n data-deck-peek-count={peekCount}\n data-deck-top-item-id={topItem.id}\n >\n {leavingItem ? (\n <div\n key={`leaving-${leavingItem.agentSessionId}`}\n aria-hidden=\"true\"\n inert\n data-deck-leaving-item-id={leavingItem.id}\n className=\"pointer-events-none absolute inset-x-0 top-0 z-20 min-w-0 motion-safe:animate-out motion-safe:fade-out-0 motion-safe:slide-out-to-top-2 motion-safe:duration-300 motion-safe:ease-[cubic-bezier(0.4,0,0.2,1)] motion-reduce:hidden\"\n onAnimationEnd={(event) => {\n if (event.target === event.currentTarget) {\n setLeavingItem((current) =>\n current?.id === leavingItem.id ? null : current\n );\n }\n }}\n >\n <WorkspaceAgentMessageCenterCard\n interactive={false}\n isSubmitting={false}\n item={leavingItem}\n onOpenChat={onOpenChat}\n onSubmitPrompt={() => {}}\n />\n </div>\n ) : null}\n <div\n key={topItem.id}\n className={cn(\n \"relative min-w-0 rounded-lg motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 motion-safe:duration-300 motion-reduce:animate-none\",\n peekCount > 1\n ? \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2),0_14px_0_-8px_var(--background-fronted),0_14px_0_-7px_var(--line-2)]\"\n : peekCount > 0 &&\n \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2)]\"\n )}\n >\n <WorkspaceAgentMessageCenterCard\n cardRef={\n registerNode\n ? (node) => registerNode(topItem.id, node)\n : undefined\n }\n highlighted={topItem.id === highlightedItemId}\n interactive\n isSubmitting={topIsSubmitting || isTopCoolingDown}\n item={topItem}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(input) => onSubmitPrompt(topItem, input)}\n />\n </div>\n </div>\n </section>\n );\n}\n\nfunction orderDeckItems(\n items: readonly WorkspaceAgentMessageCenterItem[],\n highlightedItemId: string | null\n): WorkspaceAgentMessageCenterItem[] {\n if (!highlightedItemId) {\n return [...items];\n }\n const index = items.findIndex((item) => item.id === highlightedItemId);\n if (index <= 0) {\n return [...items];\n }\n const next = [...items];\n const [picked] = next.splice(index, 1);\n return picked ? [picked, ...next] : next;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type ReactNode\n} from \"react\";\nimport { ChevronDown, ChevronUp, ExternalLink, Info } from \"lucide-react\";\nimport {\n Button,\n cn,\n StatusDot,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport { normalizeAgentTitleText } from \"../shared/utils/agentTitleText\";\nimport { AgentInteractivePromptSurface } from \"../shared/agentConversation/components/AgentInteractivePromptSurface\";\nimport { AgentMessageMarkdown } from \"../shared/AgentMessageMarkdown\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport { managedAgentRoundedIconUrl } from \"../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../shared/workspaceAgentActivityStatusLabel\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport userAvatarPlaceholderUrl from \"../app/renderer/assets/icons/user-avatar-placeholder.png\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n highlighted?: boolean;\n interactive?: boolean;\n isSubmitting: boolean;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }) => void;\n}\n\nfunction stopMessageCenterTextPointerPropagation(\n event: ReactPointerEvent<HTMLElement>\n): void {\n event.stopPropagation();\n}\n\nexport function WorkspaceAgentMessageCenterCard({\n cardRef,\n highlighted = false,\n interactive = true,\n item,\n isSubmitting,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt\n}: WorkspaceAgentMessageCenterCardProps): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n const prompt = item.pendingPrompt;\n const displayTitle = normalizeAgentTitleText(item.title);\n const summary = messageCenterVisibleSummary(item);\n const displayStatus = statusClass(item);\n const statusLabel = workspaceAgentActivityStatusLabel(displayStatus, t);\n\n return (\n <article\n ref={cardRef}\n className={cn(\n \"workspace-agent-message-center__card group/message-card flex min-w-0 flex-col gap-2.5 rounded-lg border border-[var(--line-2)] bg-[var(--background-fronted)] p-3.5 outline outline-0 outline-offset-2 outline-transparent transition-[background-color,border-color,outline-color]\",\n isWaitingMessageCenterItem(item) &&\n \"agent-gui-edge-glow border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)]\",\n highlighted && \"outline-2 outline-[var(--accent)]\"\n )}\n data-highlighted={highlighted ? \"true\" : undefined}\n data-message-center-digest-kind={item.digest.primary.kind}\n data-message-center-item-id={item.id}\n data-waiting={isWaitingMessageCenterItem(item) ? \"true\" : undefined}\n data-status={displayStatus}\n tabIndex={highlighted ? -1 : undefined}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2.5\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <h3\n className=\"workspace-agent-message-center__copy-text min-w-0 truncate text-[13px] font-bold leading-5 text-[var(--text-secondary)]\"\n onPointerDown={stopMessageCenterTextPointerPropagation}\n >\n {displayTitle}\n </h3>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-[min(360px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n >\n {displayTitle}\n </TooltipContent>\n </Tooltip>\n {item.cwd ? <ProjectPathInfo path={item.cwd} /> : null}\n </div>\n <span\n className=\"workspace-agent-message-center__status inline-flex shrink-0 items-center gap-1.5 text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n data-status={displayStatus}\n title={statusLabel}\n >\n <StatusDot\n tone={messageCenterStatusTone(item)}\n pulse={\n isWaitingMessageCenterItem(item) || item.status === \"working\"\n }\n size=\"sm\"\n title={statusLabel}\n />\n <span>{statusLabel}</span>\n </span>\n </div>\n\n {summary ? (\n <MessageCenterSummary\n item={item}\n onLinkAction={onLinkAction}\n summary={summary}\n emptyLabel={t(\"agentHost.workspaceAgentMessageCenterNoSummary\")}\n />\n ) : null}\n\n {prompt && interactive ? (\n <div className=\"min-w-0\">\n <AgentInteractivePromptSurface\n embedded\n variant=\"compact\"\n keyboardShortcuts={false}\n prompt={prompt}\n isSubmitting={isSubmitting}\n onSubmit={onSubmitPrompt}\n labels={buildWorkspaceAgentInteractivePromptLabels(\n t,\n item.provider\n )}\n />\n </div>\n ) : null}\n\n <MessageCenterOpenChatButton\n provider={item.provider}\n item={item}\n label={t(\"agentHost.workspaceAgentMessageCenterOpenChat\")}\n onOpenChat={onOpenChat}\n // Interactive deck cards only offer the primary decision inline; the\n // jump to the conversation is the path for everything else (e.g.\n // refining a plan), so keep it always visible rather than hover-only.\n alwaysVisible={interactive && prompt !== null}\n />\n </article>\n );\n}\n\nconst STACK_PRESENCE_FALLBACK_MS = 380;\n\nfunction useStackRegionPresence(visible: boolean): {\n closing: boolean;\n mounted: boolean;\n onAnimationEnd: (event: ReactAnimationEvent<HTMLDivElement>) => void;\n} {\n const [mounted, setMounted] = useState(visible);\n const closing = mounted && !visible;\n\n useLayoutEffect(() => {\n if (visible) {\n setMounted(true);\n }\n }, [visible]);\n\n useEffect(() => {\n if (!closing) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n setMounted(false);\n }, STACK_PRESENCE_FALLBACK_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [closing]);\n\n const onAnimationEnd = useCallback(\n (event: ReactAnimationEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget && closing) {\n setMounted(false);\n }\n },\n [closing]\n );\n\n return { closing, mounted, onAnimationEnd };\n}\n\nexport function WorkspaceAgentMessageCenterStack({\n className,\n expanded,\n groupId,\n items,\n renderCard,\n onCollapse,\n onExpand\n}: {\n className?: string;\n expanded: boolean;\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n renderCard: (\n item: WorkspaceAgentMessageCenterItem,\n options?: { stackedIndex?: number }\n ) => ReactNode;\n onCollapse: () => void;\n onExpand: () => void;\n}): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const summaryRegion = useStackRegionPresence(!expanded);\n const cardsRegion = useStackRegionPresence(expanded);\n if (items.length < 2) {\n return null;\n }\n const collapseLabel = t(\n \"agentHost.workspaceAgentMessageCenterCollapseStackAria\"\n );\n\n return (\n <div\n className={cn(\"relative flex min-w-0 flex-col\", className)}\n data-stack-count={items.length}\n data-stack-motion=\"smooth\"\n data-stack-state={expanded ? \"expanded\" : \"collapsed\"}\n data-stack-top-item-id={items[0]?.id}\n data-testid={`workspace-agent-message-stack-${groupId}`}\n >\n {summaryRegion.mounted ? (\n <div\n className={cn(\n \"workspace-agent-message-center__stack-rest min-w-0\",\n summaryRegion.closing\n ? \"workspace-agent-message-center__stack-rest--closing\"\n : \"workspace-agent-message-center__stack-rest--opening\"\n )}\n onAnimationEnd={summaryRegion.onAnimationEnd}\n >\n <div\n className=\"min-h-0 min-w-0 overflow-hidden\"\n aria-hidden={summaryRegion.closing ? true : undefined}\n inert={summaryRegion.closing ? true : undefined}\n >\n <MessageCenterStackSummary\n groupId={groupId}\n items={items}\n onExpand={onExpand}\n />\n </div>\n </div>\n ) : null}\n\n {cardsRegion.mounted ? (\n <div\n className={cn(\n \"workspace-agent-message-center__stack-rest min-w-0\",\n cardsRegion.closing\n ? \"workspace-agent-message-center__stack-rest--closing\"\n : \"workspace-agent-message-center__stack-rest--opening\"\n )}\n onAnimationEnd={cardsRegion.onAnimationEnd}\n >\n <div\n className=\"min-h-0 min-w-0 overflow-hidden\"\n aria-hidden={cardsRegion.closing ? true : undefined}\n inert={cardsRegion.closing ? true : undefined}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2 px-0.5 pb-1.5\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-[13px] font-semibold leading-4 text-[var(--text-tertiary)]\">\n <MessageCenterIdentityAvatarMark\n identity={items[0]?.identity ?? null}\n provider={items[0]?.provider ?? \"\"}\n userId={items[0]?.userId ?? null}\n />\n <span className=\"min-w-0 truncate\">\n {t(\"agentHost.workspaceAgentMessageCenterStackSummaryCount\", {\n count: items.length\n })}\n </span>\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={collapseLabel}\n className=\"size-6 text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n onClick={onCollapse}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" align=\"center\">\n {collapseLabel}\n </TooltipContent>\n </Tooltip>\n </div>\n <div className=\"flex min-w-0 flex-col gap-2.5\">\n {items.map((item, stackedIndex) =>\n renderCard(item, { stackedIndex })\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MessageCenterStackSummary({\n groupId,\n items,\n onExpand\n}: {\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n onExpand: () => void;\n}): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const firstItem = items[0];\n const hasWaiting = items.some((item) => isWaitingMessageCenterItem(item));\n if (!firstItem) {\n return null;\n }\n\n return (\n <button\n type=\"button\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterExpandStackAria\", {\n count: items.length\n })}\n className={cn(\n \"group/stack-peek relative block w-full min-w-0 rounded-lg text-left outline-none focus-visible:ring-2 focus-visible:ring-[var(--accent)]\",\n items.length > 2 ? \"pb-[18px]\" : \"pb-[10px]\"\n )}\n data-stack-summary-count={items.length}\n data-stack-provider={firstItem.provider}\n data-stack-user-id={firstItem.userId ?? \"\"}\n data-testid={`workspace-agent-message-stack-summary-${groupId}`}\n onClick={onExpand}\n >\n <span\n className={cn(\n \"relative z-10 flex min-w-0 flex-col gap-2 rounded-lg border border-[var(--line-2)] bg-[var(--background-fronted)] p-3.5 transition-[background-color,border-color] duration-200 group-hover/stack-peek:bg-[var(--transparency-hover)]\",\n items.length > 2\n ? \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2),0_14px_0_-8px_var(--background-fronted),0_14px_0_-7px_var(--line-2)]\"\n : \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2)]\",\n hasWaiting &&\n \"border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)]\"\n )}\n >\n <span className=\"flex min-w-0 items-center justify-between gap-2.5\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <MessageCenterIdentityAvatarMark\n identity={firstItem.identity}\n provider={firstItem.provider}\n userId={firstItem.userId}\n />\n <span className=\"min-w-0 truncate text-[13px] font-bold leading-5 text-[var(--text-secondary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterStackSummaryCount\", {\n count: items.length\n })}\n </span>\n </span>\n <ChevronDown\n className=\"size-4 shrink-0 text-[var(--text-tertiary)] transition-transform duration-200 group-hover/stack-peek:translate-y-0.5 motion-reduce:transition-none\"\n aria-hidden=\"true\"\n />\n </span>\n <span className=\"min-w-0 rounded-md bg-transparency-block p-2.5 text-[13px] leading-[1.45] text-[var(--text-primary)]\">\n <span className=\"line-clamp-2 min-w-0 [overflow-wrap:anywhere]\">\n {messageCenterStackPreviewText(firstItem)}\n </span>\n </span>\n </span>\n </button>\n );\n}\n\nfunction messageCenterStackPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return (\n item.digest.primary.summary.trim() ||\n item.lastAgentMessageSummary.trim() ||\n normalizeAgentTitleText(item.title)\n );\n}\n\nexport function resolveMessageCenterNotificationAction(\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n }\n): string | null {\n if (input.action) {\n return normalizeMessageCenterNotificationAction(input.action);\n }\n\n if (!input.optionId) {\n return null;\n }\n\n const prompt = item.pendingPrompt;\n const option =\n prompt && \"options\" in prompt\n ? prompt.options.find((candidate) => candidate.id === input.optionId)\n : null;\n const optionToken = `${option?.kind ?? \"\"}:${input.optionId}`.toLowerCase();\n if (optionToken.includes(\"allow\") || optionToken.includes(\"accept\")) {\n return \"accept\";\n }\n if (\n optionToken.includes(\"deny\") ||\n optionToken.includes(\"reject\") ||\n optionToken.includes(\"disallow\")\n ) {\n return \"reject\";\n }\n return input.optionId;\n}\n\nexport function buildWorkspaceAgentInteractivePromptLabels(\n t: ReturnType<typeof useTranslation>[\"t\"],\n provider?: string\n) {\n return {\n approvalLead: t(\"agentHost.agentGui.approvalRequired\", {\n provider: provider\n ? workspaceAgentProviderLabel(provider)\n : t(\"agentHost.workspaceAgentsGenericAgentName\")\n }),\n planLead: t(\"agentHost.agentGui.planLead\"),\n planModes: [\n {\n id: \"acceptEdits\",\n label: t(\"agentHost.agentGui.planModes.acceptEdits.label\"),\n description: t(\"agentHost.agentGui.planModes.acceptEdits.description\")\n },\n {\n id: \"default\",\n label: t(\"agentHost.agentGui.planModes.askFirst.label\"),\n description: t(\"agentHost.agentGui.planModes.askFirst.description\")\n },\n {\n id: \"bypassPermissions\",\n label: t(\"agentHost.agentGui.planModes.allowAll.label\"),\n description: t(\"agentHost.agentGui.planModes.allowAll.description\")\n }\n ],\n stayInPlan: t(\"agentHost.agentGui.stayInPlan\"),\n sendFeedback: t(\"agentHost.agentGui.sendFeedback\"),\n feedbackPlaceholder: t(\"agentHost.agentGui.feedbackPlaceholder\"),\n previousQuestion: t(\"agentHost.agentGui.previousQuestion\"),\n nextQuestion: t(\"agentHost.agentGui.nextQuestion\"),\n submitAnswers: t(\"agentHost.agentGui.submitAnswers\"),\n answerPlaceholder: t(\"agentHost.agentGui.answerPlaceholder\"),\n waitingForAnswer: t(\"agentHost.agentGui.waitingForAnswer\"),\n planImplementationLead: t(\"agentHost.agentGui.planImplementationLead\"),\n planImplementationConfirm: t(\n \"agentHost.agentGui.planImplementationConfirm\"\n ),\n planImplementationFeedbackPlaceholder: t(\n \"agentHost.agentGui.planImplementationFeedbackPlaceholder\"\n ),\n planImplementationSend: t(\"agentHost.agentGui.planImplementationSend\"),\n planImplementationSkip: t(\"agentHost.agentGui.planImplementationSkip\")\n };\n}\n\nfunction normalizeMessageCenterNotificationAction(action: string): string {\n switch (action) {\n case \"allow\":\n return \"accept\";\n case \"deny\":\n return \"reject\";\n default:\n return action;\n }\n}\n\nfunction messageCenterVisibleSummary(\n item: WorkspaceAgentMessageCenterItem\n): string {\n const summary = item.digest.primary.summary.trim();\n if (\n item.pendingPrompt?.kind === \"approval\" &&\n isGenericApprovalSummary(summary)\n ) {\n return \"\";\n }\n return summary;\n}\n\nfunction isGenericApprovalSummary(summary: string): boolean {\n const normalized = summary.trim().toLowerCase();\n return normalized === \"approval\";\n}\n\nfunction MessageCenterSummary({\n emptyLabel,\n item,\n onLinkAction,\n summary\n}: {\n emptyLabel: string;\n item: WorkspaceAgentMessageCenterItem;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n summary: string;\n}): JSX.Element {\n \"use memo\";\n const summaryRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const handleLinkAction = useCallback(\n (action: WorkspaceLinkAction): void => {\n onLinkAction?.(\n action.type === \"open-agent-session\" && !action.provider\n ? { ...action, provider: item.provider }\n : action\n );\n },\n [item.provider, onLinkAction]\n );\n\n useLayoutEffect(() => {\n const element = summaryRef.current;\n if (!element) {\n return;\n }\n\n const updateOverflowState = () => {\n setIsOverflowing(element.scrollHeight > element.clientHeight + 1);\n };\n\n updateOverflowState();\n const resizeObserver = new ResizeObserver(updateOverflowState);\n resizeObserver.observe(element);\n return () => {\n resizeObserver.disconnect();\n };\n }, [summary]);\n\n return (\n <AgentVerticalScrollArea\n ref={summaryRef}\n className={cn(\n \"workspace-agent-message-center__summary workspace-agent-message-center__copy-text max-h-[160px] min-w-0 rounded-md bg-transparency-block text-[13px] leading-[1.45] text-[var(--text-primary)] [overflow-wrap:anywhere]\",\n isOverflowing && \"workspace-agent-message-center__summary--overflowing\"\n )}\n viewportClassName=\"workspace-agent-message-center__copy-text max-h-[160px] p-2.5 pr-4\"\n onPointerDown={stopMessageCenterTextPointerPropagation}\n scrollbarClassName=\"top-2 bottom-2 right-1.5\"\n syncKey={summary}\n >\n {summary ? (\n <AgentMessageMarkdown\n content={summary}\n className=\"[&_a]:text-[var(--tutti-purple)] [&_code]:text-[var(--text-secondary)] [&_hr]:border-t-[color-mix(in_srgb,var(--text-primary)_14%,transparent)] [&_ol]:!bg-transparent [&_p]:m-0 [&_th]:bg-[color-mix(in_srgb,var(--background-panel)_94%,var(--text-primary))] [&_th]:text-[var(--text-primary)] [&_ul]:!bg-transparent text-[var(--text-primary)]\"\n onLinkAction={handleLinkAction}\n workspaceLinkContext={{\n workspaceRoot: item.cwd || null,\n basePath: item.cwd,\n source: \"agent-markdown\"\n }}\n enableImageZoom\n />\n ) : (\n emptyLabel\n )}\n </AgentVerticalScrollArea>\n );\n}\n\nfunction MessageCenterOpenChatButton({\n alwaysVisible = false,\n item,\n label,\n onOpenChat,\n provider\n}: {\n alwaysVisible?: boolean;\n item: WorkspaceAgentMessageCenterItem;\n label: string;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n return (\n <div className=\"workspace-agent-message-center__footer flex min-w-0 items-center justify-between gap-2\">\n <MessageCenterIdentityLabel\n identity={item.identity}\n provider={provider}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"default\"\n className={cn(\n \"workspace-agent-message-center__open-chat-button h-auto gap-1.5 border-0 bg-transparent p-0 text-[var(--agent-gui-accent)] shadow-none transition-[color,opacity,visibility] hover:bg-transparent hover:text-[var(--agent-gui-accent)] focus-visible:bg-transparent focus-visible:text-[var(--agent-gui-accent)] active:bg-transparent\",\n !alwaysVisible &&\n \"invisible opacity-0 group-hover/message-card:visible group-hover/message-card:opacity-100 group-focus-within/message-card:visible group-focus-within/message-card:opacity-100\"\n )}\n onClick={() =>\n onOpenChat({\n agentSessionId: item.agentSessionId,\n provider: item.provider\n })\n }\n >\n <ExternalLink\n className=\"size-[15px]\"\n strokeWidth={2.2}\n aria-hidden=\"true\"\n />\n {label}\n </Button>\n </div>\n );\n}\n\nexport function MessageCenterIdentityLabel({\n identity,\n provider\n}: {\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n if (!identity) {\n return <AgentProviderLabel provider={provider} />;\n }\n\n const agentAvatarUrl =\n identity.agentAvatarUrl?.trim() || managedAgentRoundedIconUrl(provider);\n const title = `${identity.userName} & ${identity.agentName}`;\n\n return (\n <span\n className=\"workspace-agent-message-center__identity inline-flex min-w-0 max-w-full items-center gap-2\"\n title={title}\n >\n <MessageCenterIdentityAvatarStack\n userAvatarUrl={identity.userAvatarUrl}\n userName={identity.userName}\n agentAvatarUrl={agentAvatarUrl}\n />\n <span className=\"workspace-agent-message-center__identity-names flex min-w-0 items-center gap-1 truncate text-[var(--text-secondary)]\">\n <span className=\"min-w-0 truncate\">{identity.userName}</span>\n <span className=\"shrink-0 text-[var(--text-tertiary)]\">&</span>\n <span className=\"min-w-0 truncate\">{identity.agentName}</span>\n </span>\n </span>\n );\n}\n\nexport function MessageCenterIdentityAvatarMark({\n identity,\n provider,\n userId\n}: {\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n userId?: string | null;\n}): JSX.Element {\n \"use memo\";\n\n const userName = identity?.userName.trim() || userId?.trim() || \"\";\n if (!userName) {\n return (\n <img\n src={managedAgentRoundedIconUrl(provider)}\n alt=\"\"\n className=\"size-5 shrink-0 rounded-full\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n aria-hidden=\"true\"\n />\n );\n }\n\n return (\n <MessageCenterIdentityAvatarStack\n userAvatarUrl={identity?.userAvatarUrl}\n userName={userName}\n agentAvatarUrl={\n identity?.agentAvatarUrl?.trim() || managedAgentRoundedIconUrl(provider)\n }\n />\n );\n}\n\nexport function MessageCenterIdentityAvatarStack({\n agentAvatarUrl,\n userAvatarUrl: rawUserAvatarUrl,\n userName\n}: {\n agentAvatarUrl: string;\n userAvatarUrl?: string;\n userName: string;\n}): JSX.Element {\n \"use memo\";\n const [userAvatarFailed, setUserAvatarFailed] = useState(false);\n const userAvatarUrl = rawUserAvatarUrl?.trim() ?? \"\";\n const userImageUrl =\n userAvatarUrl.length > 0 && !userAvatarFailed\n ? userAvatarUrl\n : userAvatarPlaceholderUrl;\n\n useEffect(() => {\n setUserAvatarFailed(false);\n }, [userAvatarUrl]);\n\n return (\n <span\n className=\"workspace-agent-message-center__identity-avatar-stack inline-flex w-9 shrink-0 items-center\"\n aria-hidden=\"true\"\n >\n <span className=\"inline-flex size-5 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)] ring-2 ring-[var(--background-fronted)]\">\n <img\n src={userImageUrl}\n alt={userName}\n className=\"size-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={() => {\n setUserAvatarFailed(true);\n }}\n />\n </span>\n <span className=\"-ml-1.5 inline-flex size-5 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)] ring-2 ring-[var(--background-fronted)]\">\n <img\n src={agentAvatarUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n}\n\nfunction ProjectPathInfo({ path }: { path: string }): JSX.Element {\n \"use memo\";\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"workspace-agent-message-center__project-info-button invisible inline-flex size-5 shrink-0 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-[background-color,color,opacity,visibility] group-hover/message-card:visible group-hover/message-card:opacity-100 group-focus-within/message-card:visible group-focus-within/message-card:opacity-100 hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] focus-visible:bg-[var(--transparency-hover)] focus-visible:text-[var(--text-primary)] focus-visible:outline-none\"\n aria-label={path}\n >\n <Info className=\"size-3.5\" strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-[320px] text-[11px] [overflow-wrap:anywhere]\"\n >\n {path}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction AgentProviderLabel({ provider }: { provider: string }): JSX.Element {\n \"use memo\";\n const label = workspaceAgentProviderLabel(provider);\n\n return (\n <span className=\"workspace-agent-message-center__provider inline-flex min-w-0 max-w-full items-center gap-1.5\">\n <img\n src={managedAgentRoundedIconUrl(provider)}\n alt=\"\"\n className=\"workspace-agent-message-center__provider-icon size-5 shrink-0 rounded-full\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n aria-hidden=\"true\"\n />\n <span className=\"workspace-agent-message-center__provider-name min-w-0 truncate text-[var(--text-secondary)]\">\n {label}\n </span>\n </span>\n );\n}\n\nfunction statusClass(item: WorkspaceAgentMessageCenterItem): string {\n if (isWaitingMessageCenterItem(item)) {\n return \"waiting\";\n }\n if (item.status === \"idle\") {\n return \"completed\";\n }\n return item.status;\n}\n\nfunction messageCenterStatusTone(\n item: WorkspaceAgentMessageCenterItem\n): \"amber\" | \"blue\" | \"green\" | \"neutral\" | \"red\" {\n if (isWaitingMessageCenterItem(item)) {\n return \"amber\";\n }\n if (item.status === \"completed\" || item.status === \"idle\") {\n return \"green\";\n }\n if (item.status === \"canceled\") {\n return \"amber\";\n }\n if (item.status === \"failed\") {\n return \"red\";\n }\n if (item.status === \"working\") {\n return \"blue\";\n }\n return \"neutral\";\n}\n","import type { JSX } from \"react\";\nimport { ListFilter } from \"lucide-react\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport {\n messageCenterGroupLabel,\n type MessageCenterGroupBy,\n type MessageCenterProviderOption,\n type MessageCenterStatusFilter,\n type MessageCenterStatusOption\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport function MessageCenterViewMenu({\n filtersActive = false,\n groupBy,\n providerFilters,\n providerOptions,\n statusFilters,\n statusOptions,\n onClearFilters,\n onGroupByChange,\n onProviderToggle,\n onStatusToggle\n}: {\n filtersActive?: boolean;\n groupBy: MessageCenterGroupBy;\n providerFilters: Set<string> | null;\n providerOptions: MessageCenterProviderOption[];\n statusFilters: Set<MessageCenterStatusFilter> | null;\n statusOptions: MessageCenterStatusOption[];\n onClearFilters: () => void;\n onGroupByChange: (groupBy: MessageCenterGroupBy) => void;\n onProviderToggle: (provider: string) => void;\n onStatusToggle: (status: MessageCenterStatusFilter) => void;\n}): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterViewOptions\")}\n title={t(\"agentHost.workspaceAgentMessageCenterViewOptions\")}\n className={cn(\n \"relative size-8 shrink-0 rounded-md border bg-[var(--background-fronted)] shadow-none\",\n filtersActive\n ? \"border-[var(--border-focus)] text-[var(--accent)]\"\n : \"border-[var(--line-2)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n )}\n >\n <ListFilter className=\"size-4\" strokeWidth={2.1} aria-hidden=\"true\" />\n {filtersActive ? (\n <span\n aria-label={t(\n \"agentHost.workspaceAgentMessageCenterFilterActive\"\n )}\n className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full border border-[var(--background-panel)] bg-[var(--accent)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={8}\n className=\"min-w-[240px] p-1.5\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterGroupBy\")}\n </DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={groupBy}\n onValueChange={(value) =>\n onGroupByChange(value as MessageCenterGroupBy)\n }\n >\n {([\"priority\", \"status\", \"agent\", \"time\"] as const).map((value) => (\n <DropdownMenuRadioItem key={value} value={value}>\n {messageCenterGroupLabel(value, t)}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n\n <DropdownMenuSeparator />\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterFilterStatus\")}\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {statusOptions.map((option) => (\n <DropdownMenuCheckboxItem\n key={option.value}\n aria-label={`${option.label} ${option.count}`}\n checked={\n statusFilters === null || statusFilters.has(option.value)\n }\n onCheckedChange={() => onStatusToggle(option.value)}\n onSelect={(event) => event.preventDefault()}\n >\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n <span className=\"ml-auto text-[11px] text-[var(--text-tertiary)]\">\n {option.count}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n\n {providerOptions.length > 0 ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterFilterAgent\")}\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {providerOptions.map((option) => (\n <DropdownMenuCheckboxItem\n key={option.value}\n aria-label={`${option.label} ${option.count}`}\n checked={\n providerFilters === null ||\n providerFilters.has(option.value)\n }\n onCheckedChange={() => onProviderToggle(option.value)}\n onSelect={(event) => event.preventDefault()}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {option.label}\n </span>\n <span className=\"ml-auto text-[11px] text-[var(--text-tertiary)]\">\n {option.count}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n </>\n ) : null}\n\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onClearFilters}>\n {t(\"agentHost.workspaceAgentMessageCenterClearFilters\")}\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { TranslateFn } from \"../i18n/index\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem,\n type WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport type MessageCenterGroupBy = \"priority\" | \"status\" | \"agent\" | \"time\";\nexport type MessageCenterStatusFilter =\n | \"waiting\"\n | \"working\"\n | \"completed\"\n | \"failed\";\n\nexport type MessageCenterTranslate = TranslateFn;\n\nexport interface MessageCenterStatusOption {\n count: number;\n label: string;\n value: MessageCenterStatusFilter;\n}\n\nexport interface MessageCenterProviderOption {\n count: number;\n label: string;\n value: string;\n}\n\nexport interface MessageCenterGroup {\n id: string;\n identity?: WorkspaceAgentMessageCenterIdentity | null;\n label: string;\n items: WorkspaceAgentMessageCenterItem[];\n provider?: string;\n userId?: string | null;\n}\n\nexport interface MessageCenterAgentUserStack {\n id: string;\n provider: string;\n userId: string | null;\n items: WorkspaceAgentMessageCenterItem[];\n}\n\nexport function partitionMessageCenterItemsByAgentUser(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): MessageCenterAgentUserStack[] {\n const stacks = new Map<string, MessageCenterAgentUserStack>();\n for (const item of items) {\n const stackId = messageCenterAgentUserStackId(item);\n const stack = stacks.get(stackId);\n if (stack) {\n stack.items.push(item);\n } else {\n stacks.set(stackId, {\n id: stackId,\n provider: item.provider,\n userId: item.userId,\n items: [item]\n });\n }\n }\n return [...stacks.values()];\n}\n\nexport function messageCenterAgentUserStackId(\n item: Pick<WorkspaceAgentMessageCenterItem, \"provider\" | \"userId\">\n): string {\n const provider = item.provider.trim().toLowerCase() || \"unknown-agent\";\n const userId = item.userId?.trim() || \"unknown-user\";\n return `agent-user:${provider}:${userId}`;\n}\n\nexport function buildMessageCenterStatusOptions(\n counts: WorkspaceAgentMessageCenterModel[\"counts\"],\n t: MessageCenterTranslate\n): MessageCenterStatusOption[] {\n return [\n {\n count: counts.waiting,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWaiting\"),\n value: \"waiting\"\n },\n {\n count: counts.failed,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterFailed\"),\n value: \"failed\"\n },\n {\n count: counts.working,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n value: \"working\"\n },\n {\n count: counts.completed,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n value: \"completed\"\n }\n ];\n}\n\nexport function buildMessageCenterProviderOptions(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): MessageCenterProviderOption[] {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.provider, (counts.get(item.provider) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([value, count]) => ({\n count,\n label: workspaceAgentProviderLabel(value),\n value\n }))\n .sort((left, right) => left.label.localeCompare(right.label));\n}\n\nexport function itemMatchesViewFilters({\n item,\n providerFilters,\n statusFilters\n}: {\n item: WorkspaceAgentMessageCenterItem;\n providerFilters: Set<string> | null;\n statusFilters: Set<MessageCenterStatusFilter> | null;\n}): boolean {\n if (\n statusFilters &&\n !statusFilters.has(messageCenterStatusFilterValue(item))\n ) {\n return false;\n }\n if (providerFilters && !providerFilters.has(item.provider)) {\n return false;\n }\n return true;\n}\n\nexport function messageCenterStatusFilterValue(\n item: WorkspaceAgentMessageCenterItem\n): MessageCenterStatusFilter {\n if (isWaitingMessageCenterItem(item)) {\n return \"waiting\";\n }\n if (item.status === \"failed\") {\n return \"failed\";\n }\n if (item.status === \"working\") {\n return \"working\";\n }\n return \"completed\";\n}\n\nexport function groupMessageCenterItems(\n items: readonly WorkspaceAgentMessageCenterItem[],\n groupBy: MessageCenterGroupBy,\n t: MessageCenterTranslate\n): MessageCenterGroup[] {\n switch (groupBy) {\n case \"status\":\n return groupByFixedDefinitions(items, [\n {\n id: \"waiting\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWaiting\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"waiting\"\n },\n {\n id: \"failed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterFailed\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"failed\"\n },\n {\n id: \"working\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"working\"\n },\n {\n id: \"completed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"completed\"\n }\n ]);\n case \"agent\":\n return groupByDynamicKey(items, (item) => ({\n id: messageCenterAgentUserStackId(item),\n identity: item.identity,\n label: messageCenterAgentUserGroupLabel(item),\n provider: item.provider,\n userId: item.userId\n }));\n case \"time\":\n return groupByFixedDefinitions(items, [\n {\n id: \"today\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupToday\"),\n match: (item) => messageCenterTimeGroup(item) === \"today\"\n },\n {\n id: \"yesterday\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupYesterday\"),\n match: (item) => messageCenterTimeGroup(item) === \"yesterday\"\n },\n {\n id: \"previous-seven-days\",\n label: t(\n \"agentHost.workspaceAgentMessageCenterGroupPreviousSevenDays\"\n ),\n match: (item) =>\n messageCenterTimeGroup(item) === \"previous-seven-days\"\n },\n {\n id: \"older\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupOlder\"),\n match: (item) => messageCenterTimeGroup(item) === \"older\"\n }\n ]);\n case \"priority\":\n default: {\n const nowUnixMs = Date.now();\n return groupByFixedDefinitions(items, [\n {\n id: \"needs-attention\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\"),\n match: (item) =>\n messageCenterStatusFilterValue(item) === \"waiting\" ||\n messageCenterStatusFilterValue(item) === \"failed\"\n },\n {\n id: \"working\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"working\"\n },\n {\n id: \"recently-completed\",\n label: t(\n \"agentHost.workspaceAgentMessageCenterGroupRecentlyCompleted\"\n ),\n match: (item) => isRecentlyCompletedMessageCenterItem(item, nowUnixMs)\n },\n {\n id: \"completed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n match: (item) =>\n messageCenterStatusFilterValue(item) === \"completed\" &&\n !isRecentlyCompletedMessageCenterItem(item, nowUnixMs)\n }\n ]);\n }\n }\n}\n\nfunction messageCenterAgentUserGroupLabel(\n item: WorkspaceAgentMessageCenterItem\n): string {\n if (item.identity) {\n return `${item.identity.userName} & ${item.identity.agentName}`;\n }\n return workspaceAgentProviderLabel(item.provider);\n}\n\nconst RECENTLY_COMPLETED_WINDOW_MS = 10 * 60 * 1000;\n\nexport function isRecentlyCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem,\n nowUnixMs: number\n): boolean {\n if (messageCenterStatusFilterValue(item) !== \"completed\") {\n return false;\n }\n const completedAtUnixMs =\n item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n if (completedAtUnixMs <= 0) {\n return false;\n }\n return completedAtUnixMs >= nowUnixMs - RECENTLY_COMPLETED_WINDOW_MS;\n}\n\nexport function messageCenterGroupLabel(\n groupBy: MessageCenterGroupBy,\n t: MessageCenterTranslate\n): string {\n switch (groupBy) {\n case \"status\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupStatus\");\n case \"agent\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupAgent\");\n case \"time\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupTime\");\n case \"priority\":\n default:\n return t(\"agentHost.workspaceAgentMessageCenterGroupPriority\");\n }\n}\n\nexport function statusFilterSummary(\n statusFilters: Set<MessageCenterStatusFilter> | null,\n statusOptions: readonly MessageCenterStatusOption[]\n): string {\n if (statusFilters === null || statusFilters.size === statusOptions.length) {\n return statusOptions.map((option) => option.label).join(\", \");\n }\n return statusOptions\n .filter((option) => statusFilters.has(option.value))\n .map((option) => option.label)\n .join(\", \");\n}\n\nfunction groupByFixedDefinitions(\n items: readonly WorkspaceAgentMessageCenterItem[],\n definitions: Array<{\n id: string;\n label: string;\n match: (item: WorkspaceAgentMessageCenterItem) => boolean;\n }>\n): MessageCenterGroup[] {\n return definitions\n .map((definition) => ({\n id: definition.id,\n label: definition.label,\n items: items.filter(definition.match)\n }))\n .filter((group) => group.items.length > 0);\n}\n\nfunction groupByDynamicKey(\n items: readonly WorkspaceAgentMessageCenterItem[],\n keyForItem: (item: WorkspaceAgentMessageCenterItem) => {\n id: string;\n identity?: WorkspaceAgentMessageCenterIdentity | null;\n label: string;\n provider?: string;\n userId?: string | null;\n }\n): MessageCenterGroup[] {\n const groups = new Map<string, MessageCenterGroup>();\n for (const item of items) {\n const key = keyForItem(item);\n const group = groups.get(key.id);\n if (group) {\n group.items.push(item);\n if (!group.identity && key.identity) {\n group.identity = key.identity;\n group.label = key.label;\n }\n } else {\n groups.set(key.id, { ...key, items: [item] });\n }\n }\n return [...groups.values()];\n}\n\nfunction messageCenterTimeGroup(\n item: WorkspaceAgentMessageCenterItem\n): \"older\" | \"previous-seven-days\" | \"today\" | \"yesterday\" {\n const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n if (timestamp <= 0) {\n return \"older\";\n }\n const ageMs = Date.now() - timestamp;\n const dayMs = 24 * 60 * 60 * 1000;\n if (ageMs < dayMs) {\n return \"today\";\n }\n if (ageMs < dayMs * 2) {\n return \"yesterday\";\n }\n if (ageMs < dayMs * 7) {\n return \"previous-seven-days\";\n }\n return \"older\";\n}\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","cn","AgentVerticalScrollArea","latestAgentMessage","recordValue","stringValue","firstNonEmptyString","messageTimeUnixMs","includesAny","isAgentMessageRole","positiveNumber","useEffect","useRef","useState","cn","cn","jsx","cn","jsx","jsxs","useRef","useState","useEffect","cn","Button","cn","jsx","jsxs","Button","cn","jsx","jsxs","WorkspaceAgentMessageCenterPanel","useState","useRef","useMemo","useCallback","useLayoutEffect","useEffect","cn","Button"]}
|