@tutti-os/agent-gui 0.0.47 → 0.0.48
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.d.ts +4 -4
- package/dist/agent-conversation/index.js +6 -6
- package/dist/agent-message-center/index.d.ts +2 -2
- package/dist/agent-message-center/index.js +35 -13
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentConversationVM-BTMtRteS.d.ts → agentConversationVM-DSXrFL9v.d.ts} +5 -1
- package/dist/{agentGuiNodeTypes-B5Y6yDKy.d.ts → agentGuiNodeTypes-Bp1G8pOj.d.ts} +4 -4
- package/dist/app/renderer/agentactivity.css +62 -12
- package/dist/{chunk-XJXSR5XI.js → chunk-6YN7HQL5.js} +125 -34
- package/dist/chunk-6YN7HQL5.js.map +1 -0
- package/dist/{chunk-MCH35MAX.js → chunk-7W3VWU5R.js} +10 -6
- package/dist/chunk-7W3VWU5R.js.map +1 -0
- package/dist/{chunk-Q4X6Q4E6.js → chunk-EUOGIKT7.js} +2 -2
- package/dist/{chunk-ZAF4IVUT.js → chunk-LWMC2YA3.js} +431 -359
- package/dist/chunk-LWMC2YA3.js.map +1 -0
- package/dist/{chunk-5QTC2L52.js → chunk-N6HRVMIS.js} +2 -2
- package/dist/{chunk-KACBTC7Y.js → chunk-NETHPCSA.js} +11 -3
- package/dist/chunk-NETHPCSA.js.map +1 -0
- package/dist/{chunk-J3SJZMI5.js → chunk-OB43QOMC.js} +2 -2
- package/dist/{chunk-2FOBSURO.js → chunk-OYQZRLJQ.js} +2 -2
- package/dist/{chunk-7NCWSH7U.js → chunk-RNIY43TA.js} +5 -5
- package/dist/{chunk-VE6JY2TH.js → chunk-U6JWW45G.js} +1 -1
- package/dist/chunk-U6JWW45G.js.map +1 -0
- package/dist/{chunk-HCS3HUUX.js → chunk-VGDPBC6W.js} +37 -7
- package/dist/chunk-VGDPBC6W.js.map +1 -0
- package/dist/{chunk-KUCWRSXU.js → chunk-ZVKRNEOF.js} +2 -2
- package/dist/context-mention-palette/index.js +7 -7
- package/dist/i18n/index.d.ts +10 -2
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +290 -8
- package/dist/index.js +189 -44
- package/dist/index.js.map +1 -1
- package/dist/plan-decision-ops.d.ts +2 -2
- package/dist/queued-prompt-runtime.d.ts +3 -3
- package/dist/workbench/index.js +3 -3
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workspace-agent-generated-files.d.ts +1 -1
- package/dist/workspace-agent-generated-files.js +3 -3
- package/dist/{workspaceAgentActivityListViewModel-DLnMBMoh.d.ts → workspaceAgentActivityListViewModel-B5viw5Da.d.ts} +1 -1
- package/package.json +12 -12
- package/dist/chunk-HCS3HUUX.js.map +0 -1
- package/dist/chunk-KACBTC7Y.js.map +0 -1
- package/dist/chunk-MCH35MAX.js.map +0 -1
- package/dist/chunk-VE6JY2TH.js.map +0 -1
- package/dist/chunk-XJXSR5XI.js.map +0 -1
- package/dist/chunk-ZAF4IVUT.js.map +0 -1
- /package/dist/{chunk-Q4X6Q4E6.js.map → chunk-EUOGIKT7.js.map} +0 -0
- /package/dist/{chunk-5QTC2L52.js.map → chunk-N6HRVMIS.js.map} +0 -0
- /package/dist/{chunk-J3SJZMI5.js.map → chunk-OB43QOMC.js.map} +0 -0
- /package/dist/{chunk-2FOBSURO.js.map → chunk-OYQZRLJQ.js.map} +0 -0
- /package/dist/{chunk-7NCWSH7U.js.map → chunk-RNIY43TA.js.map} +0 -0
- /package/dist/{chunk-KUCWRSXU.js.map → chunk-ZVKRNEOF.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","../../agent-message-center/messageCenterFilterPreferences.ts","../../agent-message-center/workspaceAgentMessageCenterModelStability.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 StatusDot,\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 messageCenterStatusToneClass,\n resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard,\n type MessageCenterStatusTone,\n type WorkspaceAgentMessageCenterCardProps\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport {\n buildMessageCenterProviderOptions,\n buildMessageCenterStatusOptions,\n groupMessageCenterItems,\n itemMatchesViewFilters,\n messageCenterStackRenderId,\n messageCenterStackScrollSyncSegment,\n partitionMessageCenterItemsByAgentUser,\n statusFilterSummary,\n type MessageCenterGroupBy,\n type MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\nimport {\n readMessageCenterFilterPreferences,\n writeMessageCenterFilterPreferences\n} from \"./messageCenterFilterPreferences\";\n\nexport {\n buildWorkspaceAgentInteractivePromptLabels,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nexport type { WorkspaceAgentMessageCenterCardProps } from \"./WorkspaceAgentMessageCenterCard\";\n\nconst MESSAGE_CENTER_TOOLTIP_DELAY_MS = 300;\nconst MESSAGE_CENTER_STACK_EAGER_SUMMARY_COUNT = 8;\n\ntype WorkspaceAgentMessageCenterPromptInput = Parameters<\n WorkspaceAgentMessageCenterCardProps[\"onSubmitPrompt\"]\n>[0];\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 if (!open) {\n return null;\n }\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 [initialFilters] = useState(readMessageCenterFilterPreferences);\n const [groupBy, setGroupBy] = useState<MessageCenterGroupBy>(\n initialFilters.groupBy\n );\n const [statusFilters, setStatusFilters] =\n useState<Set<MessageCenterStatusFilter> | null>(\n initialFilters.statusFilters\n );\n const [providerFilters, setProviderFilters] = useState<Set<string> | null>(\n initialFilters.providerFilters\n );\n useEffect(() => {\n writeMessageCenterFilterPreferences({\n groupBy,\n statusFilters,\n providerFilters\n });\n }, [groupBy, statusFilters, providerFilters]);\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 itemGroupStacks = useMemo(\n () =>\n itemGroups.map((group) => ({\n ...group,\n stacks: partitionMessageCenterItemsByAgentUser(group.items)\n })),\n [itemGroups]\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 scrollSyncKey = useMemo(\n () =>\n [\n groupBy,\n activeStatusSummary,\n ...deckItems.map((item) => `deck:${item.id}`),\n ...itemGroupStacks.flatMap((group) =>\n group.stacks.map((stack) => {\n const stackId = messageCenterStackRenderId(group.id, stack.id);\n return messageCenterStackScrollSyncSegment({\n expanded: expandedStackIds.has(stackId),\n groupId: group.id,\n stack\n });\n })\n )\n ].join(\"|\"),\n [activeStatusSummary, deckItems, expandedStackIds, groupBy, itemGroupStacks]\n );\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 itemGroupStacks) {\n for (const stack of group.stacks) {\n if (\n stack.items.length > 1 &&\n stack.items.some((item) => item.id === highlightedItemId)\n ) {\n expandStack(messageCenterStackRenderId(group.id, stack.id));\n return;\n }\n }\n }\n }, [expandStack, highlightedItemId, itemGroupStacks, 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 const renderMessageCenterCard = useCallback(\n (\n item: WorkspaceAgentMessageCenterItem,\n options: { stackedIndex?: number } = {}\n ) => {\n const highlighted = item.id === highlightedItemId;\n const stackedIndex = options.stackedIndex;\n const card = (\n <MessageCenterRenderedCard\n key={item.agentSessionId}\n highlighted={highlighted}\n item={item}\n isSubmitting={\n submittingPromptKey ===\n `${item.agentSessionId}:${item.pendingPrompt?.requestId}`\n }\n lazySummary={\n stackedIndex !== undefined &&\n stackedIndex >= MESSAGE_CENTER_STACK_EAGER_SUMMARY_COUNT\n }\n registerNode={setItemNode}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={submitPrompt}\n />\n );\n\n if (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(stackedIndex * 24, 96)}ms`\n }}\n >\n {card}\n </div>\n );\n },\n [\n highlightedItemId,\n onLinkAction,\n onOpenChat,\n setItemNode,\n submitPrompt,\n submittingPromptKey\n ]\n );\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={scrollSyncKey}\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 {itemGroupStacks.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 return group.stacks.map((stack) => {\n const firstItem = stack.items[0];\n if (!firstItem) {\n return null;\n }\n if (stack.items.length === 1) {\n return renderMessageCenterCard(firstItem);\n }\n const stackId = messageCenterStackRenderId(\n group.id,\n stack.id\n );\n return (\n <MessageCenterStack\n key={stackId}\n expanded={expandedStackIds.has(stackId)}\n groupId={stackId}\n highlightedItemId={highlightedItemId}\n items={stack.items}\n renderCard={renderMessageCenterCard}\n onCollapse={collapseStack}\n onExpand={expandStack}\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\nconst MessageCenterRenderedCard = memo(function MessageCenterRenderedCard({\n highlighted,\n isSubmitting,\n item,\n lazySummary,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt,\n registerNode\n}: {\n highlighted: boolean;\n isSubmitting: boolean;\n item: WorkspaceAgentMessageCenterItem;\n lazySummary: boolean;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (\n item: WorkspaceAgentMessageCenterItem,\n input: WorkspaceAgentMessageCenterPromptInput\n ) => void;\n registerNode: (itemId: string, node: HTMLElement | null) => void;\n}): JSX.Element {\n const cardRef = useCallback(\n (node: HTMLElement | null) => {\n registerNode(item.id, node);\n },\n [item.id, registerNode]\n );\n const handleSubmitPrompt = useCallback(\n (input: WorkspaceAgentMessageCenterPromptInput) => {\n onSubmitPrompt(item, input);\n },\n [item, onSubmitPrompt]\n );\n\n return (\n <MessageCenterCard\n cardRef={cardRef}\n highlighted={highlighted}\n item={item}\n isSubmitting={isSubmitting}\n lazySummary={lazySummary}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={handleSubmitPrompt}\n />\n );\n});\n\nfunction MessageCenterGroupHeading({\n group\n}: {\n group: ReturnType<typeof groupMessageCenterItems>[number];\n}): JSX.Element {\n \"use memo\";\n const statusSignal = messageCenterGroupStatusSignal(group.id);\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\n className={cn(\n \"flex min-w-0 items-center gap-1.5 text-[11px] font-normal leading-4\",\n statusSignal\n ? messageCenterStatusToneClass(statusSignal.tone)\n : \"text-[var(--text-tertiary)]\"\n )}\n title={`${group.label} · ${group.items.length}`}\n >\n {statusSignal ? (\n <StatusDot\n tone={statusSignal.tone}\n pulse={statusSignal.pulse}\n size=\"sm\"\n title={group.label}\n />\n ) : null}\n <span className=\"min-w-0 truncate\">\n {group.label} · {group.items.length}\n </span>\n </h3>\n );\n}\n\nfunction messageCenterGroupStatusSignal(groupId: string): {\n pulse: boolean;\n tone: Exclude<MessageCenterStatusTone, \"neutral\">;\n} | null {\n switch (groupId) {\n case \"needs-attention\":\n case \"waiting\":\n return { pulse: true, tone: \"amber\" };\n case \"working\":\n return { pulse: true, tone: \"blue\" };\n case \"failed\":\n return { pulse: false, tone: \"red\" };\n case \"recently-completed\":\n case \"completed\":\n return { pulse: false, tone: \"green\" };\n default:\n return null;\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 resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary,\n type WorkspaceAgentMessageCenterDigest,\n type WorkspaceAgentMessageCenterDigestAgentSummary\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 imported?: boolean;\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 itemCutoffUnixMs?: number | null;\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 messageAnalysis = analyzeMessageCenterSessionMessages(\n session.agentSessionId,\n messages\n );\n const needsAttention =\n needsAttentionBySessionId.get(session.agentSessionId) ?? null;\n const status = displayStatuses.get(session.agentSessionId) ?? \"idle\";\n const lastAgentMessage = messageAnalysis.latestAgentMessage;\n const title = resolveSessionTitle(\n session,\n messageAnalysis.latestUserMessageSummary,\n messageAnalysis.firstUserMessageSummary\n );\n const pendingPrompt =\n messageAnalysis.pendingPrompt ??\n codexPlanImplementationPrompt(session, status, messages) ??\n fallbackPromptFromNeedsAttention(\n needsAttention,\n options.promptFallbackLabels\n );\n const digest = buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle: resolveDigestFallbackTitle(session),\n latestAgentMessage: messageAnalysis.latestDigestAgentMessage,\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 ...(isImportedMessageCenterSession(session) ? { imported: true } : {}),\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: messageAnalysis.latestTurnOutcome,\n sortTimeUnixMs\n } satisfies WorkspaceAgentMessageCenterItem;\n })\n .filter((item) =>\n isWithinMessageCenterItemCutoff(item, options.itemCutoffUnixMs)\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\nfunction isImportedMessageCenterSession(\n session: AgentActivitySession\n): boolean {\n return session.runtimeContext?.imported === true;\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\nfunction isWithinMessageCenterItemCutoff(\n item: WorkspaceAgentMessageCenterItem,\n cutoffUnixMs: number | null | undefined\n): boolean {\n if (!Number.isFinite(cutoffUnixMs)) {\n return true;\n }\n if (isWaitingMessageCenterItem(item)) {\n return true;\n }\n const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n return timestamp >= Number(cutoffUnixMs);\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 latestUserMessageSummary: string,\n firstUserMessageSummary: string\n): string {\n const latest = latestUserMessageSummary.trim();\n if (latest) {\n return latest;\n }\n const title = session.title.trim();\n if (title) {\n return title;\n }\n return firstUserMessageSummary || session.provider || session.agentSessionId;\n}\n\nfunction resolveDigestFallbackTitle(session: AgentActivitySession): string {\n return session.title.trim() || session.provider || session.agentSessionId;\n}\n\ninterface MessageCenterSessionMessageAnalysis {\n firstUserMessageSummary: string;\n latestUserMessageSummary: string;\n latestDigestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null;\n latestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null;\n latestTurnOutcome: WorkspaceAgentMessageCenterTurnOutcome | null;\n pendingPrompt: AgentConversationPromptVM | null;\n}\n\ninterface PendingPromptCandidate {\n message: AgentActivityMessage;\n prompt: AgentConversationPromptVM;\n}\n\ninterface TurnOutcomeCandidate {\n message: AgentActivityMessage;\n outcome: WorkspaceAgentMessageCenterTurnOutcome;\n}\n\nfunction analyzeMessageCenterSessionMessages(\n agentSessionId: string,\n messages: readonly AgentActivityMessage[]\n): MessageCenterSessionMessageAnalysis {\n let firstUserMessageSummary = \"\";\n let latestUserMessageSummary = \"\";\n let latestUserMessageAtUnixMs = Number.NEGATIVE_INFINITY;\n let latestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null =\n null;\n let latestDigestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null =\n null;\n let latestPendingPrompt: PendingPromptCandidate | null = null;\n let latestOutcome: TurnOutcomeCandidate | null = null;\n\n for (const message of messages) {\n if (isUserMessageRole(message.role)) {\n const summary = messageSummary(message);\n if (!firstUserMessageSummary && summary) {\n firstUserMessageSummary = summary;\n }\n if (summary) {\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (occurredAtUnixMs >= latestUserMessageAtUnixMs) {\n latestUserMessageSummary = summary;\n latestUserMessageAtUnixMs = occurredAtUnixMs;\n }\n }\n }\n\n if (isAgentMessageRole(message.role)) {\n const summary = messageSummary(message);\n if (summary) {\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (\n !latestAgentMessage ||\n occurredAtUnixMs >= latestAgentMessage.occurredAtUnixMs\n ) {\n latestAgentMessage = { summary, occurredAtUnixMs };\n }\n }\n const digestSummary =\n resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary(message);\n if (digestSummary) {\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (\n !latestDigestAgentMessage ||\n occurredAtUnixMs >= latestDigestAgentMessage.occurredAtUnixMs\n ) {\n latestDigestAgentMessage = {\n summary: digestSummary,\n occurredAtUnixMs\n };\n }\n }\n\n const outcome = turnOutcomeFromMessage(agentSessionId, message);\n if (\n outcome &&\n (!latestOutcome ||\n compareMessagesByRecentTime(message, latestOutcome.message) < 0)\n ) {\n latestOutcome = { message, outcome };\n }\n }\n\n if (!isTerminalMessageStatus(message.status)) {\n const prompt = promptFromMessage(message);\n if (\n prompt &&\n (!latestPendingPrompt ||\n compareMessagesByRecentTime(message, latestPendingPrompt.message) < 0)\n ) {\n latestPendingPrompt = { message, prompt };\n }\n }\n }\n\n return {\n firstUserMessageSummary,\n latestUserMessageSummary,\n latestDigestAgentMessage,\n latestAgentMessage,\n latestTurnOutcome: latestOutcome?.outcome ?? null,\n pendingPrompt: latestPendingPrompt?.prompt ?? null\n };\n}\n\nfunction promptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n return (\n approvalPromptFromMessage(message) ??\n askUserPromptFromMessage(message) ??\n exitPlanPromptFromMessage(message)\n );\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 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 questions = normalizeAskUserQuestions(input.questions);\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 turnOutcomeFromMessage(\n agentSessionId: string,\n message: AgentActivityMessage\n): WorkspaceAgentMessageCenterTurnOutcome | null {\n const status = outcomeStatusFromMessage(message);\n if (!status) {\n return null;\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 notificationKey: `${agentSessionId}:${notificationSubject}:${status}`,\n status,\n 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 isUserMessageRole(role: string): boolean {\n return role.trim().toLowerCase() === \"user\";\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 WorkspaceAgentMessageCenterDigestAgentSummary {\n summary: string;\n occurredAtUnixMs: number;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterDigestInput {\n fallbackTitle: string;\n latestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null;\n needsAttention: AgentActivityNeedsAttentionItem | null;\n pendingPrompt: AgentConversationPromptVM | null;\n status: WorkspaceAgentActivityStatus;\n}\n\nexport function buildWorkspaceAgentMessageCenterDigest(\n input: BuildWorkspaceAgentMessageCenterDigestInput\n): WorkspaceAgentMessageCenterDigest {\n const {\n fallbackTitle,\n latestAgentMessage,\n needsAttention,\n pendingPrompt,\n status\n } = input;\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\nexport function resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary(\n message: AgentActivityMessage\n): string {\n if (!isAgentMessageRole(message.role)) {\n return \"\";\n }\n return meaningfulMessageSummary(message);\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 const payload = recordValue(message.payload);\n const isToolMessage = isToolLikeMessage(message, payload);\n const candidates = messageSummaryCandidates(payload, isToolMessage);\n const structuralLabelTokens = isToolMessage\n ? structuralToolLabelTokens(message, payload)\n : null;\n const hasToolDigestSignal =\n isToolMessage && candidates.some(isToolDigestSignalCandidate);\n\n for (const candidate of candidates) {\n if (\n !isGenericToolLabelSummary(candidate, {\n hasToolDigestSignal,\n isToolMessage,\n structuralLabelTokens\n })\n ) {\n return decorateMessageSummary(message, candidate, isToolMessage);\n }\n }\n return \"\";\n}\n\nfunction messageSummaryCandidates(\n payload: Record<string, unknown>,\n isToolMessage: boolean\n): MessageSummaryCandidate[] {\n const explicitCandidates = [\n summaryCandidate(\"payload.summary\", payload.summary),\n summaryCandidate(\"payload.displayPrompt\", payload.displayPrompt),\n summaryCandidate(\"payload.text\", payload.text),\n summaryCandidate(\"payload.content\", payload.content),\n summaryCandidate(\"payload.message\", payload.message),\n summaryCandidate(\"payload.body\", payload.body)\n ];\n if (!isToolMessage) {\n return [\n ...explicitCandidates,\n summaryCandidate(\"payload.title\", payload.title)\n ].filter((candidate): candidate is MessageSummaryCandidate =>\n Boolean(candidate)\n );\n }\n return [\n ...explicitCandidates,\n toolErrorSummaryCandidate(payload),\n toolOutputSummaryCandidate(payload),\n toolInputSummaryCandidate(payload),\n summaryCandidate(\"payload.title\", 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 candidate: MessageSummaryCandidate,\n context: {\n hasToolDigestSignal: boolean;\n isToolMessage: boolean;\n structuralLabelTokens: Set<string> | null;\n }\n): boolean {\n if (!context.isToolMessage) {\n return false;\n }\n const normalizedSummary = normalizeToken(candidate.summary);\n if (!normalizedSummary) {\n return true;\n }\n if (context.structuralLabelTokens?.has(normalizedSummary)) {\n return true;\n }\n return (\n candidate.source === \"payload.title\" &&\n !context.hasToolDigestSignal &&\n looksLikeBareLabel(candidate.summary)\n );\n}\n\nfunction decorateMessageSummary(\n message: AgentActivityMessage,\n candidate: MessageSummaryCandidate,\n isToolMessage: boolean\n): string {\n if (!isToolMessage) {\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(\n message: AgentActivityMessage,\n payload = recordValue(message.payload)\n): boolean {\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(\n message: AgentActivityMessage,\n payload = recordValue(message.payload)\n): Set<string> {\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 isToolDigestSignalCandidate(\n candidate: MessageSummaryCandidate\n): boolean {\n return (\n candidate.source === \"tool.error\" ||\n candidate.source === \"tool.output\" ||\n candidate.source === \"tool.input\"\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 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 cloneElement,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type FocusEvent as ReactFocusEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport {\n AppWindow,\n ChevronDown,\n ChevronUp,\n ExternalLink,\n Info\n} from \"lucide-react\";\nimport {\n Button,\n cn,\n StatusDot,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\nimport { getActiveUiLanguage, useTranslation } from \"../i18n/index\";\nimport { formatAgentSessionMentionText } from \"../shared/utils/agentSessionMentionText\";\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 \"../shared/userAvatarPlaceholder\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\nimport { formatAgentGuiConversationPlainTitle } from \"../workbench/sessionTitle\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n highlighted?: boolean;\n interactive?: boolean;\n isSubmitting: boolean;\n lazySummary?: 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\ninterface WorkspaceAgentMessageCenterStackProps {\n className?: string;\n expanded: boolean;\n groupId: string;\n highlightedItemId?: string | null;\n items: WorkspaceAgentMessageCenterItem[];\n renderCard: (\n item: WorkspaceAgentMessageCenterItem,\n options?: { stackedIndex?: number }\n ) => ReactNode;\n onCollapse: (groupId: string) => void;\n onExpand: (groupId: string) => void;\n}\n\nfunction stopMessageCenterTextPointerPropagation(\n event: ReactPointerEvent<HTMLElement>\n): void {\n event.stopPropagation();\n}\n\nexport const WorkspaceAgentMessageCenterCard = memo(\n function WorkspaceAgentMessageCenterCard({\n cardRef,\n highlighted = false,\n interactive = true,\n item,\n isSubmitting,\n lazySummary = false,\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 = formatAgentGuiConversationPlainTitle(item, {\n language: getActiveUiLanguage()\n });\n const summary = messageCenterVisibleSummary(item);\n const displayStatus = statusClass(item);\n const statusTone = messageCenterStatusTone(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 <LazyMessageCenterTooltip\n content={displayTitle}\n side=\"top\"\n align=\"start\"\n className=\"max-w-[min(360px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n >\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 </LazyMessageCenterTooltip>\n {item.cwd ? <ProjectPathInfo path={item.cwd} /> : null}\n </div>\n <span\n className={cn(\n \"workspace-agent-message-center__status inline-flex shrink-0 items-center gap-1.5 text-[11px] font-semibold leading-4\",\n messageCenterStatusToneClass(statusTone)\n )}\n data-status={displayStatus}\n title={statusLabel}\n >\n <StatusDot\n tone={statusTone}\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 lazy={lazySummary}\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);\n\nconst STACK_PRESENCE_FALLBACK_MS = 380;\nconst MESSAGE_CENTER_STACK_INITIAL_RENDER_COUNT = 24;\nconst MESSAGE_CENTER_STACK_RENDER_BATCH_SIZE = 24;\nconst MESSAGE_CENTER_STACK_RENDER_BATCH_DELAY_MS = 40;\nconst MESSAGE_CENTER_SUMMARY_LAZY_ROOT_MARGIN = \"480px 0px\";\nconst MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS = 80;\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 const WorkspaceAgentMessageCenterStack = memo(\n function WorkspaceAgentMessageCenterStack({\n className,\n expanded,\n groupId,\n highlightedItemId,\n items,\n renderCard,\n onCollapse,\n onExpand\n }: WorkspaceAgentMessageCenterStackProps): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const summaryRegion = useStackRegionPresence(!expanded);\n const cardsRegion = useStackRegionPresence(expanded);\n const visibleItems = useBatchedMessageCenterStackItems({\n expanded,\n highlightedItemId,\n items,\n mounted: cardsRegion.mounted\n });\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(\n \"agentHost.workspaceAgentMessageCenterStackSummaryCount\",\n {\n count: items.length\n }\n )}\n </span>\n </span>\n <LazyMessageCenterTooltip\n content={collapseLabel}\n side=\"top\"\n align=\"center\"\n >\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(groupId)}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden=\"true\" />\n </Button>\n </LazyMessageCenterTooltip>\n </div>\n <div className=\"flex min-w-0 flex-col gap-2.5\">\n {visibleItems.map((item, stackedIndex) =>\n renderCard(item, { stackedIndex })\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n },\n areMessageCenterStackPropsEqual\n);\n\nfunction areMessageCenterStackPropsEqual(\n previous: WorkspaceAgentMessageCenterStackProps,\n next: WorkspaceAgentMessageCenterStackProps\n): boolean {\n if (\n previous.className !== next.className ||\n previous.expanded !== next.expanded ||\n previous.groupId !== next.groupId ||\n previous.onCollapse !== next.onCollapse ||\n previous.onExpand !== next.onExpand ||\n previous.renderCard !== next.renderCard\n ) {\n return false;\n }\n if (next.expanded) {\n return (\n previous.highlightedItemId === next.highlightedItemId &&\n previous.items === next.items\n );\n }\n return (\n messageCenterCollapsedStackSignature(previous.items) ===\n messageCenterCollapsedStackSignature(next.items)\n );\n}\n\nfunction messageCenterCollapsedStackSignature(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): string {\n const firstItem = items[0];\n if (!firstItem) {\n return \"0\";\n }\n const hasWaiting = items.some(isWaitingMessageCenterItem) ? \"1\" : \"0\";\n return [\n items.length,\n firstItem.id,\n firstItem.provider,\n firstItem.userId ?? \"\",\n firstItem.identity?.userName ?? \"\",\n firstItem.identity?.agentName ?? \"\",\n hasWaiting,\n messageCenterStackPreviewText(firstItem)\n ].join(\":\");\n}\n\nfunction useBatchedMessageCenterStackItems({\n expanded,\n highlightedItemId,\n items,\n mounted\n}: {\n expanded: boolean;\n highlightedItemId?: string | null;\n items: WorkspaceAgentMessageCenterItem[];\n mounted: boolean;\n}): WorkspaceAgentMessageCenterItem[] {\n const limit = items.length;\n const highlightedIndex =\n highlightedItemId === null || highlightedItemId === undefined\n ? -1\n : items.findIndex((item) => item.id === highlightedItemId);\n const initialCount = Math.min(\n limit,\n Math.max(MESSAGE_CENTER_STACK_INITIAL_RENDER_COUNT, highlightedIndex + 1)\n );\n const [renderCount, setRenderCount] = useState(initialCount);\n\n useEffect(() => {\n if (!mounted) {\n setRenderCount(initialCount);\n return;\n }\n setRenderCount((current) =>\n Math.min(Math.max(current, initialCount), limit)\n );\n }, [initialCount, limit, mounted]);\n\n useEffect(() => {\n if (!expanded || !mounted || renderCount >= limit) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n setRenderCount((current) =>\n Math.min(current + MESSAGE_CENTER_STACK_RENDER_BATCH_SIZE, limit)\n );\n }, MESSAGE_CENTER_STACK_RENDER_BATCH_DELAY_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [expanded, limit, mounted, renderCount]);\n\n return items.slice(0, Math.min(renderCount, limit));\n}\n\nfunction MessageCenterStackSummary({\n groupId,\n items,\n onExpand\n}: {\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n onExpand: (groupId: string) => 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(groupId)}\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 {messageCenterStackPreviewNodes(firstItem)}\n </span>\n </span>\n </span>\n </button>\n );\n}\n\nfunction messageCenterStackRawPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return (\n item.digest.primary.summary.trim() ||\n item.lastAgentMessageSummary.trim() ||\n item.title\n );\n}\n\nexport function messageCenterStackPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return formatAgentSessionMentionText(messageCenterStackRawPreviewText(item), {\n language: getActiveUiLanguage()\n });\n}\n\nconst MESSAGE_CENTER_PREVIEW_MARKDOWN_LINK_PATTERN =\n /\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(([^)\\s]+)\\)/g;\nconst MESSAGE_CENTER_PREVIEW_LABEL_ESCAPE_PATTERN = /\\\\([\\\\[\\]()])/g;\n\ntype MessageCenterPreviewMentionKind =\n | \"session\"\n | \"workspace-app\"\n | \"workspace-issue\";\n\n/**\n * 收起态预览只展示纯文本 + 一个静态(不可点击)的 mention 图标,复用\n * AgentMessageMarkdown 里那套富文本 chip 的视觉样式,但不渲染成 <a>——\n * 这块预览本身嵌套在外层切换展开/收起的 <button> 里,塞一个可点击链接\n * 会出现交互元素嵌套交互元素的问题。\n */\nexport function messageCenterStackPreviewNodes(\n item: WorkspaceAgentMessageCenterItem\n): ReactNode[] {\n const text = messageCenterStackRawPreviewText(item);\n const nodes: ReactNode[] = [];\n let lastIndex = 0;\n let mentionIndex = 0;\n\n for (const match of text.matchAll(\n MESSAGE_CENTER_PREVIEW_MARKDOWN_LINK_PATTERN\n )) {\n const [fullMatch, rawLabel = \"\", href = \"\"] = match;\n const matchStart = match.index ?? 0;\n if (matchStart > lastIndex) {\n nodes.push(text.slice(lastIndex, matchStart));\n }\n\n const label = rawLabel.replace(\n MESSAGE_CENTER_PREVIEW_LABEL_ESCAPE_PATTERN,\n \"$1\"\n );\n const mention = parseRichTextMentionHref(href, label);\n if (!mention) {\n nodes.push(isRichTextMentionHref(href) ? label : fullMatch);\n } else {\n const kind = messageCenterPreviewMentionKind(mention.providerId);\n const displayLabel = label || mention.label;\n nodes.push(\n kind ? (\n <MessageCenterPreviewMentionChip\n key={`mention-${mentionIndex}`}\n kind={kind}\n label={displayLabel}\n />\n ) : (\n displayLabel\n )\n );\n mentionIndex += 1;\n }\n\n lastIndex = matchStart + fullMatch.length;\n }\n\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex));\n }\n\n return nodes;\n}\n\nfunction messageCenterPreviewMentionKind(\n providerId: string\n): MessageCenterPreviewMentionKind | null {\n switch (providerId.trim().toLowerCase()) {\n case \"agent-session\":\n return \"session\";\n case \"workspace-app\":\n return \"workspace-app\";\n case \"workspace-issue\":\n return \"workspace-issue\";\n default:\n return null;\n }\n}\n\nfunction MessageCenterPreviewMentionChip({\n kind,\n label\n}: {\n kind: MessageCenterPreviewMentionKind;\n label: string;\n}): ReactElement {\n return (\n <span\n className=\"tsh-agent-object-token tsh-agent-object-token--entity\"\n data-agent-mention-kind={kind}\n >\n <span className=\"tsh-agent-object-token__kind\" aria-hidden=\"true\">\n {kind === \"workspace-app\" ? (\n <AppWindow className=\"size-3.5\" aria-hidden=\"true\" />\n ) : (\n <span\n className=\"tsh-agent-object-token__kind-icon\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n <span className=\"tsh-agent-object-token__main\">{label}</span>\n </span>\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 lazy,\n onLinkAction,\n summary\n}: {\n emptyLabel: string;\n item: WorkspaceAgentMessageCenterItem;\n lazy: boolean;\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 shouldRenderRichSummary = useLazyMessageCenterSummaryReady(\n summaryRef,\n lazy\n );\n const shouldMeasureOverflow = useDeferredMessageCenterSummaryMeasureReady(\n summaryRef,\n shouldRenderRichSummary\n );\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 useEffect(() => {\n if (!shouldMeasureOverflow) {\n setIsOverflowing(false);\n return undefined;\n }\n const element = summaryRef.current;\n if (!element) {\n return undefined;\n }\n\n const updateOverflowState = () => {\n setIsOverflowing(element.scrollHeight > element.clientHeight + 1);\n };\n\n let resizeObserver: ResizeObserver | null = null;\n const timeoutId = window.setTimeout(() => {\n updateOverflowState();\n resizeObserver = new ResizeObserver(updateOverflowState);\n resizeObserver.observe(element);\n }, MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS);\n return () => {\n window.clearTimeout(timeoutId);\n resizeObserver?.disconnect();\n };\n }, [shouldMeasureOverflow, 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 && shouldRenderRichSummary ? (\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 ) : summary ? (\n <div className=\"whitespace-pre-wrap [overflow-wrap:anywhere]\">\n {summary}\n </div>\n ) : (\n emptyLabel\n )}\n </AgentVerticalScrollArea>\n );\n}\n\nfunction useLazyMessageCenterSummaryReady(\n ref: RefObject<HTMLDivElement | null>,\n lazy: boolean\n): boolean {\n const [ready, setReady] = useState(!lazy);\n\n useEffect(() => {\n setReady(!lazy);\n }, [lazy]);\n\n useEffect(() => {\n if (!lazy) {\n return undefined;\n }\n if (ready) {\n return undefined;\n }\n const element = ref.current;\n if (!element || typeof IntersectionObserver === \"undefined\") {\n setReady(true);\n return undefined;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setReady(true);\n observer.disconnect();\n }\n },\n { rootMargin: MESSAGE_CENTER_SUMMARY_LAZY_ROOT_MARGIN }\n );\n observer.observe(element);\n return () => observer.disconnect();\n }, [lazy, ready, ref]);\n\n return ready;\n}\n\nfunction useDeferredMessageCenterSummaryMeasureReady(\n ref: RefObject<HTMLDivElement | null>,\n enabled: boolean\n): boolean {\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n setReady(false);\n return undefined;\n }\n if (ready) {\n return undefined;\n }\n const element = ref.current;\n if (!element || typeof IntersectionObserver === \"undefined\") {\n const timeoutId = window.setTimeout(\n () => setReady(true),\n MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS\n );\n return () => {\n window.clearTimeout(timeoutId);\n };\n }\n\n let timeoutId: number | null = null;\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries.some((entry) => entry.isIntersecting)) {\n return;\n }\n observer.disconnect();\n timeoutId = window.setTimeout(\n () => setReady(true),\n MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS\n );\n },\n { rootMargin: MESSAGE_CENTER_SUMMARY_LAZY_ROOT_MARGIN }\n );\n observer.observe(element);\n return () => {\n observer.disconnect();\n if (timeoutId !== null) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [enabled, ready, ref]);\n\n return ready;\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(--accent-codex)] shadow-none transition-[color,opacity,visibility] hover:bg-transparent hover:text-[var(--accent-codex)] focus-visible:bg-transparent focus-visible:text-[var(--accent-codex)] 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-[13px] leading-5 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 <LazyMessageCenterTooltip\n content={path}\n side=\"top\"\n align=\"start\"\n className=\"max-w-[320px] text-[11px] [overflow-wrap:anywhere]\"\n >\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 </LazyMessageCenterTooltip>\n );\n}\n\ntype LazyTooltipChildProps = {\n onBlur?: (event: ReactFocusEvent<HTMLElement>) => void;\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onPointerEnter?: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: ReactPointerEvent<HTMLElement>) => void;\n};\n\nfunction LazyMessageCenterTooltip({\n align,\n children,\n className,\n content,\n side\n}: {\n align?: \"center\" | \"end\" | \"start\";\n children: ReactElement<LazyTooltipChildProps>;\n className?: string;\n content: ReactNode;\n side?: \"bottom\" | \"left\" | \"right\" | \"top\";\n}): JSX.Element {\n \"use memo\";\n const [hydrated, setHydrated] = useState(false);\n const [open, setOpen] = useState(false);\n\n const showTooltip = useCallback(() => {\n setHydrated(true);\n setOpen(true);\n }, []);\n const hideTooltip = useCallback(() => {\n setOpen(false);\n }, []);\n\n const trigger = cloneElement(children, {\n onBlur: (event: ReactFocusEvent<HTMLElement>) => {\n children.props.onBlur?.(event);\n hideTooltip();\n },\n onFocus: (event: ReactFocusEvent<HTMLElement>) => {\n children.props.onFocus?.(event);\n showTooltip();\n },\n onPointerEnter: (event: ReactPointerEvent<HTMLElement>) => {\n children.props.onPointerEnter?.(event);\n showTooltip();\n },\n onPointerLeave: (event: ReactPointerEvent<HTMLElement>) => {\n children.props.onPointerLeave?.(event);\n hideTooltip();\n }\n });\n\n if (!hydrated) {\n return trigger;\n }\n\n return (\n <Tooltip open={open} onOpenChange={setOpen}>\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n <TooltipContent side={side} align={align} className={className}>\n {content}\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-[13px] leading-5 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\nexport type MessageCenterStatusTone =\n | \"amber\"\n | \"blue\"\n | \"green\"\n | \"neutral\"\n | \"red\";\n\nfunction messageCenterStatusTone(\n item: WorkspaceAgentMessageCenterItem\n): MessageCenterStatusTone {\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\nexport function messageCenterStatusToneClass(\n tone: MessageCenterStatusTone\n): string {\n switch (tone) {\n case \"amber\":\n return \"text-[var(--state-warning)]\";\n case \"blue\":\n return \"text-[var(--status-running)]\";\n case \"green\":\n return \"text-[var(--state-success)]\";\n case \"red\":\n return \"text-[var(--state-danger)]\";\n case \"neutral\":\n return \"text-[var(--text-secondary)]\";\n }\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 <MessageCenterOptionWithCount\n count={option.count}\n label={option.label}\n />\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 <MessageCenterOptionWithCount\n count={option.count}\n label={option.label}\n />\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\nfunction MessageCenterOptionWithCount({\n count,\n label\n}: {\n count: number;\n label: string;\n}): JSX.Element {\n return (\n <span className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <span className=\"shrink-0 tabular-nums text-[11px] text-[var(--text-tertiary)]\">\n {count}\n </span>\n </span>\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 messageCenterStackRenderId(\n groupId: string,\n stackId: string\n): string {\n return groupId === stackId ? stackId : `${groupId}:${stackId}`;\n}\n\nexport function messageCenterStackScrollSyncSegment({\n expanded,\n groupId,\n stack\n}: {\n expanded: boolean;\n groupId: string;\n stack: MessageCenterAgentUserStack;\n}): string {\n const stackId = messageCenterStackRenderId(groupId, stack.id);\n if (expanded) {\n return `expanded:${stackId}:${stack.items.map((item) => item.id).join(\"|\")}`;\n }\n return `collapsed:${stackId}:${messageCenterCollapsedStackSignature(\n stack.items\n )}`;\n}\n\nfunction messageCenterCollapsedStackSignature(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): string {\n const firstItem = items[0];\n if (!firstItem) {\n return \"0\";\n }\n const hasWaiting = items.some(isWaitingMessageCenterItem) ? \"1\" : \"0\";\n const summary =\n firstItem.digest.primary.summary.trim() ||\n firstItem.lastAgentMessageSummary.trim() ||\n firstItem.title.trim();\n return [\n items.length,\n firstItem.id,\n firstItem.provider,\n firstItem.userId ?? \"\",\n firstItem.identity?.userName ?? \"\",\n firstItem.identity?.agentName ?? \"\",\n hasWaiting,\n summary\n ].join(\":\");\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) => 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: \"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 if (item.imported) {\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","import type {\n MessageCenterGroupBy,\n MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport const messageCenterFiltersStorageKey =\n \"tutti.agent-message-center.filters\";\n\nexport interface MessageCenterFilterPreferences {\n groupBy: MessageCenterGroupBy;\n statusFilters: Set<MessageCenterStatusFilter> | null;\n providerFilters: Set<string> | null;\n}\n\nconst messageCenterGroupByValues = new Set<MessageCenterGroupBy>([\n \"priority\",\n \"status\",\n \"agent\",\n \"time\"\n]);\n\nconst messageCenterStatusFilterValues = new Set<MessageCenterStatusFilter>([\n \"waiting\",\n \"working\",\n \"completed\",\n \"failed\"\n]);\n\nconst defaultMessageCenterFilterPreferences: MessageCenterFilterPreferences = {\n groupBy: \"priority\",\n statusFilters: null,\n providerFilters: null\n};\n\nexport function readMessageCenterFilterPreferences(): MessageCenterFilterPreferences {\n if (typeof window === \"undefined\") {\n return defaultMessageCenterFilterPreferences;\n }\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(messageCenterFiltersStorageKey);\n } catch {\n return defaultMessageCenterFilterPreferences;\n }\n if (raw === null) {\n return defaultMessageCenterFilterPreferences;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return defaultMessageCenterFilterPreferences;\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n return defaultMessageCenterFilterPreferences;\n }\n const record = parsed as Record<string, unknown>;\n return {\n groupBy: resolveStoredGroupBy(record.groupBy),\n statusFilters: resolveStoredStatusFilters(record.statusFilters),\n providerFilters: resolveStoredProviderFilters(record.providerFilters)\n };\n}\n\nexport function writeMessageCenterFilterPreferences(\n preferences: MessageCenterFilterPreferences\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const serialized = JSON.stringify({\n groupBy: preferences.groupBy,\n statusFilters: preferences.statusFilters\n ? [...preferences.statusFilters]\n : null,\n providerFilters: preferences.providerFilters\n ? [...preferences.providerFilters]\n : null\n });\n try {\n window.localStorage.setItem(messageCenterFiltersStorageKey, serialized);\n } catch {\n // Ignore persistence failures (private mode, quota); the in-memory\n // selection still works for this session.\n }\n}\n\nfunction resolveStoredGroupBy(value: unknown): MessageCenterGroupBy {\n return typeof value === \"string\" &&\n messageCenterGroupByValues.has(value as MessageCenterGroupBy)\n ? (value as MessageCenterGroupBy)\n : \"priority\";\n}\n\nfunction resolveStoredStatusFilters(\n value: unknown\n): Set<MessageCenterStatusFilter> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n return new Set(\n value.filter(\n (entry): entry is MessageCenterStatusFilter =>\n typeof entry === \"string\" &&\n messageCenterStatusFilterValues.has(entry as MessageCenterStatusFilter)\n )\n );\n}\n\nfunction resolveStoredProviderFilters(value: unknown): Set<string> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n return new Set(\n value.filter((entry): entry is string => typeof entry === \"string\")\n );\n}\n","import type {\n WorkspaceAgentMessageCenterCounts,\n WorkspaceAgentMessageCenterIdentity,\n WorkspaceAgentMessageCenterItem,\n WorkspaceAgentMessageCenterModel,\n WorkspaceAgentMessageCenterTurnOutcome\n} from \"./workspaceAgentMessageCenterModel\";\nimport type { WorkspaceAgentMessageCenterDigest } from \"./workspaceAgentMessageCenterDigest\";\n\ntype WorkspaceAgentMessageCenterPrompt =\n WorkspaceAgentMessageCenterItem[\"pendingPrompt\"];\n\nexport function stabilizeWorkspaceAgentMessageCenterModel(\n previous: WorkspaceAgentMessageCenterModel | null,\n next: WorkspaceAgentMessageCenterModel\n): WorkspaceAgentMessageCenterModel {\n if (!previous) {\n return next;\n }\n\n const previousItemsById = new Map(\n previous.items.map((item) => [item.id, item])\n );\n let itemsChanged = previous.items.length !== next.items.length;\n const items = next.items.map((nextItem, index) => {\n const previousItem = previousItemsById.get(nextItem.id);\n const stableItem =\n previousItem && messageCenterItemsEqual(previousItem, nextItem)\n ? previousItem\n : nextItem;\n if (stableItem !== previous.items[index]) {\n itemsChanged = true;\n }\n return stableItem;\n });\n const stableItems = itemsChanged ? items : previous.items;\n const stableCounts = messageCenterCountsEqual(previous.counts, next.counts)\n ? previous.counts\n : next.counts;\n\n if (\n previous.waitingCount === next.waitingCount &&\n stableItems === previous.items &&\n stableCounts === previous.counts\n ) {\n return previous;\n }\n\n return {\n ...next,\n counts: stableCounts,\n items: stableItems\n };\n}\n\nfunction messageCenterItemsEqual(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n left.id === right.id &&\n left.agentSessionId === right.agentSessionId &&\n left.provider === right.provider &&\n left.userId === right.userId &&\n left.title === right.title &&\n left.imported === right.imported &&\n left.cwd === right.cwd &&\n left.status === right.status &&\n left.lastAgentMessageSummary === right.lastAgentMessageSummary &&\n left.lastAgentMessageAtUnixMs === right.lastAgentMessageAtUnixMs &&\n left.needsAttentionKind === right.needsAttentionKind &&\n left.needsAttentionSummary === right.needsAttentionSummary &&\n left.sortTimeUnixMs === right.sortTimeUnixMs &&\n messageCenterIdentityEqual(left.identity, right.identity) &&\n messageCenterDigestEqual(left.digest, right.digest) &&\n messageCenterPromptEqual(left.pendingPrompt, right.pendingPrompt) &&\n messageCenterTurnOutcomeEqual(\n left.latestTurnOutcome ?? null,\n right.latestTurnOutcome ?? null\n )\n );\n}\n\nfunction messageCenterCountsEqual(\n left: WorkspaceAgentMessageCenterCounts,\n right: WorkspaceAgentMessageCenterCounts\n): boolean {\n return (\n left.all === right.all &&\n left.working === right.working &&\n left.waiting === right.waiting &&\n left.completed === right.completed &&\n left.failed === right.failed\n );\n}\n\nfunction messageCenterIdentityEqual(\n left: WorkspaceAgentMessageCenterIdentity | null,\n right: WorkspaceAgentMessageCenterIdentity | null\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.userName === right.userName &&\n left.userAvatarUrl === right.userAvatarUrl &&\n left.agentName === right.agentName &&\n left.agentAvatarUrl === right.agentAvatarUrl\n );\n}\n\nfunction messageCenterDigestEqual(\n left: WorkspaceAgentMessageCenterDigest,\n right: WorkspaceAgentMessageCenterDigest\n): boolean {\n return (\n left.primary.kind === right.primary.kind &&\n left.primary.summary === right.primary.summary &&\n left.primary.occurredAtUnixMs === right.primary.occurredAtUnixMs\n );\n}\n\nfunction messageCenterTurnOutcomeEqual(\n left: WorkspaceAgentMessageCenterTurnOutcome | null,\n right: WorkspaceAgentMessageCenterTurnOutcome | null\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.notificationKey === right.notificationKey &&\n left.status === right.status &&\n left.turnId === right.turnId\n );\n}\n\nfunction messageCenterPromptEqual(\n left: WorkspaceAgentMessageCenterPrompt,\n right: WorkspaceAgentMessageCenterPrompt\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.kind !== right.kind) {\n return false;\n }\n return JSON.stringify(left) === JSON.stringify(right);\n}\n"],"mappings":"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","names":["memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","cn","StatusDot","AgentVerticalScrollArea","isAgentMessageRole","recordValue","stringValue","firstNonEmptyString","includesAny","positiveNumber","useEffect","useRef","useState","cn","cn","jsx","WorkspaceAgentMessageCenterCard","cn","WorkspaceAgentMessageCenterStack","timeoutId","jsx","jsxs","useRef","useState","useEffect","cn","Button","cn","messageCenterCollapsedStackSignature","jsx","jsxs","Button","cn","jsx","jsxs","memo","WorkspaceAgentMessageCenterPanel","useState","useEffect","useRef","useMemo","useCallback","useLayoutEffect","cn","Button","MessageCenterRenderedCard","StatusDot"]}
|
|
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","../../agent-message-center/messageCenterFilterPreferences.ts","../../agent-message-center/workspaceAgentMessageCenterModelStability.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 StatusDot,\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 messageCenterStatusToneClass,\n resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard,\n type MessageCenterStatusTone,\n type WorkspaceAgentMessageCenterCardProps\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport {\n buildMessageCenterProviderOptions,\n buildMessageCenterStatusOptions,\n groupMessageCenterItems,\n itemMatchesViewFilters,\n messageCenterStackRenderId,\n messageCenterStackScrollSyncSegment,\n partitionMessageCenterItemsByAgentUser,\n statusFilterSummary,\n type MessageCenterGroupBy,\n type MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\nimport {\n readMessageCenterFilterPreferences,\n writeMessageCenterFilterPreferences\n} from \"./messageCenterFilterPreferences\";\n\nexport {\n buildWorkspaceAgentInteractivePromptLabels,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nexport type { WorkspaceAgentMessageCenterCardProps } from \"./WorkspaceAgentMessageCenterCard\";\n\nconst MESSAGE_CENTER_TOOLTIP_DELAY_MS = 300;\nconst MESSAGE_CENTER_STACK_EAGER_SUMMARY_COUNT = 8;\n\ntype WorkspaceAgentMessageCenterPromptInput = Parameters<\n WorkspaceAgentMessageCenterCardProps[\"onSubmitPrompt\"]\n>[0];\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 if (!open) {\n return null;\n }\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 [initialFilters] = useState(readMessageCenterFilterPreferences);\n const [groupBy, setGroupBy] = useState<MessageCenterGroupBy>(\n initialFilters.groupBy\n );\n const [statusFilters, setStatusFilters] =\n useState<Set<MessageCenterStatusFilter> | null>(\n initialFilters.statusFilters\n );\n const [providerFilters, setProviderFilters] = useState<Set<string> | null>(\n initialFilters.providerFilters\n );\n useEffect(() => {\n writeMessageCenterFilterPreferences({\n groupBy,\n statusFilters,\n providerFilters\n });\n }, [groupBy, statusFilters, providerFilters]);\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 itemGroupStacks = useMemo(\n () =>\n itemGroups.map((group) => ({\n ...group,\n stacks: partitionMessageCenterItemsByAgentUser(group.items)\n })),\n [itemGroups]\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 scrollSyncKey = useMemo(\n () =>\n [\n groupBy,\n activeStatusSummary,\n ...deckItems.map((item) => `deck:${item.id}`),\n ...itemGroupStacks.flatMap((group) =>\n group.stacks.map((stack) => {\n const stackId = messageCenterStackRenderId(group.id, stack.id);\n return messageCenterStackScrollSyncSegment({\n expanded: expandedStackIds.has(stackId),\n groupId: group.id,\n stack\n });\n })\n )\n ].join(\"|\"),\n [activeStatusSummary, deckItems, expandedStackIds, groupBy, itemGroupStacks]\n );\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 itemGroupStacks) {\n for (const stack of group.stacks) {\n if (\n stack.items.length > 1 &&\n stack.items.some((item) => item.id === highlightedItemId)\n ) {\n expandStack(messageCenterStackRenderId(group.id, stack.id));\n return;\n }\n }\n }\n }, [expandStack, highlightedItemId, itemGroupStacks, 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 const renderMessageCenterCard = useCallback(\n (\n item: WorkspaceAgentMessageCenterItem,\n options: { stackedIndex?: number } = {}\n ) => {\n const highlighted = item.id === highlightedItemId;\n const stackedIndex = options.stackedIndex;\n const card = (\n <MessageCenterRenderedCard\n key={item.agentSessionId}\n highlighted={highlighted}\n item={item}\n isSubmitting={\n submittingPromptKey ===\n `${item.agentSessionId}:${item.pendingPrompt?.requestId}`\n }\n lazySummary={\n stackedIndex !== undefined &&\n stackedIndex >= MESSAGE_CENTER_STACK_EAGER_SUMMARY_COUNT\n }\n registerNode={setItemNode}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={submitPrompt}\n />\n );\n\n if (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(stackedIndex * 24, 96)}ms`\n }}\n >\n {card}\n </div>\n );\n },\n [\n highlightedItemId,\n onLinkAction,\n onOpenChat,\n setItemNode,\n submitPrompt,\n submittingPromptKey\n ]\n );\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={scrollSyncKey}\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 {itemGroupStacks.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 return group.stacks.map((stack) => {\n const firstItem = stack.items[0];\n if (!firstItem) {\n return null;\n }\n if (stack.items.length === 1) {\n return renderMessageCenterCard(firstItem);\n }\n const stackId = messageCenterStackRenderId(\n group.id,\n stack.id\n );\n return (\n <MessageCenterStack\n key={stackId}\n expanded={expandedStackIds.has(stackId)}\n groupId={stackId}\n highlightedItemId={highlightedItemId}\n items={stack.items}\n renderCard={renderMessageCenterCard}\n onCollapse={collapseStack}\n onExpand={expandStack}\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\nconst MessageCenterRenderedCard = memo(function MessageCenterRenderedCard({\n highlighted,\n isSubmitting,\n item,\n lazySummary,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt,\n registerNode\n}: {\n highlighted: boolean;\n isSubmitting: boolean;\n item: WorkspaceAgentMessageCenterItem;\n lazySummary: boolean;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (\n item: WorkspaceAgentMessageCenterItem,\n input: WorkspaceAgentMessageCenterPromptInput\n ) => void;\n registerNode: (itemId: string, node: HTMLElement | null) => void;\n}): JSX.Element {\n const cardRef = useCallback(\n (node: HTMLElement | null) => {\n registerNode(item.id, node);\n },\n [item.id, registerNode]\n );\n const handleSubmitPrompt = useCallback(\n (input: WorkspaceAgentMessageCenterPromptInput) => {\n onSubmitPrompt(item, input);\n },\n [item, onSubmitPrompt]\n );\n\n return (\n <MessageCenterCard\n cardRef={cardRef}\n highlighted={highlighted}\n item={item}\n isSubmitting={isSubmitting}\n lazySummary={lazySummary}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={handleSubmitPrompt}\n />\n );\n});\n\nfunction MessageCenterGroupHeading({\n group\n}: {\n group: ReturnType<typeof groupMessageCenterItems>[number];\n}): JSX.Element {\n \"use memo\";\n const statusSignal = messageCenterGroupStatusSignal(group.id);\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\n className={cn(\n \"flex min-w-0 items-center gap-1.5 text-[11px] font-normal leading-4\",\n statusSignal\n ? messageCenterStatusToneClass(statusSignal.tone)\n : \"text-[var(--text-tertiary)]\"\n )}\n title={`${group.label} · ${group.items.length}`}\n >\n {statusSignal ? (\n <StatusDot\n tone={statusSignal.tone}\n pulse={statusSignal.pulse}\n size=\"sm\"\n title={group.label}\n />\n ) : null}\n <span className=\"min-w-0 truncate\">\n {group.label} · {group.items.length}\n </span>\n </h3>\n );\n}\n\nfunction messageCenterGroupStatusSignal(groupId: string): {\n pulse: boolean;\n tone: Exclude<MessageCenterStatusTone, \"neutral\">;\n} | null {\n switch (groupId) {\n case \"needs-attention\":\n case \"waiting\":\n return { pulse: true, tone: \"amber\" };\n case \"working\":\n return { pulse: true, tone: \"blue\" };\n case \"failed\":\n return { pulse: false, tone: \"red\" };\n case \"recently-completed\":\n case \"completed\":\n return { pulse: false, tone: \"green\" };\n default:\n return null;\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 resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary,\n type WorkspaceAgentMessageCenterDigest,\n type WorkspaceAgentMessageCenterDigestAgentSummary\n} from \"./workspaceAgentMessageCenterDigest\";\nimport {\n extractExitPlanKeepPlanningOptionId,\n extractExitPlanModeOptions,\n isExitPlanSwitchModeInput\n} from \"../shared/agentConversation/exitPlanOptions\";\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 imported?: boolean;\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 itemCutoffUnixMs?: number | null;\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 messageAnalysis = analyzeMessageCenterSessionMessages(\n session.agentSessionId,\n messages\n );\n const needsAttention =\n needsAttentionBySessionId.get(session.agentSessionId) ?? null;\n const status = displayStatuses.get(session.agentSessionId) ?? \"idle\";\n const lastAgentMessage = messageAnalysis.latestAgentMessage;\n const title = resolveSessionTitle(\n session,\n messageAnalysis.latestUserMessageSummary,\n messageAnalysis.firstUserMessageSummary\n );\n const pendingPrompt =\n messageAnalysis.pendingPrompt ??\n codexPlanImplementationPrompt(session, status, messages) ??\n fallbackPromptFromNeedsAttention(\n needsAttention,\n options.promptFallbackLabels\n );\n const digest = buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle: resolveDigestFallbackTitle(session),\n latestAgentMessage: messageAnalysis.latestDigestAgentMessage,\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 ...(isImportedMessageCenterSession(session) ? { imported: true } : {}),\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: messageAnalysis.latestTurnOutcome,\n sortTimeUnixMs\n } satisfies WorkspaceAgentMessageCenterItem;\n })\n .filter((item) =>\n isWithinMessageCenterItemCutoff(item, options.itemCutoffUnixMs)\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\nfunction isImportedMessageCenterSession(\n session: AgentActivitySession\n): boolean {\n return session.runtimeContext?.imported === true;\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\nfunction isWithinMessageCenterItemCutoff(\n item: WorkspaceAgentMessageCenterItem,\n cutoffUnixMs: number | null | undefined\n): boolean {\n if (!Number.isFinite(cutoffUnixMs)) {\n return true;\n }\n if (isWaitingMessageCenterItem(item)) {\n return true;\n }\n const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n return timestamp >= Number(cutoffUnixMs);\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 latestUserMessageSummary: string,\n firstUserMessageSummary: string\n): string {\n const latest = latestUserMessageSummary.trim();\n if (latest) {\n return latest;\n }\n const title = session.title.trim();\n if (title) {\n return title;\n }\n return firstUserMessageSummary || session.provider || session.agentSessionId;\n}\n\nfunction resolveDigestFallbackTitle(session: AgentActivitySession): string {\n return session.title.trim() || session.provider || session.agentSessionId;\n}\n\ninterface MessageCenterSessionMessageAnalysis {\n firstUserMessageSummary: string;\n latestUserMessageSummary: string;\n latestDigestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null;\n latestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null;\n latestTurnOutcome: WorkspaceAgentMessageCenterTurnOutcome | null;\n pendingPrompt: AgentConversationPromptVM | null;\n}\n\ninterface PendingPromptCandidate {\n message: AgentActivityMessage;\n prompt: AgentConversationPromptVM;\n}\n\ninterface TurnOutcomeCandidate {\n message: AgentActivityMessage;\n outcome: WorkspaceAgentMessageCenterTurnOutcome;\n}\n\nfunction analyzeMessageCenterSessionMessages(\n agentSessionId: string,\n messages: readonly AgentActivityMessage[]\n): MessageCenterSessionMessageAnalysis {\n let firstUserMessageSummary = \"\";\n let latestUserMessageSummary = \"\";\n let latestUserMessageAtUnixMs = Number.NEGATIVE_INFINITY;\n let latestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null =\n null;\n let latestDigestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null =\n null;\n let latestPendingPrompt: PendingPromptCandidate | null = null;\n let latestOutcome: TurnOutcomeCandidate | null = null;\n\n for (const message of messages) {\n if (isUserMessageRole(message.role)) {\n const summary = messageSummary(message);\n if (!firstUserMessageSummary && summary) {\n firstUserMessageSummary = summary;\n }\n if (summary) {\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (occurredAtUnixMs >= latestUserMessageAtUnixMs) {\n latestUserMessageSummary = summary;\n latestUserMessageAtUnixMs = occurredAtUnixMs;\n }\n }\n }\n if (isAgentMessageRole(message.role)) {\n const summary = messageSummary(message);\n if (summary) {\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (\n !latestAgentMessage ||\n occurredAtUnixMs >= latestAgentMessage.occurredAtUnixMs\n ) {\n latestAgentMessage = { summary, occurredAtUnixMs };\n }\n }\n const digestSummary =\n resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary(message);\n if (digestSummary) {\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (\n !latestDigestAgentMessage ||\n occurredAtUnixMs >= latestDigestAgentMessage.occurredAtUnixMs\n ) {\n latestDigestAgentMessage = {\n summary: digestSummary,\n occurredAtUnixMs\n };\n }\n }\n\n const outcome = turnOutcomeFromMessage(agentSessionId, message);\n if (\n outcome &&\n (!latestOutcome ||\n compareMessagesByRecentTime(message, latestOutcome.message) < 0)\n ) {\n latestOutcome = { message, outcome };\n }\n }\n\n if (!isTerminalMessageStatus(message.status)) {\n const prompt = promptFromMessage(message);\n if (\n prompt &&\n (!latestPendingPrompt ||\n compareMessagesByRecentTime(message, latestPendingPrompt.message) < 0)\n ) {\n latestPendingPrompt = { message, prompt };\n }\n }\n }\n\n return {\n firstUserMessageSummary,\n latestUserMessageSummary,\n latestDigestAgentMessage,\n latestAgentMessage,\n latestTurnOutcome: latestOutcome?.outcome ?? null,\n pendingPrompt: latestPendingPrompt?.prompt ?? null\n };\n}\n\nfunction promptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n return (\n exitPlanPromptFromMessage(message) ??\n approvalPromptFromMessage(message) ??\n askUserPromptFromMessage(message)\n );\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 if (isExitPlanMessage(message, input)) {\n return null;\n }\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 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 questions = normalizeAskUserQuestions(input.questions);\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 const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n if (!isExitPlanMessage(message, input)) {\n return null;\n }\n return {\n kind: \"exit-plan\",\n requestId:\n stringValue(input.requestId) ??\n stringValue(payload.requestId) ??\n message.messageId,\n title:\n stringValue(input.title) ??\n stringValue(recordValue(input.toolCall).title) ??\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message),\n options: extractExitPlanModeOptions(input, payload),\n ...keepPlanningOption(extractExitPlanKeepPlanningOptionId(input, payload))\n };\n}\n\nfunction keepPlanningOption(optionId: string | null): {\n keepPlanningOptionId?: string;\n} {\n return optionId ? { keepPlanningOptionId: optionId } : {};\n}\n\nfunction isExitPlanMessage(\n message: AgentActivityMessage,\n input: Record<string, unknown> = recordValue(\n recordValue(message.payload).input\n )\n): boolean {\n // Some shapes only flag exit-plan via metadata (\"exitplanmode\"); the canonical\n // Claude shape is a `switch_mode` approval carrying a `plan` option.\n return (\n includesAny(normalizedMetadataValues(message), [\"exitplanmode\"]) ||\n isExitPlanSwitchModeInput(input)\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 turnOutcomeFromMessage(\n agentSessionId: string,\n message: AgentActivityMessage\n): WorkspaceAgentMessageCenterTurnOutcome | null {\n const status = outcomeStatusFromMessage(message);\n if (!status) {\n return null;\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 notificationKey: `${agentSessionId}:${notificationSubject}:${status}`,\n status,\n 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 isUserMessageRole(role: string): boolean {\n return role.trim().toLowerCase() === \"user\";\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 WorkspaceAgentMessageCenterDigestAgentSummary {\n summary: string;\n occurredAtUnixMs: number;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterDigestInput {\n fallbackTitle: string;\n latestAgentMessage: WorkspaceAgentMessageCenterDigestAgentSummary | null;\n needsAttention: AgentActivityNeedsAttentionItem | null;\n pendingPrompt: AgentConversationPromptVM | null;\n status: WorkspaceAgentActivityStatus;\n}\n\nexport function buildWorkspaceAgentMessageCenterDigest(\n input: BuildWorkspaceAgentMessageCenterDigestInput\n): WorkspaceAgentMessageCenterDigest {\n const {\n fallbackTitle,\n latestAgentMessage,\n needsAttention,\n pendingPrompt,\n status\n } = input;\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\nexport function resolveWorkspaceAgentMessageCenterDigestAgentMessageSummary(\n message: AgentActivityMessage\n): string {\n if (!isAgentMessageRole(message.role)) {\n return \"\";\n }\n return meaningfulMessageSummary(message);\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 const payload = recordValue(message.payload);\n const isToolMessage = isToolLikeMessage(message, payload);\n const candidates = messageSummaryCandidates(payload, isToolMessage);\n const structuralLabelTokens = isToolMessage\n ? structuralToolLabelTokens(message, payload)\n : null;\n const hasToolDigestSignal =\n isToolMessage && candidates.some(isToolDigestSignalCandidate);\n\n for (const candidate of candidates) {\n if (\n !isGenericToolLabelSummary(candidate, {\n hasToolDigestSignal,\n isToolMessage,\n structuralLabelTokens\n })\n ) {\n return decorateMessageSummary(message, candidate, isToolMessage);\n }\n }\n return \"\";\n}\n\nfunction messageSummaryCandidates(\n payload: Record<string, unknown>,\n isToolMessage: boolean\n): MessageSummaryCandidate[] {\n const explicitCandidates = [\n summaryCandidate(\"payload.summary\", payload.summary),\n summaryCandidate(\"payload.displayPrompt\", payload.displayPrompt),\n summaryCandidate(\"payload.text\", payload.text),\n summaryCandidate(\"payload.content\", payload.content),\n summaryCandidate(\"payload.message\", payload.message),\n summaryCandidate(\"payload.body\", payload.body)\n ];\n if (!isToolMessage) {\n return [\n ...explicitCandidates,\n summaryCandidate(\"payload.title\", payload.title)\n ].filter((candidate): candidate is MessageSummaryCandidate =>\n Boolean(candidate)\n );\n }\n return [\n ...explicitCandidates,\n toolErrorSummaryCandidate(payload),\n toolOutputSummaryCandidate(payload),\n toolInputSummaryCandidate(payload),\n summaryCandidate(\"payload.title\", 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 candidate: MessageSummaryCandidate,\n context: {\n hasToolDigestSignal: boolean;\n isToolMessage: boolean;\n structuralLabelTokens: Set<string> | null;\n }\n): boolean {\n if (!context.isToolMessage) {\n return false;\n }\n const normalizedSummary = normalizeToken(candidate.summary);\n if (!normalizedSummary) {\n return true;\n }\n if (context.structuralLabelTokens?.has(normalizedSummary)) {\n return true;\n }\n return (\n candidate.source === \"payload.title\" &&\n !context.hasToolDigestSignal &&\n looksLikeBareLabel(candidate.summary)\n );\n}\n\nfunction decorateMessageSummary(\n message: AgentActivityMessage,\n candidate: MessageSummaryCandidate,\n isToolMessage: boolean\n): string {\n if (!isToolMessage) {\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(\n message: AgentActivityMessage,\n payload = recordValue(message.payload)\n): boolean {\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(\n message: AgentActivityMessage,\n payload = recordValue(message.payload)\n): Set<string> {\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 isToolDigestSignalCandidate(\n candidate: MessageSummaryCandidate\n): boolean {\n return (\n candidate.source === \"tool.error\" ||\n candidate.source === \"tool.output\" ||\n candidate.source === \"tool.input\"\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 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 cloneElement,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type FocusEvent as ReactFocusEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport {\n AppWindow,\n ChevronDown,\n ChevronUp,\n ExternalLink,\n Info\n} from \"lucide-react\";\nimport {\n Button,\n cn,\n StatusDot,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\nimport { getActiveUiLanguage, useTranslation } from \"../i18n/index\";\nimport { formatAgentSessionMentionText } from \"../shared/utils/agentSessionMentionText\";\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 \"../shared/userAvatarPlaceholder\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\nimport { formatAgentGuiConversationPlainTitle } from \"../workbench/sessionTitle\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n highlighted?: boolean;\n interactive?: boolean;\n isSubmitting: boolean;\n lazySummary?: 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\ninterface WorkspaceAgentMessageCenterStackProps {\n className?: string;\n expanded: boolean;\n groupId: string;\n highlightedItemId?: string | null;\n items: WorkspaceAgentMessageCenterItem[];\n renderCard: (\n item: WorkspaceAgentMessageCenterItem,\n options?: { stackedIndex?: number }\n ) => ReactNode;\n onCollapse: (groupId: string) => void;\n onExpand: (groupId: string) => void;\n}\n\nfunction stopMessageCenterTextPointerPropagation(\n event: ReactPointerEvent<HTMLElement>\n): void {\n event.stopPropagation();\n}\n\nexport const WorkspaceAgentMessageCenterCard = memo(\n function WorkspaceAgentMessageCenterCard({\n cardRef,\n highlighted = false,\n interactive = true,\n item,\n isSubmitting,\n lazySummary = false,\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 = formatAgentGuiConversationPlainTitle(item, {\n language: getActiveUiLanguage()\n });\n const summary = messageCenterVisibleSummary(item);\n const displayStatus = statusClass(item);\n const statusTone = messageCenterStatusTone(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 <LazyMessageCenterTooltip\n content={displayTitle}\n side=\"top\"\n align=\"start\"\n className=\"max-w-[min(360px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n >\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 </LazyMessageCenterTooltip>\n {item.cwd ? <ProjectPathInfo path={item.cwd} /> : null}\n </div>\n <span\n className={cn(\n \"workspace-agent-message-center__status inline-flex shrink-0 items-center gap-1.5 text-[11px] font-semibold leading-4\",\n messageCenterStatusToneClass(statusTone)\n )}\n data-status={displayStatus}\n title={statusLabel}\n >\n <StatusDot\n tone={statusTone}\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 lazy={lazySummary}\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);\n\nconst STACK_PRESENCE_FALLBACK_MS = 380;\nconst MESSAGE_CENTER_STACK_INITIAL_RENDER_COUNT = 24;\nconst MESSAGE_CENTER_STACK_RENDER_BATCH_SIZE = 24;\nconst MESSAGE_CENTER_STACK_RENDER_BATCH_DELAY_MS = 40;\nconst MESSAGE_CENTER_SUMMARY_LAZY_ROOT_MARGIN = \"480px 0px\";\nconst MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS = 80;\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 const WorkspaceAgentMessageCenterStack = memo(\n function WorkspaceAgentMessageCenterStack({\n className,\n expanded,\n groupId,\n highlightedItemId,\n items,\n renderCard,\n onCollapse,\n onExpand\n }: WorkspaceAgentMessageCenterStackProps): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const summaryRegion = useStackRegionPresence(!expanded);\n const cardsRegion = useStackRegionPresence(expanded);\n const visibleItems = useBatchedMessageCenterStackItems({\n expanded,\n highlightedItemId,\n items,\n mounted: cardsRegion.mounted\n });\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(\n \"agentHost.workspaceAgentMessageCenterStackSummaryCount\",\n {\n count: items.length\n }\n )}\n </span>\n </span>\n <LazyMessageCenterTooltip\n content={collapseLabel}\n side=\"top\"\n align=\"center\"\n >\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(groupId)}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden=\"true\" />\n </Button>\n </LazyMessageCenterTooltip>\n </div>\n <div className=\"flex min-w-0 flex-col gap-2.5\">\n {visibleItems.map((item, stackedIndex) =>\n renderCard(item, { stackedIndex })\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n },\n areMessageCenterStackPropsEqual\n);\n\nfunction areMessageCenterStackPropsEqual(\n previous: WorkspaceAgentMessageCenterStackProps,\n next: WorkspaceAgentMessageCenterStackProps\n): boolean {\n if (\n previous.className !== next.className ||\n previous.expanded !== next.expanded ||\n previous.groupId !== next.groupId ||\n previous.onCollapse !== next.onCollapse ||\n previous.onExpand !== next.onExpand ||\n previous.renderCard !== next.renderCard\n ) {\n return false;\n }\n if (next.expanded) {\n return (\n previous.highlightedItemId === next.highlightedItemId &&\n previous.items === next.items\n );\n }\n return (\n messageCenterCollapsedStackSignature(previous.items) ===\n messageCenterCollapsedStackSignature(next.items)\n );\n}\n\nfunction messageCenterCollapsedStackSignature(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): string {\n const firstItem = items[0];\n if (!firstItem) {\n return \"0\";\n }\n const hasWaiting = items.some(isWaitingMessageCenterItem) ? \"1\" : \"0\";\n return [\n items.length,\n firstItem.id,\n firstItem.provider,\n firstItem.userId ?? \"\",\n firstItem.identity?.userName ?? \"\",\n firstItem.identity?.agentName ?? \"\",\n hasWaiting,\n messageCenterStackPreviewText(firstItem)\n ].join(\":\");\n}\n\nfunction useBatchedMessageCenterStackItems({\n expanded,\n highlightedItemId,\n items,\n mounted\n}: {\n expanded: boolean;\n highlightedItemId?: string | null;\n items: WorkspaceAgentMessageCenterItem[];\n mounted: boolean;\n}): WorkspaceAgentMessageCenterItem[] {\n const limit = items.length;\n const highlightedIndex =\n highlightedItemId === null || highlightedItemId === undefined\n ? -1\n : items.findIndex((item) => item.id === highlightedItemId);\n const initialCount = Math.min(\n limit,\n Math.max(MESSAGE_CENTER_STACK_INITIAL_RENDER_COUNT, highlightedIndex + 1)\n );\n const [renderCount, setRenderCount] = useState(initialCount);\n\n useEffect(() => {\n if (!mounted) {\n setRenderCount(initialCount);\n return;\n }\n setRenderCount((current) =>\n Math.min(Math.max(current, initialCount), limit)\n );\n }, [initialCount, limit, mounted]);\n\n useEffect(() => {\n if (!expanded || !mounted || renderCount >= limit) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n setRenderCount((current) =>\n Math.min(current + MESSAGE_CENTER_STACK_RENDER_BATCH_SIZE, limit)\n );\n }, MESSAGE_CENTER_STACK_RENDER_BATCH_DELAY_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [expanded, limit, mounted, renderCount]);\n\n return items.slice(0, Math.min(renderCount, limit));\n}\n\nfunction MessageCenterStackSummary({\n groupId,\n items,\n onExpand\n}: {\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n onExpand: (groupId: string) => 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(groupId)}\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 {messageCenterStackPreviewNodes(firstItem)}\n </span>\n </span>\n </span>\n </button>\n );\n}\n\nfunction messageCenterStackRawPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return (\n item.digest.primary.summary.trim() ||\n item.lastAgentMessageSummary.trim() ||\n item.title\n );\n}\n\nexport function messageCenterStackPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return formatAgentSessionMentionText(messageCenterStackRawPreviewText(item), {\n language: getActiveUiLanguage()\n });\n}\n\nconst MESSAGE_CENTER_PREVIEW_MARKDOWN_LINK_PATTERN =\n /\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(([^)\\s]+)\\)/g;\nconst MESSAGE_CENTER_PREVIEW_LABEL_ESCAPE_PATTERN = /\\\\([\\\\[\\]()])/g;\n\ntype MessageCenterPreviewMentionKind =\n | \"session\"\n | \"workspace-app\"\n | \"workspace-issue\";\n\n/**\n * 收起态预览只展示纯文本 + 一个静态(不可点击)的 mention 图标,复用\n * AgentMessageMarkdown 里那套富文本 chip 的视觉样式,但不渲染成 <a>——\n * 这块预览本身嵌套在外层切换展开/收起的 <button> 里,塞一个可点击链接\n * 会出现交互元素嵌套交互元素的问题。\n */\nexport function messageCenterStackPreviewNodes(\n item: WorkspaceAgentMessageCenterItem\n): ReactNode[] {\n const text = messageCenterStackRawPreviewText(item);\n const nodes: ReactNode[] = [];\n let lastIndex = 0;\n let mentionIndex = 0;\n\n for (const match of text.matchAll(\n MESSAGE_CENTER_PREVIEW_MARKDOWN_LINK_PATTERN\n )) {\n const [fullMatch, rawLabel = \"\", href = \"\"] = match;\n const matchStart = match.index ?? 0;\n if (matchStart > lastIndex) {\n nodes.push(text.slice(lastIndex, matchStart));\n }\n\n const label = rawLabel.replace(\n MESSAGE_CENTER_PREVIEW_LABEL_ESCAPE_PATTERN,\n \"$1\"\n );\n const mention = parseRichTextMentionHref(href, label);\n if (!mention) {\n nodes.push(isRichTextMentionHref(href) ? label : fullMatch);\n } else {\n const kind = messageCenterPreviewMentionKind(mention.providerId);\n const displayLabel = label || mention.label;\n nodes.push(\n kind ? (\n <MessageCenterPreviewMentionChip\n key={`mention-${mentionIndex}`}\n kind={kind}\n label={displayLabel}\n />\n ) : (\n displayLabel\n )\n );\n mentionIndex += 1;\n }\n\n lastIndex = matchStart + fullMatch.length;\n }\n\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex));\n }\n\n return nodes;\n}\n\nfunction messageCenterPreviewMentionKind(\n providerId: string\n): MessageCenterPreviewMentionKind | null {\n switch (providerId.trim().toLowerCase()) {\n case \"agent-session\":\n return \"session\";\n case \"workspace-app\":\n return \"workspace-app\";\n case \"workspace-issue\":\n return \"workspace-issue\";\n default:\n return null;\n }\n}\n\nfunction MessageCenterPreviewMentionChip({\n kind,\n label\n}: {\n kind: MessageCenterPreviewMentionKind;\n label: string;\n}): ReactElement {\n return (\n <span\n className=\"tsh-agent-object-token tsh-agent-object-token--entity\"\n data-agent-mention-kind={kind}\n >\n <span className=\"tsh-agent-object-token__kind\" aria-hidden=\"true\">\n {kind === \"workspace-app\" ? (\n <AppWindow className=\"size-3.5\" aria-hidden=\"true\" />\n ) : (\n <span\n className=\"tsh-agent-object-token__kind-icon\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n <span className=\"tsh-agent-object-token__main\">{label}</span>\n </span>\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 id: \"auto\",\n label: t(\"agentHost.agentGui.planModes.auto.label\"),\n description: t(\"agentHost.agentGui.planModes.auto.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 lazy,\n onLinkAction,\n summary\n}: {\n emptyLabel: string;\n item: WorkspaceAgentMessageCenterItem;\n lazy: boolean;\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 shouldRenderRichSummary = useLazyMessageCenterSummaryReady(\n summaryRef,\n lazy\n );\n const shouldMeasureOverflow = useDeferredMessageCenterSummaryMeasureReady(\n summaryRef,\n shouldRenderRichSummary\n );\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 useEffect(() => {\n if (!shouldMeasureOverflow) {\n setIsOverflowing(false);\n return undefined;\n }\n const element = summaryRef.current;\n if (!element) {\n return undefined;\n }\n\n const updateOverflowState = () => {\n setIsOverflowing(element.scrollHeight > element.clientHeight + 1);\n };\n\n let resizeObserver: ResizeObserver | null = null;\n const timeoutId = window.setTimeout(() => {\n updateOverflowState();\n resizeObserver = new ResizeObserver(updateOverflowState);\n resizeObserver.observe(element);\n }, MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS);\n return () => {\n window.clearTimeout(timeoutId);\n resizeObserver?.disconnect();\n };\n }, [shouldMeasureOverflow, 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 && shouldRenderRichSummary ? (\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 ) : summary ? (\n <div className=\"whitespace-pre-wrap [overflow-wrap:anywhere]\">\n {summary}\n </div>\n ) : (\n emptyLabel\n )}\n </AgentVerticalScrollArea>\n );\n}\n\nfunction useLazyMessageCenterSummaryReady(\n ref: RefObject<HTMLDivElement | null>,\n lazy: boolean\n): boolean {\n const [ready, setReady] = useState(!lazy);\n\n useEffect(() => {\n setReady(!lazy);\n }, [lazy]);\n\n useEffect(() => {\n if (!lazy) {\n return undefined;\n }\n if (ready) {\n return undefined;\n }\n const element = ref.current;\n if (!element || typeof IntersectionObserver === \"undefined\") {\n setReady(true);\n return undefined;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setReady(true);\n observer.disconnect();\n }\n },\n { rootMargin: MESSAGE_CENTER_SUMMARY_LAZY_ROOT_MARGIN }\n );\n observer.observe(element);\n return () => observer.disconnect();\n }, [lazy, ready, ref]);\n\n return ready;\n}\n\nfunction useDeferredMessageCenterSummaryMeasureReady(\n ref: RefObject<HTMLDivElement | null>,\n enabled: boolean\n): boolean {\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n setReady(false);\n return undefined;\n }\n if (ready) {\n return undefined;\n }\n const element = ref.current;\n if (!element || typeof IntersectionObserver === \"undefined\") {\n const timeoutId = window.setTimeout(\n () => setReady(true),\n MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS\n );\n return () => {\n window.clearTimeout(timeoutId);\n };\n }\n\n let timeoutId: number | null = null;\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries.some((entry) => entry.isIntersecting)) {\n return;\n }\n observer.disconnect();\n timeoutId = window.setTimeout(\n () => setReady(true),\n MESSAGE_CENTER_SUMMARY_OVERFLOW_MEASURE_DELAY_MS\n );\n },\n { rootMargin: MESSAGE_CENTER_SUMMARY_LAZY_ROOT_MARGIN }\n );\n observer.observe(element);\n return () => {\n observer.disconnect();\n if (timeoutId !== null) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [enabled, ready, ref]);\n\n return ready;\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(--accent-codex)] shadow-none transition-[color,opacity,visibility] hover:bg-transparent hover:text-[var(--accent-codex)] focus-visible:bg-transparent focus-visible:text-[var(--accent-codex)] 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-[13px] leading-5 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 <LazyMessageCenterTooltip\n content={path}\n side=\"top\"\n align=\"start\"\n className=\"max-w-[320px] text-[11px] [overflow-wrap:anywhere]\"\n >\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 </LazyMessageCenterTooltip>\n );\n}\n\ntype LazyTooltipChildProps = {\n onBlur?: (event: ReactFocusEvent<HTMLElement>) => void;\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onPointerEnter?: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: ReactPointerEvent<HTMLElement>) => void;\n};\n\nfunction LazyMessageCenterTooltip({\n align,\n children,\n className,\n content,\n side\n}: {\n align?: \"center\" | \"end\" | \"start\";\n children: ReactElement<LazyTooltipChildProps>;\n className?: string;\n content: ReactNode;\n side?: \"bottom\" | \"left\" | \"right\" | \"top\";\n}): JSX.Element {\n \"use memo\";\n const [hydrated, setHydrated] = useState(false);\n const [open, setOpen] = useState(false);\n\n const showTooltip = useCallback(() => {\n setHydrated(true);\n setOpen(true);\n }, []);\n const hideTooltip = useCallback(() => {\n setOpen(false);\n }, []);\n\n const trigger = cloneElement(children, {\n onBlur: (event: ReactFocusEvent<HTMLElement>) => {\n children.props.onBlur?.(event);\n hideTooltip();\n },\n onFocus: (event: ReactFocusEvent<HTMLElement>) => {\n children.props.onFocus?.(event);\n showTooltip();\n },\n onPointerEnter: (event: ReactPointerEvent<HTMLElement>) => {\n children.props.onPointerEnter?.(event);\n showTooltip();\n },\n onPointerLeave: (event: ReactPointerEvent<HTMLElement>) => {\n children.props.onPointerLeave?.(event);\n hideTooltip();\n }\n });\n\n if (!hydrated) {\n return trigger;\n }\n\n return (\n <Tooltip open={open} onOpenChange={setOpen}>\n <TooltipTrigger asChild>{trigger}</TooltipTrigger>\n <TooltipContent side={side} align={align} className={className}>\n {content}\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-[13px] leading-5 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\nexport type MessageCenterStatusTone =\n | \"amber\"\n | \"blue\"\n | \"green\"\n | \"neutral\"\n | \"red\";\n\nfunction messageCenterStatusTone(\n item: WorkspaceAgentMessageCenterItem\n): MessageCenterStatusTone {\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\nexport function messageCenterStatusToneClass(\n tone: MessageCenterStatusTone\n): string {\n switch (tone) {\n case \"amber\":\n return \"text-[var(--state-warning)]\";\n case \"blue\":\n return \"text-[var(--status-running)]\";\n case \"green\":\n return \"text-[var(--state-success)]\";\n case \"red\":\n return \"text-[var(--state-danger)]\";\n case \"neutral\":\n return \"text-[var(--text-secondary)]\";\n }\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 <MessageCenterOptionWithCount\n count={option.count}\n label={option.label}\n />\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 <MessageCenterOptionWithCount\n count={option.count}\n label={option.label}\n />\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\nfunction MessageCenterOptionWithCount({\n count,\n label\n}: {\n count: number;\n label: string;\n}): JSX.Element {\n return (\n <span className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <span className=\"shrink-0 tabular-nums text-[11px] text-[var(--text-tertiary)]\">\n {count}\n </span>\n </span>\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 messageCenterStackRenderId(\n groupId: string,\n stackId: string\n): string {\n return groupId === stackId ? stackId : `${groupId}:${stackId}`;\n}\n\nexport function messageCenterStackScrollSyncSegment({\n expanded,\n groupId,\n stack\n}: {\n expanded: boolean;\n groupId: string;\n stack: MessageCenterAgentUserStack;\n}): string {\n const stackId = messageCenterStackRenderId(groupId, stack.id);\n if (expanded) {\n return `expanded:${stackId}:${stack.items.map((item) => item.id).join(\"|\")}`;\n }\n return `collapsed:${stackId}:${messageCenterCollapsedStackSignature(\n stack.items\n )}`;\n}\n\nfunction messageCenterCollapsedStackSignature(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): string {\n const firstItem = items[0];\n if (!firstItem) {\n return \"0\";\n }\n const hasWaiting = items.some(isWaitingMessageCenterItem) ? \"1\" : \"0\";\n const summary =\n firstItem.digest.primary.summary.trim() ||\n firstItem.lastAgentMessageSummary.trim() ||\n firstItem.title.trim();\n return [\n items.length,\n firstItem.id,\n firstItem.provider,\n firstItem.userId ?? \"\",\n firstItem.identity?.userName ?? \"\",\n firstItem.identity?.agentName ?? \"\",\n hasWaiting,\n summary\n ].join(\":\");\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) => 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: \"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 if (item.imported) {\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","import type {\n MessageCenterGroupBy,\n MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport const messageCenterFiltersStorageKey =\n \"tutti.agent-message-center.filters\";\n\nexport interface MessageCenterFilterPreferences {\n groupBy: MessageCenterGroupBy;\n statusFilters: Set<MessageCenterStatusFilter> | null;\n providerFilters: Set<string> | null;\n}\n\nconst messageCenterGroupByValues = new Set<MessageCenterGroupBy>([\n \"priority\",\n \"status\",\n \"agent\",\n \"time\"\n]);\n\nconst messageCenterStatusFilterValues = new Set<MessageCenterStatusFilter>([\n \"waiting\",\n \"working\",\n \"completed\",\n \"failed\"\n]);\n\nconst defaultMessageCenterFilterPreferences: MessageCenterFilterPreferences = {\n groupBy: \"priority\",\n statusFilters: null,\n providerFilters: null\n};\n\nexport function readMessageCenterFilterPreferences(): MessageCenterFilterPreferences {\n if (typeof window === \"undefined\") {\n return defaultMessageCenterFilterPreferences;\n }\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(messageCenterFiltersStorageKey);\n } catch {\n return defaultMessageCenterFilterPreferences;\n }\n if (raw === null) {\n return defaultMessageCenterFilterPreferences;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return defaultMessageCenterFilterPreferences;\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n return defaultMessageCenterFilterPreferences;\n }\n const record = parsed as Record<string, unknown>;\n return {\n groupBy: resolveStoredGroupBy(record.groupBy),\n statusFilters: resolveStoredStatusFilters(record.statusFilters),\n providerFilters: resolveStoredProviderFilters(record.providerFilters)\n };\n}\n\nexport function writeMessageCenterFilterPreferences(\n preferences: MessageCenterFilterPreferences\n): void {\n if (typeof window === \"undefined\") {\n return;\n }\n const serialized = JSON.stringify({\n groupBy: preferences.groupBy,\n statusFilters: preferences.statusFilters\n ? [...preferences.statusFilters]\n : null,\n providerFilters: preferences.providerFilters\n ? [...preferences.providerFilters]\n : null\n });\n try {\n window.localStorage.setItem(messageCenterFiltersStorageKey, serialized);\n } catch {\n // Ignore persistence failures (private mode, quota); the in-memory\n // selection still works for this session.\n }\n}\n\nfunction resolveStoredGroupBy(value: unknown): MessageCenterGroupBy {\n return typeof value === \"string\" &&\n messageCenterGroupByValues.has(value as MessageCenterGroupBy)\n ? (value as MessageCenterGroupBy)\n : \"priority\";\n}\n\nfunction resolveStoredStatusFilters(\n value: unknown\n): Set<MessageCenterStatusFilter> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n return new Set(\n value.filter(\n (entry): entry is MessageCenterStatusFilter =>\n typeof entry === \"string\" &&\n messageCenterStatusFilterValues.has(entry as MessageCenterStatusFilter)\n )\n );\n}\n\nfunction resolveStoredProviderFilters(value: unknown): Set<string> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n return new Set(\n value.filter((entry): entry is string => typeof entry === \"string\")\n );\n}\n","import type {\n WorkspaceAgentMessageCenterCounts,\n WorkspaceAgentMessageCenterIdentity,\n WorkspaceAgentMessageCenterItem,\n WorkspaceAgentMessageCenterModel,\n WorkspaceAgentMessageCenterTurnOutcome\n} from \"./workspaceAgentMessageCenterModel\";\nimport type { WorkspaceAgentMessageCenterDigest } from \"./workspaceAgentMessageCenterDigest\";\n\ntype WorkspaceAgentMessageCenterPrompt =\n WorkspaceAgentMessageCenterItem[\"pendingPrompt\"];\n\nexport function stabilizeWorkspaceAgentMessageCenterModel(\n previous: WorkspaceAgentMessageCenterModel | null,\n next: WorkspaceAgentMessageCenterModel\n): WorkspaceAgentMessageCenterModel {\n if (!previous) {\n return next;\n }\n\n const previousItemsById = new Map(\n previous.items.map((item) => [item.id, item])\n );\n let itemsChanged = previous.items.length !== next.items.length;\n const items = next.items.map((nextItem, index) => {\n const previousItem = previousItemsById.get(nextItem.id);\n const stableItem =\n previousItem && messageCenterItemsEqual(previousItem, nextItem)\n ? previousItem\n : nextItem;\n if (stableItem !== previous.items[index]) {\n itemsChanged = true;\n }\n return stableItem;\n });\n const stableItems = itemsChanged ? items : previous.items;\n const stableCounts = messageCenterCountsEqual(previous.counts, next.counts)\n ? previous.counts\n : next.counts;\n\n if (\n previous.waitingCount === next.waitingCount &&\n stableItems === previous.items &&\n stableCounts === previous.counts\n ) {\n return previous;\n }\n\n return {\n ...next,\n counts: stableCounts,\n items: stableItems\n };\n}\n\nfunction messageCenterItemsEqual(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n left.id === right.id &&\n left.agentSessionId === right.agentSessionId &&\n left.provider === right.provider &&\n left.userId === right.userId &&\n left.title === right.title &&\n left.imported === right.imported &&\n left.cwd === right.cwd &&\n left.status === right.status &&\n left.lastAgentMessageSummary === right.lastAgentMessageSummary &&\n left.lastAgentMessageAtUnixMs === right.lastAgentMessageAtUnixMs &&\n left.needsAttentionKind === right.needsAttentionKind &&\n left.needsAttentionSummary === right.needsAttentionSummary &&\n left.sortTimeUnixMs === right.sortTimeUnixMs &&\n messageCenterIdentityEqual(left.identity, right.identity) &&\n messageCenterDigestEqual(left.digest, right.digest) &&\n messageCenterPromptEqual(left.pendingPrompt, right.pendingPrompt) &&\n messageCenterTurnOutcomeEqual(\n left.latestTurnOutcome ?? null,\n right.latestTurnOutcome ?? null\n )\n );\n}\n\nfunction messageCenterCountsEqual(\n left: WorkspaceAgentMessageCenterCounts,\n right: WorkspaceAgentMessageCenterCounts\n): boolean {\n return (\n left.all === right.all &&\n left.working === right.working &&\n left.waiting === right.waiting &&\n left.completed === right.completed &&\n left.failed === right.failed\n );\n}\n\nfunction messageCenterIdentityEqual(\n left: WorkspaceAgentMessageCenterIdentity | null,\n right: WorkspaceAgentMessageCenterIdentity | null\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.userName === right.userName &&\n left.userAvatarUrl === right.userAvatarUrl &&\n left.agentName === right.agentName &&\n left.agentAvatarUrl === right.agentAvatarUrl\n );\n}\n\nfunction messageCenterDigestEqual(\n left: WorkspaceAgentMessageCenterDigest,\n right: WorkspaceAgentMessageCenterDigest\n): boolean {\n return (\n left.primary.kind === right.primary.kind &&\n left.primary.summary === right.primary.summary &&\n left.primary.occurredAtUnixMs === right.primary.occurredAtUnixMs\n );\n}\n\nfunction messageCenterTurnOutcomeEqual(\n left: WorkspaceAgentMessageCenterTurnOutcome | null,\n right: WorkspaceAgentMessageCenterTurnOutcome | null\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return (\n left.notificationKey === right.notificationKey &&\n left.status === right.status &&\n left.turnId === right.turnId\n );\n}\n\nfunction messageCenterPromptEqual(\n left: WorkspaceAgentMessageCenterPrompt,\n right: WorkspaceAgentMessageCenterPrompt\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.kind !== right.kind) {\n return false;\n }\n return JSON.stringify(left) === JSON.stringify(right);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE,QAAAA;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;AACP;AAAA,EACE,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,OACK;;;ACjBP;AAAA,EACE;AAAA,OAIK;AA6BH;AAjBG,IAAM,0BAA0B,WAGrC,SAASC,yBACT;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,cACa;AACb;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,8CAA8C,SAAS;AAAA,MACrE,mBAAmB;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAAA,MACA,oBAAoB;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,MACA,yBAAyB;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,WAAW;AAAA,MACnB,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;;;ACvDD;AAAA,EACE;AAAA,EACA;AAAA,OAKK;;;AC+BA,SAAS,uCACd,OACmC;AACnC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,kBAAkB;AAAA,IACtB,oBAAoB,WAAW;AAAA,IAC/B,gBAAgB,WAAW;AAAA,IAC3B,qBAAqB,aAAa;AAAA,IAClC;AAAA,EACF;AACA,MAAI,iBAAiB,gBAAgB;AACnC,WAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,UACP,qBAAqB,aAAa;AAAA,UAClC,gBAAgB,WAAW;AAAA,UAC3B;AAAA,QACF;AAAA,QACA,kBACE,gBAAgB,oBAChB,iBAAiB,aAAa,KAC9B,oBAAoB,oBACpB;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,kBAAkB,oBAAoB,oBAAoB;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,eAAe,WAAW,cAAc,WAAW,QAAQ;AACxE,WAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,kBAAkB,oBAAoB,oBAAoB;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,MACL,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,kBAAkB,oBAAoB,oBAAoB;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,kBAAkB,oBAAoB,oBAAoB;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,SAAS,4DACd,SACQ;AACR,MAAI,CAAC,mBAAmB,QAAQ,IAAI,GAAG;AACrC,WAAO;AAAA,EACT;AACA,SAAO,yBAAyB,OAAO;AACzC;AAEA,SAAS,qBACP,QACe;AACf,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,UAAU,CAAC,GAAG,YAAY;AAAA,MACnC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,EAClB;AACF;AAEA,SAAS,iBACP,QACe;AACf,MAAI,CAAC,UAAU,EAAE,sBAAsB,SAAS;AAC9C,WAAO;AAAA,EACT;AACA,SAAO,eAAe,OAAO,gBAAgB;AAC/C;AAEA,SAAS,mBAAmB,MAAuB;AACjD,QAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,SAAO,eAAe,eAAe,eAAe;AACtD;AAmBA,SAAS,yBAAyB,SAAuC;AACvE,QAAM,UAAU,YAAY,QAAQ,OAAO;AAC3C,QAAM,gBAAgB,kBAAkB,SAAS,OAAO;AACxD,QAAM,aAAa,yBAAyB,SAAS,aAAa;AAClE,QAAM,wBAAwB,gBAC1B,0BAA0B,SAAS,OAAO,IAC1C;AACJ,QAAM,sBACJ,iBAAiB,WAAW,KAAK,2BAA2B;AAE9D,aAAW,aAAa,YAAY;AAClC,QACE,CAAC,0BAA0B,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,GACD;AACA,aAAO,uBAAuB,SAAS,WAAW,aAAa;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,SACA,eAC2B;AAC3B,QAAM,qBAAqB;AAAA,IACzB,iBAAiB,mBAAmB,QAAQ,OAAO;AAAA,IACnD,iBAAiB,yBAAyB,QAAQ,aAAa;AAAA,IAC/D,iBAAiB,gBAAgB,QAAQ,IAAI;AAAA,IAC7C,iBAAiB,mBAAmB,QAAQ,OAAO;AAAA,IACnD,iBAAiB,mBAAmB,QAAQ,OAAO;AAAA,IACnD,iBAAiB,gBAAgB,QAAQ,IAAI;AAAA,EAC/C;AACA,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,iBAAiB,iBAAiB,QAAQ,KAAK;AAAA,IACjD,EAAE;AAAA,MAAO,CAAC,cACR,QAAQ,SAAS;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,0BAA0B,OAAO;AAAA,IACjC,2BAA2B,OAAO;AAAA,IAClC,0BAA0B,OAAO;AAAA,IACjC,iBAAiB,iBAAiB,QAAQ,KAAK;AAAA,EACjD,EAAE;AAAA,IAAO,CAAC,cACR,QAAQ,SAAS;AAAA,EACnB;AACF;AAEA,SAAS,iBACP,QACA,OACgC;AAChC,QAAM,UAAU,qBAAqB,YAAY,KAAK,CAAC;AACvD,SAAO,UAAU,EAAE,QAAQ,QAAQ,IAAI;AACzC;AAEA,SAAS,0BACP,SACgC;AAChC,QAAM,QAAQ,YAAY,QAAQ,KAAK;AACvC,QAAM,YAAY,YAAY,MAAM,SAAS;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,QAAQ,KAAK;AAAA,MACzB,YAAY,MAAM,OAAO;AAAA,MACzB,YAAY,MAAM,OAAO;AAAA,MACzB,YAAY,MAAM,MAAM;AAAA,MACxB,YAAY,MAAM,IAAI;AAAA,MACtB,qBAAqB,MAAM,OAAO;AAAA,MAClC,YAAY,MAAM,MAAM;AAAA,MACxB,YAAY,MAAM,MAAM;AAAA,MACxB,YAAY,MAAM,MAAM;AAAA,MACxB,YAAY,MAAM,iBAAiB;AAAA,MACnC,YAAY,MAAM,gBAAgB;AAAA,MAClC,YAAY,UAAU,MAAM;AAAA,MAC5B,YAAY,UAAU,MAAM;AAAA,MAC5B,YAAY,UAAU,iBAAiB;AAAA,MACvC,YAAY,UAAU,gBAAgB;AAAA,MACtC,YAAY,MAAM,KAAK;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,2BACP,SACgC;AAChC,QAAM,SAAS,YAAY,QAAQ,MAAM;AACzC,QAAM,YAAY,YAAY,OAAO,SAAS;AAC9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,OAAO,OAAO;AAAA,MAC1B,YAAY,OAAO,OAAO;AAAA,MAC1B,YAAY,OAAO,IAAI;AAAA,MACvB,qBAAqB,OAAO,OAAO;AAAA,MACnC,YAAY,OAAO,OAAO;AAAA,MAC1B,YAAY,OAAO,MAAM;AAAA,MACzB,YAAY,OAAO,MAAM;AAAA,MACzB,YAAY,OAAO,MAAM;AAAA,MACzB,YAAY,OAAO,MAAM;AAAA,MACzB,YAAY,OAAO,iBAAiB;AAAA,MACpC,YAAY,OAAO,gBAAgB;AAAA,MACnC,YAAY,UAAU,MAAM;AAAA,MAC5B,YAAY,UAAU,MAAM;AAAA,MAC5B,YAAY,UAAU,iBAAiB;AAAA,MACvC,YAAY,UAAU,gBAAgB;AAAA,MACtC,YAAY,QAAQ,MAAM;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,0BACP,SACgC;AAChC,QAAM,QAAQ,YAAY,QAAQ,KAAK;AACvC,QAAM,WAAW,YAAY,MAAM,QAAQ;AAC3C,QAAM,SAAS,YAAY,MAAM,MAAM;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,MAAM,OAAO;AAAA,MACzB,YAAY,MAAM,OAAO;AAAA,MACzB,YAAY,MAAM,GAAG;AAAA,MACrB,YAAY,SAAS,OAAO;AAAA,MAC5B,YAAY,SAAS,GAAG;AAAA,MACxB,YAAY,MAAM,IAAI;AAAA,MACtB,YAAY,MAAM,SAAS;AAAA,MAC3B,YAAY,MAAM,QAAQ;AAAA,MAC1B,YAAY,MAAM,QAAQ;AAAA,MAC1B,YAAY,MAAM,KAAK;AAAA,MACvB,sBAAsB,MAAM,YAAY;AAAA,MACxC,sBAAsB,MAAM,WAAW;AAAA,MACvC,YAAY,MAAM,GAAG;AAAA,MACrB,YAAY,MAAM,OAAO;AAAA,MACzB,YAAY,MAAM,IAAI;AAAA,MACtB,YAAY,MAAM,KAAK;AAAA,MACvB,YAAY,MAAM,MAAM;AAAA,MACxB,YAAY,OAAO,KAAK;AAAA,MACxB,YAAY,OAAO,GAAG;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,0BACP,WACA,SAKS;AACT,MAAI,CAAC,QAAQ,eAAe;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,oBAAoB,eAAe,UAAU,OAAO;AAC1D,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,uBAAuB,IAAI,iBAAiB,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SACE,UAAU,WAAW,mBACrB,CAAC,QAAQ,uBACT,mBAAmB,UAAU,OAAO;AAExC;AAEA,SAAS,uBACP,SACA,WACA,eACQ;AACR,MAAI,CAAC,eAAe;AAClB,WAAO,UAAU;AAAA,EACnB;AACA,QAAM,YAAY,0BAA0B,EAAE,SAAS,QAAQ,QAAQ,CAAC;AACxE,MAAI,CAAC,WAAW;AACd,WAAO,UAAU;AAAA,EACnB;AACA,MAAI,UAAU,QAAQ,SAAS,UAAU,WAAW,GAAG;AACrD,WAAO,UAAU;AAAA,EACnB;AACA,SAAO,GAAG,UAAU,WAAW,KAAK,UAAU,OAAO;AACvD;AAEA,SAAS,kBACP,SACA,UAAU,YAAY,QAAQ,OAAO,GAC5B;AACT,QAAM,iBAAiB,eAAe,QAAQ,IAAI;AAClD,QAAM,iBAAiB;AAAA,IACrB,YAAY,QAAQ,IAAI;AAAA,IACxB,YAAY,QAAQ,MAAM;AAAA,IAC1B,YAAY,QAAQ,WAAW;AAAA,EACjC,EACG,IAAI,CAAC,UAAU,eAAe,SAAS,EAAE,CAAC,EAC1C,KAAK,GAAG;AACX,SACE,YAAY,gBAAgB,CAAC,QAAQ,MAAM,CAAC,KAC5C,YAAY,gBAAgB,CAAC,QAAQ,MAAM,CAAC,KAC5C;AAAA,IACE,YAAY,QAAQ,QAAQ,KAC5B,YAAY,QAAQ,QAAQ,KAC5B,YAAY,QAAQ,IAAI,KACxB,eAAe,QAAQ,KAAK,KAC5B,eAAe,QAAQ,MAAM,KAC7B,eAAe,QAAQ,KAAK;AAAA,EAC9B;AAEJ;AAEA,SAAS,0BACP,SACA,UAAU,YAAY,QAAQ,OAAO,GACxB;AACb,QAAM,WAAW,YAAY,QAAQ,QAAQ;AAC7C,SAAO,IAAI;AAAA,IACT;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAY,QAAQ,IAAI;AAAA,MACxB,YAAY,QAAQ,MAAM;AAAA,MAC1B,YAAY,QAAQ,WAAW;AAAA,MAC/B,YAAY,QAAQ,QAAQ;AAAA,MAC5B,YAAY,QAAQ,QAAQ;AAAA,MAC5B,YAAY,QAAQ,IAAI;AAAA,MACxB,YAAY,QAAQ,IAAI;AAAA,MACxB,YAAY,SAAS,QAAQ;AAAA,MAC7B,YAAY,SAAS,QAAQ;AAAA,MAC7B,YAAY,SAAS,IAAI;AAAA,MACzB,YAAY,SAAS,IAAI;AAAA,IAC3B,EACG,IAAI,CAAC,UAAU,eAAe,SAAS,EAAE,CAAC,EAC1C,OAAO,OAAO;AAAA,EACnB;AACF;AAEA,SAAS,YAAY,OAAe,SAAqC;AACvE,SAAO,QAAQ,KAAK,CAAC,WAAW,MAAM,SAAS,eAAe,MAAM,CAAC,CAAC;AACxE;AAEA,SAAS,4BACP,WACS;AACT,SACE,UAAU,WAAW,gBACrB,UAAU,WAAW,iBACrB,UAAU,WAAW;AAEzB;AAEA,SAAS,mBAAmB,OAAwB;AAClD,QAAM,UAAU,MAAM,KAAK;AAC3B,SACE,QAAQ,SAAS,KACjB,QAAQ,UAAU,MAClB,CAAC,MAAM,KAAK,OAAO,KACnB,CAAC,sBAAsB,KAAK,OAAO;AAEvC;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,aAAa,EAAE,EAAE,YAAY;AACpD;AAEA,SAAS,uBAAuB,QAAsC;AACpE,SACE,OAAO,KAAK,CAAC,UAAU,UAAU,QAAQ,MAAM,KAAK,EAAE,SAAS,CAAC,KAAK;AAEzE;AAEA,SAAS,YAAY,OAA+B;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,sBAAsB,OAA+B;AAC5D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SACE,MAAM,IAAI,WAAW,EAAE,KAAK,CAAC,SAAyB,QAAQ,IAAI,CAAC,KAAK;AAE5E;AAEA,SAAS,qBAAqB,OAA+B;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WACE,MACG,IAAI,oBAAoB,EACxB,KAAK,CAAC,SAAyB,QAAQ,IAAI,CAAC,KAAK;AAAA,EAExD;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,SAAO;AAAA,IACL,YAAY,OAAO,IAAI;AAAA,IACvB,aAAa,SAAS,qBAAqB,OAAO,OAAO,IAAI;AAAA,EAC/D;AACF;AAEA,SAAS,qBAAqB,OAAqC;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,MACJ,QAAQ,2BAA2B,EAAE,EACrC,QAAQ,SAAS,GAAG,EACpB,KAAK;AACV;AAEA,SAAS,YAAY,OAAyC;AAC5D,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD,CAAC;AACP;AAEA,SAAS,eAAe,OAAyB;AAC/C,SAAO,OAAO,KAAK,YAAY,KAAK,CAAC,EAAE,SAAS;AAClD;AAEA,SAAS,eAAe,OAA+B;AACrD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,QACA;AACN;;;AD7ZA,IAAM,eAAkD;AAAA,EACtD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AACV;AAEO,SAAS,sCACd,UACA,UAAmD,CAAC,GAClB;AAClC,QAAM,4BAA4B;AAAA,IAChC,0BAA0B,QAAQ;AAAA,EACpC;AACA,QAAM,kBAAkB,6BAA6B,QAAQ;AAC7D,QAAM,QAAQ,SAAS,SACpB,OAAO,CAAC,YAAY,QAAQ,YAAY,KAAK,EAC7C,IAAI,CAAC,YAAY;AAChB,UAAM,WAAW,uBAAuB,UAAU,OAAO;AACzD,UAAM,kBAAkB;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,IACF;AACA,UAAM,iBACJ,0BAA0B,IAAI,QAAQ,cAAc,KAAK;AAC3D,UAAM,SAAS,gBAAgB,IAAI,QAAQ,cAAc,KAAK;AAC9D,UAAM,mBAAmB,gBAAgB;AACzC,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AACA,UAAM,gBACJ,gBAAgB,iBAChB,8BAA8B,SAAS,QAAQ,QAAQ,KACvD;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,IACV;AACF,UAAM,SAAS,uCAAuC;AAAA,MACpD,eAAe,2BAA2B,OAAO;AAAA,MACjD,oBAAoB,gBAAgB;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,kBAAkB,QAAQ,cAAc;AAAA,MAC5C,gBAAgB,QAAQ;AAAA,MACxB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ,QAAQ,KAAK,KAAK;AAAA,MAClC;AAAA,MACA,GAAI,+BAA+B,OAAO,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,MACpE,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA,KAAK,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA,yBACE,kBAAkB,WAAW,gBAAgB,WAAW;AAAA,MAC1D,0BAA0B,kBAAkB,oBAAoB;AAAA,MAChE;AAAA,MACA,oBAAoB,gBAAgB,QAAQ;AAAA,MAC5C,uBAAuB,gBAAgB,WAAW;AAAA,MAClD,mBAAmB,gBAAgB;AAAA,MACnC;AAAA,IACF;AAAA,EACF,CAAC,EACA;AAAA,IAAO,CAAC,SACP,gCAAgC,MAAM,QAAQ,gBAAgB;AAAA,EAChE;AAEF,SAAO;AAAA,IACL,cAAc,MAAM,OAAO,0BAA0B,EAAE;AAAA,IACvD,OAAO,MAAM,KAAK,yBAAyB;AAAA,IAC3C,QAAQ,wBAAwB,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,6BACP,gBACA,qBAG4C;AAC5C,QAAM,WAAW,sBAAsB,cAAc;AACrD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,WAAW,SAAS,SAAS,KAAK;AACxC,QAAM,YAAY,SAAS,UAAU,KAAK;AAC1C,MAAI,CAAC,YAAY,CAAC,WAAW;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,SAAS,eAAe,KAAK,KAAK;AACxD,QAAM,iBAAiB,SAAS,gBAAgB,KAAK,KAAK;AAC1D,SAAO;AAAA,IACL;AAAA,IACA,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IACzC;AAAA,IACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,+BACP,SACS;AACT,SAAO,QAAQ,gBAAgB,aAAa;AAC9C;AAEO,SAAS,2BACd,MACS;AACT,SAAO,KAAK,kBAAkB,QAAQ,KAAK,uBAAuB;AACpE;AAEO,SAAS,+BACd,MACS;AACT,SAAO,KAAK,kBAAkB;AAChC;AAEA,SAAS,gCACP,MACA,cACS;AACT,MAAI,CAAC,OAAO,SAAS,YAAY,GAAG;AAClC,WAAO;AAAA,EACT;AACA,MAAI,2BAA2B,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,kBAAkB,KAAK,4BAA4B;AAC1E,SAAO,aAAa,OAAO,YAAY;AACzC;AAEO,SAAS,sCACd,OACmC;AACnC,SAAO,MAAM,OAAO,8BAA8B;AACpD;AAEO,SAAS,6BACd,MACS;AACT,SACE,KAAK,WAAW,eAChB,KAAK,WAAW,cAChB,KAAK,WAAW;AAEpB;AAEA,SAAS,gCACP,OAC8C;AAC9C,QAAM,cAAc,oBAAI,IAA6C;AACrE,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,YAAY,IAAI,KAAK,cAAc;AACpD,QAAI,CAAC,YAAY,KAAK,mBAAmB,SAAS,kBAAkB;AAClE,kBAAY,IAAI,KAAK,gBAAgB,IAAI;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBACP,UACA,SACwB;AACxB,aAAW,aAAa,CAAC,QAAQ,gBAAgB,QAAQ,iBAAiB,GAAG;AAC3E,UAAM,aAAa,WAAW,KAAK,KAAK;AACxC,QAAI,cAAc,SAAS,oBAAoB,UAAU,GAAG;AAC1D,aAAO,SAAS,oBAAoB,UAAU;AAAA,IAChD;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,oBACP,SACA,0BACA,yBACQ;AACR,QAAM,SAAS,yBAAyB,KAAK;AAC7C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,MAAI,OAAO;AACT,WAAO;AAAA,EACT;AACA,SAAO,2BAA2B,QAAQ,YAAY,QAAQ;AAChE;AAEA,SAAS,2BAA2B,SAAuC;AACzE,SAAO,QAAQ,MAAM,KAAK,KAAK,QAAQ,YAAY,QAAQ;AAC7D;AAqBA,SAAS,oCACP,gBACA,UACqC;AACrC,MAAI,0BAA0B;AAC9B,MAAI,2BAA2B;AAC/B,MAAI,4BAA4B,OAAO;AACvC,MAAI,qBACF;AACF,MAAI,2BACF;AACF,MAAI,sBAAqD;AACzD,MAAI,gBAA6C;AAEjD,aAAW,WAAW,UAAU;AAC9B,QAAI,kBAAkB,QAAQ,IAAI,GAAG;AACnC,YAAM,UAAU,eAAe,OAAO;AACtC,UAAI,CAAC,2BAA2B,SAAS;AACvC,kCAA0B;AAAA,MAC5B;AACA,UAAI,SAAS;AACX,cAAM,mBAAmB,kBAAkB,OAAO;AAClD,YAAI,oBAAoB,2BAA2B;AACjD,qCAA2B;AAC3B,sCAA4B;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,QAAIC,oBAAmB,QAAQ,IAAI,GAAG;AACpC,YAAM,UAAU,eAAe,OAAO;AACtC,UAAI,SAAS;AACX,cAAM,mBAAmB,kBAAkB,OAAO;AAClD,YACE,CAAC,sBACD,oBAAoB,mBAAmB,kBACvC;AACA,+BAAqB,EAAE,SAAS,iBAAiB;AAAA,QACnD;AAAA,MACF;AACA,YAAM,gBACJ,4DAA4D,OAAO;AACrE,UAAI,eAAe;AACjB,cAAM,mBAAmB,kBAAkB,OAAO;AAClD,YACE,CAAC,4BACD,oBAAoB,yBAAyB,kBAC7C;AACA,qCAA2B;AAAA,YACzB,SAAS;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,uBAAuB,gBAAgB,OAAO;AAC9D,UACE,YACC,CAAC,iBACA,4BAA4B,SAAS,cAAc,OAAO,IAAI,IAChE;AACA,wBAAgB,EAAE,SAAS,QAAQ;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,CAAC,wBAAwB,QAAQ,MAAM,GAAG;AAC5C,YAAM,SAAS,kBAAkB,OAAO;AACxC,UACE,WACC,CAAC,uBACA,4BAA4B,SAAS,oBAAoB,OAAO,IAAI,IACtE;AACA,8BAAsB,EAAE,SAAS,OAAO;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,eAAe,WAAW;AAAA,IAC7C,eAAe,qBAAqB,UAAU;AAAA,EAChD;AACF;AAEA,SAAS,kBACP,SACkC;AAClC,SACE,0BAA0B,OAAO,KACjC,0BAA0B,OAAO,KACjC,yBAAyB,OAAO;AAEpC;AAEA,SAAS,0BACP,SACkC;AAClC,MAAI,CAAC,oBAAoB,OAAO,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,UAAUC,aAAY,QAAQ,OAAO;AAC3C,QAAM,QAAQA,aAAY,QAAQ,KAAK;AACvC,MAAI,kBAAkB,SAAS,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,YACJC,aAAY,MAAM,SAAS,KAC3BA,aAAY,QAAQ,SAAS,KAC7BA,aAAY,QAAQ,iBAAiB,KACrC,QAAQ;AACV,QAAM,UAAU;AAAA,IACd,GAAG,WAAW,MAAM,OAAO;AAAA,IAC3B,GAAG,WAAW,QAAQ,OAAO;AAAA,EAC/B,EAAE,QAAQ,CAAC,WAAW;AACpB,UAAM,SAASD,aAAY,MAAM;AACjC,UAAM,KACJC,aAAY,OAAO,QAAQ,KAC3BA,aAAY,OAAO,EAAE,KACrBA,aAAY,OAAO,IAAI;AACzB,QAAI,CAAC,IAAI;AACP,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,OACEA,aAAY,OAAO,IAAI,KACvBA,aAAY,OAAO,KAAK,KACxBA,aAAY,OAAO,KAAK,KACxB;AAAA,QACF,MAAMA,aAAY,OAAO,IAAI,KAAK;AAAA,QAClC,GAAIA,aAAY,OAAO,WAAW,IAC9B,EAAE,aAAaA,aAAY,OAAO,WAAW,EAAY,IACzD,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,0BAA0B,EAAE,QAAQ,CAAC;AACvD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,YAAY,SAAS;AAAA,IACzB,QAAQ,QAAQ,UAAU;AAAA,IAC1B;AAAA,IACA,QAAQA,aAAY,QAAQ,MAAM,KAAK,QAAQ;AAAA,IAC/C,OAAOC;AAAA,MACL,WAAW,eAAe;AAAA,MAC1BD,aAAY,QAAQ,OAAO;AAAA,MAC3BA,aAAY,QAAQ,KAAK;AAAA,MACzBA,aAAY,MAAM,KAAK;AAAA,MACvBA,aAAY,MAAM,OAAO;AAAA,MACzB,eAAe,OAAO;AAAA,MACtB,QAAQ;AAAA,IACV;AAAA,IACA,UACEA,aAAY,QAAQ,QAAQ,KAC5BA,aAAY,QAAQ,IAAI,KACxBA,aAAY,QAAQ,IAAI;AAAA,IAC1B,QAAQ,QAAQ,UAAUA,aAAY,QAAQ,MAAM;AAAA,IACpD,OAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,IAC/C;AAAA,IACA,QAAQ;AAAA,IACR,kBAAkB,kBAAkB,OAAO,KAAK;AAAA,EAClD;AACF;AAEA,SAAS,yBACP,SACkC;AAClC,MAAI,CAAC,kBAAkB,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,UAAUD,aAAY,QAAQ,OAAO;AAI3C,QAAM,YAAYA,aAAY,QAAQ,UAAU;AAChD,QAAM,QACJ,OAAO,KAAKA,aAAY,QAAQ,KAAK,CAAC,EAAE,SAAS,IAC7CA,aAAY,QAAQ,KAAK,IACzBA,aAAY,UAAU,KAAK;AACjC,QAAM,YAAY,0BAA0B,MAAM,SAAS;AAC3D,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WACEC,aAAY,MAAM,SAAS,KAC3BA,aAAY,QAAQ,SAAS,KAC7BA,aAAY,QAAQ,oBAAoB,KACxC,QAAQ;AAAA,IACV,OACEA,aAAY,QAAQ,KAAK,KACzBA,aAAY,QAAQ,OAAO,KAC3B,eAAe,OAAO;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,0BACP,SACkC;AAClC,QAAM,UAAUD,aAAY,QAAQ,OAAO;AAC3C,QAAM,QAAQA,aAAY,QAAQ,KAAK;AACvC,MAAI,CAAC,kBAAkB,SAAS,KAAK,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WACEC,aAAY,MAAM,SAAS,KAC3BA,aAAY,QAAQ,SAAS,KAC7B,QAAQ;AAAA,IACV,OACEA,aAAY,MAAM,KAAK,KACvBA,aAAYD,aAAY,MAAM,QAAQ,EAAE,KAAK,KAC7CC,aAAY,QAAQ,KAAK,KACzBA,aAAY,QAAQ,OAAO,KAC3B,eAAe,OAAO;AAAA,IACxB,SAAS,2BAA2B,OAAO,OAAO;AAAA,IAClD,GAAG,mBAAmB,oCAAoC,OAAO,OAAO,CAAC;AAAA,EAC3E;AACF;AAEA,SAAS,mBAAmB,UAE1B;AACA,SAAO,WAAW,EAAE,sBAAsB,SAAS,IAAI,CAAC;AAC1D;AAEA,SAAS,kBACP,SACA,QAAiCD;AAAA,EAC/BA,aAAY,QAAQ,OAAO,EAAE;AAC/B,GACS;AAGT,SACEG,aAAY,yBAAyB,OAAO,GAAG,CAAC,cAAc,CAAC,KAC/D,0BAA0B,KAAK;AAEnC;AAEA,SAAS,8BACP,SACA,QACA,UACkC;AAClC,MAAI,QAAQ,SAAS,KAAK,EAAE,YAAY,MAAM,SAAS;AACrD,WAAO;AAAA,EACT;AAMA,MAAI,WAAW,eAAe,WAAW,QAAQ;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,aAAa,iBAAiB,QAAQ;AAC5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,SAAS;AAAA,IAC3B,CAAC,SACC,KAAK,QAAQ,KAAK,MAAM,cACxBH,aAAY,KAAK,OAAO,EAAE,gBAAgB;AAAA,EAC9C;AACA,QAAM,QAAQ,cAAc,eAAe,WAAW,IAAI;AAC1D,SAAO,qCAAqC,YAAY,KAAK;AAC/D;AAEA,SAAS,uBACP,gBACA,SAC+C;AAC/C,QAAM,SAAS,yBAAyB,OAAO;AAC/C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,SAAS,QAAQ,QAAQ,KAAK,KAAK;AACzC,QAAM,YAAY,QAAQ,UAAU,KAAK;AACzC,QAAM,sBAAsB,SACxB,QAAQ,MAAM,KACd,WAAW,SAAS;AACxB,SAAO;AAAA,IACL,iBAAiB,GAAG,cAAc,IAAI,mBAAmB,IAAI,MAAM;AAAA,IACnE;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBACP,SACyD;AACzD,MAAI,CAACD,oBAAmB,QAAQ,IAAI,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,UAAUC,aAAY,QAAQ,OAAO;AAC3C,QAAM,UAAU,QAAQ,UAAUC,aAAY,QAAQ,MAAM,KAAK,IAC9D,KAAK,EACL,YAAY;AACf,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,iCACP,MACA,QACkC;AAClC,MAAI,CAAC,QAAQ,KAAK,SAAS,gBAAgB,CAAC,QAAQ;AAClD,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,gCAAgC,IAAI;AAAA,IAC/C,OAAO,KAAK,WAAW,KAAK,SAAS,OAAO;AAAA,IAC5C,WAAW;AAAA,MACT;AAAA,QACE,IAAI;AAAA,QACJ,QACE,KAAK,SAAS,eACV,OAAO,mBACP,OAAO;AAAA,QACb,UAAU,KAAK,WAAW,KAAK,SAAS,OAAO;AAAA,QAC/C,SAAS,CAAC;AAAA,QACV,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gCACP,MACQ;AACR,QAAM,CAAC,EAAE,SAAS,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC;AAC1C,SAAO,WAAW,KAAK,KAAK,KAAK;AACnC;AAEA,SAAS,wBACP,OACmC;AACnC,SAAO,MAAM;AAAA,IACX,CAAC,QAAQ,SAAS;AAChB,aAAO,OAAO;AACd,UAAI,2BAA2B,IAAI,GAAG;AACpC,eAAO,WAAW;AAClB,eAAO;AAAA,MACT;AACA,UAAI,6BAA6B,IAAI,GAAG;AACtC,eAAO,aAAa;AACpB,eAAO;AAAA,MACT;AACA,cAAQ,KAAK,QAAQ;AAAA,QACnB,KAAK;AACH,iBAAO,WAAW;AAClB;AAAA,QACF,KAAK;AACH,iBAAO,UAAU;AACjB;AAAA,QACF;AACE;AAAA,MACJ;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,GAAG,aAAa;AAAA,EACpB;AACF;AAEA,SAAS,0BACP,MACA,OACQ;AACR,QAAM,cAAc,2BAA2B,IAAI;AACnD,QAAM,eAAe,2BAA2B,KAAK;AACrD,MAAI,gBAAgB,cAAc;AAChC,WAAO,cAAc,KAAK;AAAA,EAC5B;AACA,SACE,MAAM,iBAAiB,KAAK,kBAC5B,KAAK,eAAe,cAAc,MAAM,cAAc;AAE1D;AAEA,SAASF,oBAAmB,MAAuB;AACjD,QAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,SAAO,eAAe,eAAe,eAAe;AACtD;AAEA,SAAS,kBAAkB,MAAuB;AAChD,SAAO,KAAK,KAAK,EAAE,YAAY,MAAM;AACvC;AAEA,SAAS,wBAAwB,QAA4C;AAC3E,UAAQ,QAAQ,KAAK,EAAE,YAAY,GAAG;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,oBAAoB,SAAwC;AACnE,SAAOI,aAAY,yBAAyB,OAAO,GAAG;AAAA,IACpD;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkB,SAAwC;AACjE,SAAOA,aAAY,yBAAyB,OAAO,GAAG;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,yBAAyB,SAAuC;AACvE,QAAM,UAAUH,aAAY,QAAQ,OAAO;AAC3C,QAAM,QAAQA,aAAY,QAAQ,KAAK;AACvC,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,UAAU;AAAA,IAClBC,aAAY,QAAQ,IAAI,KAAK;AAAA,IAC7BA,aAAY,QAAQ,MAAM,KAAK;AAAA,IAC/BA,aAAY,QAAQ,WAAW,KAAK;AAAA,IACpCA,aAAY,QAAQ,QAAQ,KAAK;AAAA,IACjCA,aAAY,QAAQ,QAAQ,KAAK;AAAA,IACjCA,aAAY,QAAQ,IAAI,KAAK;AAAA,IAC7BA,aAAY,QAAQ,MAAM,KAAK;AAAA,IAC/BA,aAAY,MAAM,IAAI,KAAK;AAAA,IAC3BA,aAAY,MAAM,MAAM,KAAK;AAAA,IAC7BA,aAAY,MAAM,WAAW,KAAK;AAAA,IAClCA,aAAY,MAAM,QAAQ,KAAK;AAAA,IAC/BA,aAAY,MAAM,QAAQ,KAAK;AAAA,IAC/BA,aAAY,MAAM,IAAI,KAAK;AAAA,IAC3BA,aAAY,MAAM,MAAM,KAAK;AAAA,EAC/B,EACG,KAAK,GAAG,EACR,QAAQ,YAAY,EAAE,EACtB,YAAY;AACjB;AAEA,SAAS,4BACP,MACA,OACQ;AACR,SACE,kBAAkB,KAAK,IAAI,kBAAkB,IAAI,KACjD,MAAM,UAAU,KAAK,WACrB,MAAM,UAAU,cAAc,KAAK,SAAS;AAEhD;AAEA,SAASE,aAAY,OAAe,SAAqC;AACvE,SAAO,QAAQ;AAAA,IAAK,CAAC,WACnB,MAAM,SAAS,OAAO,QAAQ,YAAY,EAAE,EAAE,YAAY,CAAC;AAAA,EAC7D;AACF;AAEA,SAAS,eAAe,SAAuC;AAC7D,SAAOD;AAAA,IACLD,aAAY,QAAQ,QAAQ,OAAO;AAAA,IACnCA,aAAY,QAAQ,QAAQ,aAAa;AAAA,IACzCA,aAAY,QAAQ,QAAQ,IAAI;AAAA,IAChCA,aAAY,QAAQ,QAAQ,OAAO;AAAA,IACnCA,aAAY,QAAQ,QAAQ,OAAO;AAAA,IACnCA,aAAY,QAAQ,QAAQ,IAAI;AAAA,IAChCA,aAAY,QAAQ,QAAQ,KAAK;AAAA,EACnC;AACF;AAEA,SAAS,kBAAkB,SAAuC;AAChE,SACEG,gBAAe,QAAQ,gBAAgB,KACvCA,gBAAe,QAAQ,iBAAiB,KACxCA,gBAAe,QAAQ,eAAe,KACtCA,gBAAe,QAAQ,OAAO,KAC9B;AAEJ;AAEA,SAASF,wBAAuB,QAAsC;AACpE,SAAO,OAAO,KAAK,CAAC,UAAU,UAAU,QAAQ,MAAM,SAAS,CAAC,KAAK;AACvE;AAEA,SAASD,aAAY,OAA+B;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAASD,aAAY,OAAyC;AAC5D,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD,CAAC;AACP;AAEA,SAAS,WAAW,OAA2B;AAC7C,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;AAEA,SAASI,gBAAe,OAA+B;AACrD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,QACA;AACN;;;AEh1BA,SAAS,aAAAC,YAAW,SAAS,UAAAC,SAAQ,YAAAC,iBAA0B;AAC/D,SAAS,MAAAC,WAAU;;;ACDnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AA+FG,SAOI,OAAAC,MAPJ;AA9CV,SAAS,wCACP,OACM;AACN,QAAM,gBAAgB;AACxB;AAEO,IAAM,kCAAkC;AAAA,EAC7C,SAASC,iCAAgC;AAAA,IACvC;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsD;AACpD;AACA,UAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,UAAM,SAAS,KAAK;AACpB,UAAM,eAAe,qCAAqC,MAAM;AAAA,MAC9D,UAAU,oBAAoB;AAAA,IAChC,CAAC;AACD,UAAM,UAAU,4BAA4B,IAAI;AAChD,UAAM,gBAAgB,YAAY,IAAI;AACtC,UAAM,aAAa,wBAAwB,IAAI;AAC/C,UAAM,cAAc,kCAAkC,eAAe,CAAC;AAEtE,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAWC;AAAA,UACT;AAAA,UACA,2BAA2B,IAAI,KAC7B;AAAA,UACF,eAAe;AAAA,QACjB;AAAA,QACA,oBAAkB,cAAc,SAAS;AAAA,QACzC,mCAAiC,KAAK,OAAO,QAAQ;AAAA,QACrD,+BAA6B,KAAK;AAAA,QAClC,gBAAc,2BAA2B,IAAI,IAAI,SAAS;AAAA,QAC1D,eAAa;AAAA,QACb,UAAU,cAAc,KAAK;AAAA,QAE7B;AAAA,+BAAC,SAAI,WAAU,qDACb;AAAA,iCAAC,SAAI,WAAU,qCACb;AAAA,8BAAAF;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,MAAK;AAAA,kBACL,OAAM;AAAA,kBACN,WAAU;AAAA,kBAEV,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,eAAe;AAAA,sBAEd;AAAA;AAAA,kBACH;AAAA;AAAA,cACF;AAAA,cACC,KAAK,MAAM,gBAAAA,KAAC,mBAAgB,MAAM,KAAK,KAAK,IAAK;AAAA,eACpD;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAWE;AAAA,kBACT;AAAA,kBACA,6BAA6B,UAAU;AAAA,gBACzC;AAAA,gBACA,eAAa;AAAA,gBACb,OAAO;AAAA,gBAEP;AAAA,kCAAAF;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM;AAAA,sBACN,OACE,2BAA2B,IAAI,KAAK,KAAK,WAAW;AAAA,sBAEtD,MAAK;AAAA,sBACL,OAAO;AAAA;AAAA,kBACT;AAAA,kBACA,gBAAAA,KAAC,UAAM,uBAAY;AAAA;AAAA;AAAA,YACrB;AAAA,aACF;AAAA,UAEC,UACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,YAAY,EAAE,gDAAgD;AAAA;AAAA,UAChE,IACE;AAAA,UAEH,UAAU,cACT,gBAAAA,KAAC,SAAI,WAAU,WACb,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,UAAQ;AAAA,cACR,SAAQ;AAAA,cACR,mBAAmB;AAAA,cACnB;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN;AAAA,gBACA,KAAK;AAAA,cACP;AAAA;AAAA,UACF,GACF,IACE;AAAA,UAEJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,KAAK;AAAA,cACf;AAAA,cACA,OAAO,EAAE,+CAA+C;AAAA,cACxD;AAAA,cAIA,eAAe,eAAe,WAAW;AAAA;AAAA,UAC3C;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAM,6BAA6B;AACnC,IAAM,4CAA4C;AAClD,IAAM,yCAAyC;AAC/C,IAAM,6CAA6C;AACnD,IAAM,0CAA0C;AAChD,IAAM,mDAAmD;AAEzD,SAAS,uBAAuB,SAI9B;AACA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,OAAO;AAC9C,QAAM,UAAU,WAAW,CAAC;AAE5B,kBAAgB,MAAM;AACpB,QAAI,SAAS;AACX,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,UAAM,YAAY,OAAO,WAAW,MAAM;AACxC,iBAAW,KAAK;AAAA,IAClB,GAAG,0BAA0B;AAC7B,WAAO,MAAM;AACX,aAAO,aAAa,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAiB;AAAA,IACrB,CAAC,UAA+C;AAC9C,UAAI,MAAM,WAAW,MAAM,iBAAiB,SAAS;AACnD,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SAAO,EAAE,SAAS,SAAS,eAAe;AAC5C;AAEO,IAAM,mCAAmC;AAAA,EAC9C,SAASG,kCAAiC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA8D;AAC5D;AACA,UAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,UAAM,gBAAgB,uBAAuB,CAAC,QAAQ;AACtD,UAAM,cAAc,uBAAuB,QAAQ;AACnD,UAAM,eAAe,kCAAkC;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,YAAY;AAAA,IACvB,CAAC;AACD,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB;AAAA,MACpB;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAWD,IAAG,kCAAkC,SAAS;AAAA,QACzD,oBAAkB,MAAM;AAAA,QACxB,qBAAkB;AAAA,QAClB,oBAAkB,WAAW,aAAa;AAAA,QAC1C,0BAAwB,MAAM,CAAC,GAAG;AAAA,QAClC,eAAa,iCAAiC,OAAO;AAAA,QAEpD;AAAA,wBAAc,UACb,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,WAAWE;AAAA,gBACT;AAAA,gBACA,cAAc,UACV,wDACA;AAAA,cACN;AAAA,cACA,gBAAgB,cAAc;AAAA,cAE9B,0BAAAF;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAa,cAAc,UAAU,OAAO;AAAA,kBAC5C,OAAO,cAAc,UAAU,OAAO;AAAA,kBAEtC,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA;AAAA;AAAA,kBACF;AAAA;AAAA,cACF;AAAA;AAAA,UACF,IACE;AAAA,UAEH,YAAY,UACX,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAWE;AAAA,gBACT;AAAA,gBACA,YAAY,UACR,wDACA;AAAA,cACN;AAAA,cACA,gBAAgB,YAAY;AAAA,cAE5B;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAa,YAAY,UAAU,OAAO;AAAA,kBAC1C,OAAO,YAAY,UAAU,OAAO;AAAA,kBAEpC;AAAA,yCAAC,SAAI,WAAU,iEACb;AAAA,2CAAC,UAAK,WAAU,qGACd;AAAA,wCAAAF;AAAA,0BAAC;AAAA;AAAA,4BACC,UAAU,MAAM,CAAC,GAAG,YAAY;AAAA,4BAChC,UAAU,MAAM,CAAC,GAAG,YAAY;AAAA,4BAChC,QAAQ,MAAM,CAAC,GAAG,UAAU;AAAA;AAAA,wBAC9B;AAAA,wBACA,gBAAAA,KAAC,UAAK,WAAU,oBACb;AAAA,0BACC;AAAA,0BACA;AAAA,4BACE,OAAO,MAAM;AAAA,0BACf;AAAA,wBACF,GACF;AAAA,yBACF;AAAA,sBACA,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAS;AAAA,0BACT,MAAK;AAAA,0BACL,OAAM;AAAA,0BAEN,0BAAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,MAAK;AAAA,8BACL,SAAQ;AAAA,8BACR,MAAK;AAAA,8BACL,cAAY;AAAA,8BACZ,WAAU;AAAA,8BACV,SAAS,MAAM,WAAW,OAAO;AAAA,8BAEjC,0BAAAA,KAAC,aAAU,WAAU,YAAW,eAAY,QAAO;AAAA;AAAA,0BACrD;AAAA;AAAA,sBACF;AAAA,uBACF;AAAA,oBACA,gBAAAA,KAAC,SAAI,WAAU,iCACZ,uBAAa;AAAA,sBAAI,CAAC,MAAM,iBACvB,WAAW,MAAM,EAAE,aAAa,CAAC;AAAA,oBACnC,GACF;AAAA;AAAA;AAAA,cACF;AAAA;AAAA,UACF,IACE;AAAA;AAAA;AAAA,IACN;AAAA,EAEJ;AAAA,EACA;AACF;AAEA,SAAS,gCACP,UACA,MACS;AACT,MACE,SAAS,cAAc,KAAK,aAC5B,SAAS,aAAa,KAAK,YAC3B,SAAS,YAAY,KAAK,WAC1B,SAAS,eAAe,KAAK,cAC7B,SAAS,aAAa,KAAK,YAC3B,SAAS,eAAe,KAAK,YAC7B;AACA,WAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU;AACjB,WACE,SAAS,sBAAsB,KAAK,qBACpC,SAAS,UAAU,KAAK;AAAA,EAE5B;AACA,SACE,qCAAqC,SAAS,KAAK,MACnD,qCAAqC,KAAK,KAAK;AAEnD;AAEA,SAAS,qCACP,OACQ;AACR,QAAM,YAAY,MAAM,CAAC;AACzB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,QAAM,aAAa,MAAM,KAAK,0BAA0B,IAAI,MAAM;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU,UAAU;AAAA,IACpB,UAAU,UAAU,YAAY;AAAA,IAChC,UAAU,UAAU,aAAa;AAAA,IACjC;AAAA,IACA,8BAA8B,SAAS;AAAA,EACzC,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,kCAAkC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKsC;AACpC,QAAM,QAAQ,MAAM;AACpB,QAAM,mBACJ,sBAAsB,QAAQ,sBAAsB,SAChD,KACA,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,iBAAiB;AAC7D,QAAM,eAAe,KAAK;AAAA,IACxB;AAAA,IACA,KAAK,IAAI,2CAA2C,mBAAmB,CAAC;AAAA,EAC1E;AACA,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,YAAY;AAE3D,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,qBAAe,YAAY;AAC3B;AAAA,IACF;AACA;AAAA,MAAe,CAAC,YACd,KAAK,IAAI,KAAK,IAAI,SAAS,YAAY,GAAG,KAAK;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,OAAO,CAAC;AAEjC,YAAU,MAAM;AACd,QAAI,CAAC,YAAY,CAAC,WAAW,eAAe,OAAO;AACjD,aAAO;AAAA,IACT;AACA,UAAM,YAAY,OAAO,WAAW,MAAM;AACxC;AAAA,QAAe,CAAC,YACd,KAAK,IAAI,UAAU,wCAAwC,KAAK;AAAA,MAClE;AAAA,IACF,GAAG,0CAA0C;AAC7C,WAAO,MAAM;AACX,aAAO,aAAa,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,UAAU,OAAO,SAAS,WAAW,CAAC;AAE1C,SAAO,MAAM,MAAM,GAAG,KAAK,IAAI,aAAa,KAAK,CAAC;AACpD;AAEA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,YAAY,MAAM,CAAC;AACzB,QAAM,aAAa,MAAM,KAAK,CAAC,SAAS,2BAA2B,IAAI,CAAC;AACxE,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,EAAE,wDAAwD;AAAA,QACpE,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,MACD,WAAWE;AAAA,QACT;AAAA,QACA,MAAM,SAAS,IAAI,cAAc;AAAA,MACnC;AAAA,MACA,4BAA0B,MAAM;AAAA,MAChC,uBAAqB,UAAU;AAAA,MAC/B,sBAAoB,UAAU,UAAU;AAAA,MACxC,eAAa,yCAAyC,OAAO;AAAA,MAC7D,SAAS,MAAM,SAAS,OAAO;AAAA,MAE/B;AAAA,QAAC;AAAA;AAAA,UACC,WAAWA;AAAA,YACT;AAAA,YACA,MAAM,SAAS,IACX,mJACA;AAAA,YACJ,cACE;AAAA,UACJ;AAAA,UAEA;AAAA,iCAAC,UAAK,WAAU,qDACd;AAAA,mCAAC,UAAK,WAAU,mCACd;AAAA,gCAAAF;AAAA,kBAAC;AAAA;AAAA,oBACC,UAAU,UAAU;AAAA,oBACpB,UAAU,UAAU;AAAA,oBACpB,QAAQ,UAAU;AAAA;AAAA,gBACpB;AAAA,gBACA,gBAAAA,KAAC,UAAK,WAAU,iFACb,YAAE,0DAA0D;AAAA,kBAC3D,OAAO,MAAM;AAAA,gBACf,CAAC,GACH;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cACd;AAAA,eACF;AAAA,YACA,gBAAAA,KAAC,UAAK,WAAU,wGACd,0BAAAA,KAAC,UAAK,WAAU,iDACb,yCAA+B,SAAS,GAC3C,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,iCACP,MACQ;AACR,SACE,KAAK,OAAO,QAAQ,QAAQ,KAAK,KACjC,KAAK,wBAAwB,KAAK,KAClC,KAAK;AAET;AAEO,SAAS,8BACd,MACQ;AACR,SAAO,8BAA8B,iCAAiC,IAAI,GAAG;AAAA,IAC3E,UAAU,oBAAoB;AAAA,EAChC,CAAC;AACH;AAEA,IAAM,+CACJ;AACF,IAAM,8CAA8C;AAa7C,SAAS,+BACd,MACa;AACb,QAAM,OAAO,iCAAiC,IAAI;AAClD,QAAM,QAAqB,CAAC;AAC5B,MAAI,YAAY;AAChB,MAAI,eAAe;AAEnB,aAAW,SAAS,KAAK;AAAA,IACvB;AAAA,EACF,GAAG;AACD,UAAM,CAAC,WAAW,WAAW,IAAI,OAAO,EAAE,IAAI;AAC9C,UAAM,aAAa,MAAM,SAAS;AAClC,QAAI,aAAa,WAAW;AAC1B,YAAM,KAAK,KAAK,MAAM,WAAW,UAAU,CAAC;AAAA,IAC9C;AAEA,UAAM,QAAQ,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AACA,UAAM,UAAU,yBAAyB,MAAM,KAAK;AACpD,QAAI,CAAC,SAAS;AACZ,YAAM,KAAK,sBAAsB,IAAI,IAAI,QAAQ,SAAS;AAAA,IAC5D,OAAO;AACL,YAAM,OAAO,gCAAgC,QAAQ,UAAU;AAC/D,YAAM,eAAe,SAAS,QAAQ;AACtC,YAAM;AAAA,QACJ,OACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,OAAO;AAAA;AAAA,UAFF,WAAW,YAAY;AAAA,QAG9B,IAEA;AAAA,MAEJ;AACA,sBAAgB;AAAA,IAClB;AAEA,gBAAY,aAAa,UAAU;AAAA,EACrC;AAEA,MAAI,YAAY,KAAK,QAAQ;AAC3B,UAAM,KAAK,KAAK,MAAM,SAAS,CAAC;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,gCACP,YACwC;AACxC,UAAQ,WAAW,KAAK,EAAE,YAAY,GAAG;AAAA,IACvC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,gCAAgC;AAAA,EACvC;AAAA,EACA;AACF,GAGiB;AACf,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,2BAAyB;AAAA,MAEzB;AAAA,wBAAAA,KAAC,UAAK,WAAU,gCAA+B,eAAY,QACxD,mBAAS,kBACR,gBAAAA,KAAC,aAAU,WAAU,YAAW,eAAY,QAAO,IAEnD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd,GAEJ;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA;AAAA;AAAA,EACxD;AAEJ;AAEO,SAAS,uCACd,MACA,OAIe;AACf,MAAI,MAAM,QAAQ;AAChB,WAAO,yCAAyC,MAAM,MAAM;AAAA,EAC9D;AAEA,MAAI,CAAC,MAAM,UAAU;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK;AACpB,QAAM,SACJ,UAAU,aAAa,SACnB,OAAO,QAAQ,KAAK,CAAC,cAAc,UAAU,OAAO,MAAM,QAAQ,IAClE;AACN,QAAM,cAAc,GAAG,QAAQ,QAAQ,EAAE,IAAI,MAAM,QAAQ,GAAG,YAAY;AAC1E,MAAI,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,QAAQ,GAAG;AACnE,WAAO;AAAA,EACT;AACA,MACE,YAAY,SAAS,MAAM,KAC3B,YAAY,SAAS,QAAQ,KAC7B,YAAY,SAAS,UAAU,GAC/B;AACA,WAAO;AAAA,EACT;AACA,SAAO,MAAM;AACf;AAEO,SAAS,2CACd,GACA,UACA;AACA,SAAO;AAAA,IACL,cAAc,EAAE,uCAAuC;AAAA,MACrD,UAAU,WACN,4BAA4B,QAAQ,IACpC,EAAE,2CAA2C;AAAA,IACnD,CAAC;AAAA,IACD,UAAU,EAAE,6BAA6B;AAAA,IACzC,WAAW;AAAA,MACT;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,gDAAgD;AAAA,QACzD,aAAa,EAAE,sDAAsD;AAAA,MACvE;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,6CAA6C;AAAA,QACtD,aAAa,EAAE,mDAAmD;AAAA,MACpE;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,6CAA6C;AAAA,QACtD,aAAa,EAAE,mDAAmD;AAAA,MACpE;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO,EAAE,yCAAyC;AAAA,QAClD,aAAa,EAAE,+CAA+C;AAAA,MAChE;AAAA,IACF;AAAA,IACA,YAAY,EAAE,+BAA+B;AAAA,IAC7C,cAAc,EAAE,iCAAiC;AAAA,IACjD,qBAAqB,EAAE,wCAAwC;AAAA,IAC/D,kBAAkB,EAAE,qCAAqC;AAAA,IACzD,cAAc,EAAE,iCAAiC;AAAA,IACjD,eAAe,EAAE,kCAAkC;AAAA,IACnD,mBAAmB,EAAE,sCAAsC;AAAA,IAC3D,kBAAkB,EAAE,qCAAqC;AAAA,IACzD,wBAAwB,EAAE,2CAA2C;AAAA,IACrE,2BAA2B;AAAA,MACzB;AAAA,IACF;AAAA,IACA,uCAAuC;AAAA,MACrC;AAAA,IACF;AAAA,IACA,wBAAwB,EAAE,2CAA2C;AAAA,IACrE,wBAAwB,EAAE,2CAA2C;AAAA,EACvE;AACF;AAEA,SAAS,yCAAyC,QAAwB;AACxE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,4BACP,MACQ;AACR,QAAM,UAAU,KAAK,OAAO,QAAQ,QAAQ,KAAK;AACjD,MACE,KAAK,eAAe,SAAS,cAC7B,yBAAyB,OAAO,GAChC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAA0B;AAC1D,QAAM,aAAa,QAAQ,KAAK,EAAE,YAAY;AAC9C,SAAO,eAAe;AACxB;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMgB;AACd;AACA,QAAM,aAAa,OAA8B,IAAI;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB,CAAC,WAAsC;AACrC;AAAA,QACE,OAAO,SAAS,wBAAwB,CAAC,OAAO,WAC5C,EAAE,GAAG,QAAQ,UAAU,KAAK,SAAS,IACrC;AAAA,MACN;AAAA,IACF;AAAA,IACA,CAAC,KAAK,UAAU,YAAY;AAAA,EAC9B;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,uBAAuB;AAC1B,uBAAiB,KAAK;AACtB,aAAO;AAAA,IACT;AACA,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB,MAAM;AAChC,uBAAiB,QAAQ,eAAe,QAAQ,eAAe,CAAC;AAAA,IAClE;AAEA,QAAI,iBAAwC;AAC5C,UAAM,YAAY,OAAO,WAAW,MAAM;AACxC,0BAAoB;AACpB,uBAAiB,IAAI,eAAe,mBAAmB;AACvD,qBAAe,QAAQ,OAAO;AAAA,IAChC,GAAG,gDAAgD;AACnD,WAAO,MAAM;AACX,aAAO,aAAa,SAAS;AAC7B,sBAAgB,WAAW;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,uBAAuB,OAAO,CAAC;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAWE;AAAA,QACT;AAAA,QACA,iBAAiB;AAAA,MACnB;AAAA,MACA,mBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,oBAAmB;AAAA,MACnB,SAAS;AAAA,MAER,qBAAW,0BACV,gBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV,cAAc;AAAA,UACd,sBAAsB;AAAA,YACpB,eAAe,KAAK,OAAO;AAAA,YAC3B,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,UACV;AAAA,UACA,iBAAe;AAAA;AAAA,MACjB,IACE,UACF,gBAAAA,KAAC,SAAI,WAAU,gDACZ,mBACH,IAEA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,iCACP,KACA,MACS;AACT,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,CAAC,IAAI;AAExC,YAAU,MAAM;AACd,aAAS,CAAC,IAAI;AAAA,EAChB,GAAG,CAAC,IAAI,CAAC;AAET,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,WAAW,OAAO,yBAAyB,aAAa;AAC3D,eAAS,IAAI;AACb,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,YAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,GAAG;AACjD,mBAAS,IAAI;AACb,mBAAS,WAAW;AAAA,QACtB;AAAA,MACF;AAAA,MACA,EAAE,YAAY,wCAAwC;AAAA,IACxD;AACA,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC;AAErB,SAAO;AACT;AAEA,SAAS,4CACP,KACA,SACS;AACT,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AAExC,YAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,eAAS,KAAK;AACd,aAAO;AAAA,IACT;AACA,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,WAAW,OAAO,yBAAyB,aAAa;AAC3D,YAAMI,aAAY,OAAO;AAAA,QACvB,MAAM,SAAS,IAAI;AAAA,QACnB;AAAA,MACF;AACA,aAAO,MAAM;AACX,eAAO,aAAaA,UAAS;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,YAA2B;AAC/B,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,YAAI,CAAC,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,GAAG;AAClD;AAAA,QACF;AACA,iBAAS,WAAW;AACpB,oBAAY,OAAO;AAAA,UACjB,MAAM,SAAS,IAAI;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,YAAY,wCAAwC;AAAA,IACxD;AACA,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM;AACX,eAAS,WAAW;AACpB,UAAI,cAAc,MAAM;AACtB,eAAO,aAAa,SAAS;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,GAAG,CAAC;AAExB,SAAO;AACT;AAEA,SAAS,4BAA4B;AAAA,EACnC,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMgB;AACd;AAEA,SACE,qBAAC,SAAI,WAAU,0FACb;AAAA,oBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,KAAK;AAAA,QACf;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAWE;AAAA,UACT;AAAA,UACA,CAAC,iBACC;AAAA,QACJ;AAAA,QACA,SAAS,MACP,WAAW;AAAA,UACT,gBAAgB,KAAK;AAAA,UACrB,UAAU,KAAK;AAAA,QACjB,CAAC;AAAA,QAGH;AAAA,0BAAAF;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,aAAa;AAAA,cACb,eAAY;AAAA;AAAA,UACd;AAAA,UACC;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AACF,GAGgB;AACd;AAEA,MAAI,CAAC,UAAU;AACb,WAAO,gBAAAA,KAAC,sBAAmB,UAAoB;AAAA,EACjD;AAEA,QAAM,iBACJ,SAAS,gBAAgB,KAAK,KAAK,2BAA2B,QAAQ;AACxE,QAAM,QAAQ,GAAG,SAAS,QAAQ,MAAM,SAAS,SAAS;AAE1D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAe,SAAS;AAAA,YACxB,UAAU,SAAS;AAAA,YACnB;AAAA;AAAA,QACF;AAAA,QACA,qBAAC,UAAK,WAAU,8IACd;AAAA,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,mBAAS,UAAS;AAAA,UACtD,gBAAAA,KAAC,UAAK,WAAU,wCAAuC,eAAC;AAAA,UACxD,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,mBAAS,WAAU;AAAA,WACzD;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,gCAAgC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,GAIgB;AACd;AAEA,QAAM,WAAW,UAAU,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK;AAChE,MAAI,CAAC,UAAU;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,2BAA2B,QAAQ;AAAA,QACxC,KAAI;AAAA,QACJ,WAAU;AAAA,QACV,UAAS;AAAA,QACT,SAAQ;AAAA,QACR,WAAW;AAAA,QACX,eAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAe,UAAU;AAAA,MACzB;AAAA,MACA,gBACE,UAAU,gBAAgB,KAAK,KAAK,2BAA2B,QAAQ;AAAA;AAAA,EAE3E;AAEJ;AAEO,SAAS,iCAAiC;AAAA,EAC/C;AAAA,EACA,eAAe;AAAA,EACf;AACF,GAIgB;AACd;AACA,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,QAAM,gBAAgB,kBAAkB,KAAK,KAAK;AAClD,QAAM,eACJ,cAAc,SAAS,KAAK,CAAC,mBACzB,gBACA;AAEN,YAAU,MAAM;AACd,wBAAoB,KAAK;AAAA,EAC3B,GAAG,CAAC,aAAa,CAAC;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MAEZ;AAAA,wBAAAA,KAAC,UAAK,WAAU,mIACd,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAS;AAAA,YACT,SAAQ;AAAA,YACR,gBAAe;AAAA,YACf,WAAW;AAAA,YACX,SAAS,MAAM;AACb,kCAAoB,IAAI;AAAA,YAC1B;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,2IACd,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,UAAS;AAAA,YACT,SAAQ;AAAA,YACR,WAAW;AAAA;AAAA,QACb,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,gBAAgB,EAAE,KAAK,GAAkC;AAChE;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,MAAK;AAAA,MACL,OAAM;AAAA,MACN,WAAU;AAAA,MAEV,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAY;AAAA,UAEZ,0BAAAA,KAAC,QAAK,WAAU,YAAW,aAAa,GAAG,eAAY,QAAO;AAAA;AAAA,MAChE;AAAA;AAAA,EACF;AAEJ;AASA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMgB;AACd;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAEtC,QAAM,cAAc,YAAY,MAAM;AACpC,gBAAY,IAAI;AAChB,YAAQ,IAAI;AAAA,EACd,GAAG,CAAC,CAAC;AACL,QAAM,cAAc,YAAY,MAAM;AACpC,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,aAAa,UAAU;AAAA,IACrC,QAAQ,CAAC,UAAwC;AAC/C,eAAS,MAAM,SAAS,KAAK;AAC7B,kBAAY;AAAA,IACd;AAAA,IACA,SAAS,CAAC,UAAwC;AAChD,eAAS,MAAM,UAAU,KAAK;AAC9B,kBAAY;AAAA,IACd;AAAA,IACA,gBAAgB,CAAC,UAA0C;AACzD,eAAS,MAAM,iBAAiB,KAAK;AACrC,kBAAY;AAAA,IACd;AAAA,IACA,gBAAgB,CAAC,UAA0C;AACzD,eAAS,MAAM,iBAAiB,KAAK;AACrC,kBAAY;AAAA,IACd;AAAA,EACF,CAAC;AAED,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,SACjC;AAAA,oBAAAA,KAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,IACjC,gBAAAA,KAAC,kBAAe,MAAY,OAAc,WACvC,mBACH;AAAA,KACF;AAEJ;AAEA,SAAS,mBAAmB,EAAE,SAAS,GAAsC;AAC3E;AACA,QAAM,QAAQ,4BAA4B,QAAQ;AAElD,SACE,qBAAC,UAAK,WAAU,gGACd;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,2BAA2B,QAAQ;AAAA,QACxC,KAAI;AAAA,QACJ,WAAU;AAAA,QACV,UAAS;AAAA,QACT,SAAQ;AAAA,QACR,WAAW;AAAA,QACX,eAAY;AAAA;AAAA,IACd;AAAA,IACA,gBAAAA,KAAC,UAAK,WAAU,qHACb,iBACH;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,MAA+C;AAClE,MAAI,2BAA2B,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,KAAK;AACd;AASA,SAAS,wBACP,MACyB;AACzB,MAAI,2BAA2B,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,eAAe,KAAK,WAAW,QAAQ;AACzD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,YAAY;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,6BACd,MACQ;AACR,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AD9pCM,gBAAAK,MACE,QAAAC,aADF;AApHN,IAAM,gBAAgB;AACtB,IAAM,4BAA4B;AAClC,IAAM,mCAAmC;AAoBlC,SAAS,yCAAyC;AAAA,EACvD;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsE;AACpE;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,QAAM,UAAU;AAAA,IACd,MAAM,eAAe,OAAO,iBAAiB;AAAA,IAC7C,CAAC,OAAO,iBAAiB;AAAA,EAC3B;AAIA,QAAM,eAAe,QAAQ,CAAC,GAAG,eAAe,aAAa;AAC7D,QAAM,yBACJ,QAAQ,CAAC,GAAG,OAAO,qBAAqB,sBAAsB;AAChE,QAAM,0BAA0BC,QAAsB,IAAI;AAC1D,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC;AAAA,IAChD;AAAA,EACF;AAEA,EAAAC,WAAU,MAAM;AACd,UAAM,uBAAuB,wBAAwB;AACrD,4BAAwB,UAAU;AAClC,QACE,CAAC,gBACD,0BACA,yBAAyB,QACzB,yBAAyB,cACzB;AACA,aAAO;AAAA,IACT;AACA,yBAAqB,YAAY;AACjC,UAAM,YAAY,OAAO,WAAW,MAAM;AACxC;AAAA,QAAqB,CAAC,YACpB,YAAY,eAAe,OAAO;AAAA,MACpC;AAAA,IACF,GAAG,yBAAyB;AAC5B,WAAO,MAAM;AACX,aAAO,aAAa,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,wBAAwB,YAAY,CAAC;AAEzC,QAAM,mBACJ,sBAAsB,QAAQ,sBAAsB;AAEtD,QAAM,qBAAqBF;AAAA,IACzB;AAAA,EACF;AACA,QAAM,CAAC,aAAa,cAAc,IAChCC,UAAiD,IAAI;AAEvD,EAAAC,WAAU,MAAM;AACd,UAAM,kBAAkB,mBAAmB;AAC3C,uBAAmB,UAAU,QAAQ,CAAC,KAAK;AAC3C,QACE,mBACA,gBAAgB,QAAQ,QAAQ,CAAC,GAAG,MAAM,SAC1C,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,gBAAgB,EAAE,GACpD;AACA,qBAAe,eAAe;AAC9B,YAAM,YAAY,OAAO,WAAW,MAAM;AACxC;AAAA,UAAe,CAAC,YACd,SAAS,OAAO,gBAAgB,KAAK,OAAO;AAAA,QAC9C;AAAA,MACF,GAAG,gCAAgC;AACnC,aAAO,MAAM;AACX,eAAO,aAAa,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,QAAM,UAAU,QAAQ,CAAC;AACzB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,KAAK,IAAI,QAAQ,SAAS,GAAG,aAAa;AAC5D,QAAM,kBACJ,wBACA,GAAG,QAAQ,cAAc,IAAI,QAAQ,eAAe,SAAS;AAE/D,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAY,EAAE,0DAA0D;AAAA,MAExE;AAAA,wBAAAD,KAAC,SAAI,WAAU,0DACb,0BAAAC,MAAC,SAAI,WAAU,oEACZ;AAAA,YAAE,0DAA0D;AAAA,UAAE;AAAA,UAAG;AAAA,UACjE,QAAQ;AAAA,WACX,GACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAWI;AAAA,cACT;AAAA,cACA,YAAY,IAAI,cAAc,YAAY,KAAK;AAAA,YACjD;AAAA,YACA,eAAY;AAAA,YACZ,mBAAiB,QAAQ;AAAA,YACzB,wBAAsB;AAAA,YACtB,yBAAuB,QAAQ;AAAA,YAE9B;AAAA,4BACC,gBAAAL;AAAA,gBAAC;AAAA;AAAA,kBAEC,eAAY;AAAA,kBACZ,OAAK;AAAA,kBACL,6BAA2B,YAAY;AAAA,kBACvC,WAAU;AAAA,kBACV,gBAAgB,CAAC,UAAU;AACzB,wBAAI,MAAM,WAAW,MAAM,eAAe;AACxC;AAAA,wBAAe,CAAC,YACd,SAAS,OAAO,YAAY,KAAK,OAAO;AAAA,sBAC1C;AAAA,oBACF;AAAA,kBACF;AAAA,kBAEA,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAa;AAAA,sBACb,cAAc;AAAA,sBACd,MAAM;AAAA,sBACN;AAAA,sBACA,gBAAgB,MAAM;AAAA,sBAAC;AAAA;AAAA,kBACzB;AAAA;AAAA,gBAnBK,WAAW,YAAY,cAAc;AAAA,cAoB5C,IACE;AAAA,cACJ,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAWK;AAAA,oBACT;AAAA,oBACA,YAAY,IACR,mJACA,YAAY,KACV;AAAA,kBACR;AAAA,kBAEA,0BAAAL;AAAA,oBAAC;AAAA;AAAA,sBACC,SACE,eACI,CAAC,SAAS,aAAa,QAAQ,IAAI,IAAI,IACvC;AAAA,sBAEN,aAAa,QAAQ,OAAO;AAAA,sBAC5B,aAAW;AAAA,sBACX,cAAc,mBAAmB;AAAA,sBACjC,MAAM;AAAA,sBACN;AAAA,sBACA;AAAA,sBACA,gBAAgB,CAAC,UAAU,eAAe,SAAS,KAAK;AAAA;AAAA,kBAC1D;AAAA;AAAA,gBAtBK,QAAQ;AAAA,cAuBf;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,eACP,OACA,mBACmC;AACnC,MAAI,CAAC,mBAAmB;AACtB,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AACA,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,iBAAiB;AACrE,MAAI,SAAS,GAAG;AACd,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AACA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,QAAM,CAAC,MAAM,IAAI,KAAK,OAAO,OAAO,CAAC;AACrC,SAAO,SAAS,CAAC,QAAQ,GAAG,IAAI,IAAI;AACtC;;;AE9MA,SAAS,kBAAkB;AAC3B;AAAA,EACE,UAAAM;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AC+BA,SAAS,uCACd,OAC+B;AAC/B,QAAM,SAAS,oBAAI,IAAyC;AAC5D,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,8BAA8B,IAAI;AAClD,UAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,QAAI,OAAO;AACT,YAAM,MAAM,KAAK,IAAI;AAAA,IACvB,OAAO;AACL,aAAO,IAAI,SAAS;AAAA,QAClB,IAAI;AAAA,QACJ,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,CAAC,IAAI;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEO,SAAS,8BACd,MACQ;AACR,QAAM,WAAW,KAAK,SAAS,KAAK,EAAE,YAAY,KAAK;AACvD,QAAM,SAAS,KAAK,QAAQ,KAAK,KAAK;AACtC,SAAO,cAAc,QAAQ,IAAI,MAAM;AACzC;AAEO,SAAS,2BACd,SACA,SACQ;AACR,SAAO,YAAY,UAAU,UAAU,GAAG,OAAO,IAAI,OAAO;AAC9D;AAEO,SAAS,oCAAoC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,GAIW;AACT,QAAM,UAAU,2BAA2B,SAAS,MAAM,EAAE;AAC5D,MAAI,UAAU;AACZ,WAAO,YAAY,OAAO,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EAC5E;AACA,SAAO,aAAa,OAAO,IAAIC;AAAA,IAC7B,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAASA,sCACP,OACQ;AACR,QAAM,YAAY,MAAM,CAAC;AACzB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,QAAM,aAAa,MAAM,KAAK,0BAA0B,IAAI,MAAM;AAClE,QAAM,UACJ,UAAU,OAAO,QAAQ,QAAQ,KAAK,KACtC,UAAU,wBAAwB,KAAK,KACvC,UAAU,MAAM,KAAK;AACvB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU,UAAU;AAAA,IACpB,UAAU,UAAU,YAAY;AAAA,IAChC,UAAU,UAAU,aAAa;AAAA,IACjC;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEO,SAAS,gCACd,QACA,GAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,MACE,OAAO,OAAO;AAAA,MACd,OAAO,EAAE,oDAAoD;AAAA,MAC7D,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,OAAO;AAAA,MACd,OAAO,EAAE,mDAAmD;AAAA,MAC5D,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,OAAO;AAAA,MACd,OAAO,EAAE,oDAAoD;AAAA,MAC7D,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO,OAAO;AAAA,MACd,OAAO,EAAE,sDAAsD;AAAA,MAC/D,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,kCACd,OAC+B;AAC/B,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,OAAO;AACxB,WAAO,IAAI,KAAK,WAAW,OAAO,IAAI,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,EAChE;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,IACxB;AAAA,IACA,OAAO,4BAA4B,KAAK;AAAA,IACxC;AAAA,EACF,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,KAAK,MAAM,cAAc,MAAM,KAAK,CAAC;AAChE;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAIY;AACV,MACE,iBACA,CAAC,cAAc,IAAI,+BAA+B,IAAI,CAAC,GACvD;AACA,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,CAAC,gBAAgB,IAAI,KAAK,QAAQ,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,+BACd,MAC2B;AAC3B,MAAI,2BAA2B,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,wBACd,OACA,SACA,GACsB;AACtB,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,wBAAwB,OAAO;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,oDAAoD;AAAA,UAC7D,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,mDAAmD;AAAA,UAC5D,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,oDAAoD;AAAA,UAC7D,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,sDAAsD;AAAA,UAC/D,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AACH,aAAO,kBAAkB,OAAO,CAAC,UAAU;AAAA,QACzC,IAAI,8BAA8B,IAAI;AAAA,QACtC,UAAU,KAAK;AAAA,QACf,OAAO,iCAAiC,IAAI;AAAA,QAC5C,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,MACf,EAAE;AAAA,IACJ,KAAK;AACH,aAAO,wBAAwB,OAAO;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,iDAAiD;AAAA,UAC1D,OAAO,CAAC,SAAS,uBAAuB,IAAI,MAAM;AAAA,QACpD;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,qDAAqD;AAAA,UAC9D,OAAO,CAAC,SAAS,uBAAuB,IAAI,MAAM;AAAA,QACpD;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,YACL;AAAA,UACF;AAAA,UACA,OAAO,CAAC,SACN,uBAAuB,IAAI,MAAM;AAAA,QACrC;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,iDAAiD;AAAA,UAC1D,OAAO,CAAC,SAAS,uBAAuB,IAAI,MAAM;AAAA,QACpD;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AAAA,IACL,SAAS;AACP,YAAM,YAAY,KAAK,IAAI;AAC3B,aAAO,wBAAwB,OAAO;AAAA,QACpC;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,0DAA0D;AAAA,UACnE,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,mDAAmD;AAAA,UAC5D,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,oDAAoD;AAAA,UAC7D,OAAO,CAAC,SAAS,+BAA+B,IAAI,MAAM;AAAA,QAC5D;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,YACL;AAAA,UACF;AAAA,UACA,OAAO,CAAC,SAAS,qCAAqC,MAAM,SAAS;AAAA,QACvE;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,EAAE,sDAAsD;AAAA,UAC/D,OAAO,CAAC,SACN,+BAA+B,IAAI,MAAM,eACzC,CAAC,qCAAqC,MAAM,SAAS;AAAA,QACzD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,iCACP,MACQ;AACR,MAAI,KAAK,UAAU;AACjB,WAAO,GAAG,KAAK,SAAS,QAAQ,MAAM,KAAK,SAAS,SAAS;AAAA,EAC/D;AACA,SAAO,4BAA4B,KAAK,QAAQ;AAClD;AAEA,IAAM,+BAA+B,KAAK,KAAK;AAExC,SAAS,qCACd,MACA,WACS;AACT,MAAI,+BAA+B,IAAI,MAAM,aAAa;AACxD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU;AACjB,WAAO;AAAA,EACT;AACA,QAAM,oBACJ,KAAK,kBAAkB,KAAK,4BAA4B;AAC1D,MAAI,qBAAqB,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,YAAY;AAC1C;AAEO,SAAS,wBACd,SACA,GACQ;AACR,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,EAAE,kDAAkD;AAAA,IAC7D,KAAK;AACH,aAAO,EAAE,iDAAiD;AAAA,IAC5D,KAAK;AACH,aAAO,EAAE,gDAAgD;AAAA,IAC3D,KAAK;AAAA,IACL;AACE,aAAO,EAAE,oDAAoD;AAAA,EACjE;AACF;AAEO,SAAS,oBACd,eACA,eACQ;AACR,MAAI,kBAAkB,QAAQ,cAAc,SAAS,cAAc,QAAQ;AACzE,WAAO,cAAc,IAAI,CAAC,WAAW,OAAO,KAAK,EAAE,KAAK,IAAI;AAAA,EAC9D;AACA,SAAO,cACJ,OAAO,CAAC,WAAW,cAAc,IAAI,OAAO,KAAK,CAAC,EAClD,IAAI,CAAC,WAAW,OAAO,KAAK,EAC5B,KAAK,IAAI;AACd;AAEA,SAAS,wBACP,OACA,aAKsB;AACtB,SAAO,YACJ,IAAI,CAAC,gBAAgB;AAAA,IACpB,IAAI,WAAW;AAAA,IACf,OAAO,WAAW;AAAA,IAClB,OAAO,MAAM,OAAO,WAAW,KAAK;AAAA,EACtC,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,MAAM,SAAS,CAAC;AAC7C;AAEA,SAAS,kBACP,OACA,YAOsB;AACtB,QAAM,SAAS,oBAAI,IAAgC;AACnD,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,WAAW,IAAI;AAC3B,UAAM,QAAQ,OAAO,IAAI,IAAI,EAAE;AAC/B,QAAI,OAAO;AACT,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,CAAC,MAAM,YAAY,IAAI,UAAU;AACnC,cAAM,WAAW,IAAI;AACrB,cAAM,QAAQ,IAAI;AAAA,MACpB;AAAA,IACF,OAAO;AACL,aAAO,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAS,uBACP,MACyD;AACzD,QAAM,YAAY,KAAK,kBAAkB,KAAK,4BAA4B;AAC1E,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,QAAM,QAAQ,KAAK,KAAK,KAAK;AAC7B,MAAI,QAAQ,OAAO;AACjB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ,GAAG;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ADrXQ,SAsEE,UAzDA,OAAAC,MAbF,QAAAC,aAAA;AA7BD,SAAS,sBAAsB;AAAA,EACpC,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAWgB;AACd;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,SACE,gBAAAA,MAAC,gBAAa,OAAO,OACnB;AAAA,oBAAAD,KAAC,uBAAoB,SAAO,MAC1B,0BAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,cAAY,EAAE,kDAAkD;AAAA,QAChE,OAAO,EAAE,kDAAkD;AAAA,QAC3D,WAAWC;AAAA,UACT;AAAA,UACA,gBACI,sDACA;AAAA,QACN;AAAA,QAEA;AAAA,0BAAAH,KAAC,cAAW,WAAU,UAAS,aAAa,KAAK,eAAY,QAAO;AAAA,UACnE,gBACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,cAAY;AAAA,gBACV;AAAA,cACF;AAAA,cACA,WAAU;AAAA;AAAA,UACZ,IACE;AAAA;AAAA;AAAA,IACN,GACF;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAU;AAAA,QACV,OAAO,EAAE,QAAQ,0BAA0B;AAAA,QAE3C;AAAA,0BAAAD,KAAC,qBACE,YAAE,8CAA8C,GACnD;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,eAAe,CAAC,UACd,gBAAgB,KAA6B;AAAA,cAG7C,WAAC,YAAY,UAAU,SAAS,MAAM,EAAY,IAAI,CAAC,UACvD,gBAAAA,KAAC,yBAAkC,OAChC,kCAAwB,OAAO,CAAC,KADP,KAE5B,CACD;AAAA;AAAA,UACH;AAAA,UAEA,gBAAAA,KAAC,yBAAsB;AAAA,UACvB,gBAAAA,KAAC,qBACE,YAAE,mDAAmD,GACxD;AAAA,UACA,gBAAAA,KAAC,qBACE,wBAAc,IAAI,CAAC,WAClB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,cAAY,GAAG,OAAO,KAAK,IAAI,OAAO,KAAK;AAAA,cAC3C,SACE,kBAAkB,QAAQ,cAAc,IAAI,OAAO,KAAK;AAAA,cAE1D,iBAAiB,MAAM,eAAe,OAAO,KAAK;AAAA,cAClD,UAAU,CAAC,UAAU,MAAM,eAAe;AAAA,cAE1C,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,OAAO;AAAA,kBACd,OAAO,OAAO;AAAA;AAAA,cAChB;AAAA;AAAA,YAXK,OAAO;AAAA,UAYd,CACD,GACH;AAAA,UAEC,gBAAgB,SAAS,IACxB,gBAAAC,MAAA,YACE;AAAA,4BAAAD,KAAC,yBAAsB;AAAA,YACvB,gBAAAA,KAAC,qBACE,YAAE,kDAAkD,GACvD;AAAA,YACA,gBAAAA,KAAC,qBACE,0BAAgB,IAAI,CAAC,WACpB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,cAAY,GAAG,OAAO,KAAK,IAAI,OAAO,KAAK;AAAA,gBAC3C,SACE,oBAAoB,QACpB,gBAAgB,IAAI,OAAO,KAAK;AAAA,gBAElC,iBAAiB,MAAM,iBAAiB,OAAO,KAAK;AAAA,gBACpD,UAAU,CAAC,UAAU,MAAM,eAAe;AAAA,gBAE1C,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,OAAO;AAAA,oBACd,OAAO,OAAO;AAAA;AAAA,gBAChB;AAAA;AAAA,cAZK,OAAO;AAAA,YAad,CACD,GACH;AAAA,aACF,IACE;AAAA,UAEJ,gBAAAA,KAAC,yBAAsB;AAAA,UACvB,gBAAAA,KAAC,qBACC,0BAAAA,KAAC,oBAAiB,SAAS,gBACxB,YAAE,mDAAmD,GACxD,GACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AACF,GAGgB;AACd,SACE,gBAAAC,MAAC,UAAK,WAAU,0CACd;AAAA,oBAAAD,KAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,IACjD,gBAAAA,KAAC,UAAK,WAAU,iEACb,iBACH;AAAA,KACF;AAEJ;;;AE5KO,IAAM,iCACX;AAQF,IAAM,6BAA6B,oBAAI,IAA0B;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kCAAkC,oBAAI,IAA+B;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,wCAAwE;AAAA,EAC5E,SAAS;AAAA,EACT,eAAe;AAAA,EACf,iBAAiB;AACnB;AAEO,SAAS,qCAAqE;AACnF,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,aAAa,QAAQ,8BAA8B;AAAA,EAClE,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,SAAO;AAAA,IACL,SAAS,qBAAqB,OAAO,OAAO;AAAA,IAC5C,eAAe,2BAA2B,OAAO,aAAa;AAAA,IAC9D,iBAAiB,6BAA6B,OAAO,eAAe;AAAA,EACtE;AACF;AAEO,SAAS,oCACd,aACM;AACN,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AACA,QAAM,aAAa,KAAK,UAAU;AAAA,IAChC,SAAS,YAAY;AAAA,IACrB,eAAe,YAAY,gBACvB,CAAC,GAAG,YAAY,aAAa,IAC7B;AAAA,IACJ,iBAAiB,YAAY,kBACzB,CAAC,GAAG,YAAY,eAAe,IAC/B;AAAA,EACN,CAAC;AACD,MAAI;AACF,WAAO,aAAa,QAAQ,gCAAgC,UAAU;AAAA,EACxE,QAAQ;AAAA,EAGR;AACF;AAEA,SAAS,qBAAqB,OAAsC;AAClE,SAAO,OAAO,UAAU,YACtB,2BAA2B,IAAI,KAA6B,IACzD,QACD;AACN;AAEA,SAAS,2BACP,OACuC;AACvC,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,IAAI;AAAA,IACT,MAAM;AAAA,MACJ,CAAC,UACC,OAAO,UAAU,YACjB,gCAAgC,IAAI,KAAkC;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B,OAAoC;AACxE,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,IAAI;AAAA,IACT,MAAM,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAAA,EACpE;AACF;;;ARIQ,gBAAAI,MAwaM,QAAAC,aAxaN;AArDR,IAAM,kCAAkC;AACxC,IAAM,2CAA2C;AA+B1C,IAAM,mCAAmCC;AAAA,EAC9C,SAASC,kCAAiC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA8D;AAC5D;AACA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,WACE,gBAAAH,KAAC,wBAAqB,SAAS,MAAM,QACnC,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,GACF;AAAA,EAEJ;AACF;AAEA,SAAS,wCAAwC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGuB;AACrB;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,CAAC,cAAc,IAAII,UAAS,kCAAkC;AACpE,QAAM,CAAC,SAAS,UAAU,IAAIA;AAAA,IAC5B,eAAe;AAAA,EACjB;AACA,QAAM,CAAC,eAAe,gBAAgB,IACpCA;AAAA,IACE,eAAe;AAAA,EACjB;AACF,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA;AAAA,IAC5C,eAAe;AAAA,EACjB;AACA,EAAAC,WAAU,MAAM;AACd,wCAAoC;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,eAAe,eAAe,CAAC;AAC5C,QAAM,CAAC,kBAAkB,mBAAmB,IAAID;AAAA,IAC9C,MAAM,oBAAI,IAAI;AAAA,EAChB;AACA,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA;AAAA,IACpD;AAAA,EACF;AACA,QAAM,eAAeE,QAAiC,oBAAI,IAAI,CAAC;AAC/D,QAAM,mCAAmCA,QAAsB,IAAI;AACnE,QAAM,sCAAsCA,QAAsB,IAAI;AACtE,QAAM,gBAAgBC;AAAA,IACpB,MAAM,gCAAgC,MAAM,QAAQ,CAAC;AAAA,IACrD,CAAC,MAAM,QAAQ,CAAC;AAAA,EAClB;AACA,QAAM,kBAAkBA;AAAA,IACtB,MAAM,kCAAkC,MAAM,KAAK;AAAA,IACnD,CAAC,MAAM,KAAK;AAAA,EACd;AACA,QAAM,eAAeA;AAAA,IACnB,MACE,MAAM,MAAM;AAAA,MAAO,CAAC,SAClB,uBAAuB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACF,CAAC,MAAM,OAAO,iBAAiB,aAAa;AAAA,EAC9C;AACA,QAAM,YAAYA;AAAA,IAChB,MAAM,sCAAsC,YAAY;AAAA,IACxD,CAAC,YAAY;AAAA,EACf;AACA,QAAM,YAAYA;AAAA,IAChB,MAAM,aAAa,OAAO,CAAC,SAAS,CAAC,+BAA+B,IAAI,CAAC;AAAA,IACzE,CAAC,YAAY;AAAA,EACf;AACA,QAAM,aAAaA;AAAA,IACjB,MAAM,wBAAwB,WAAW,SAAS,CAAC;AAAA,IACnD,CAAC,SAAS,GAAG,SAAS;AAAA,EACxB;AACA,QAAM,kBAAkBA;AAAA,IACtB,MACE,WAAW,IAAI,CAAC,WAAW;AAAA,MACzB,GAAG;AAAA,MACH,QAAQ,uCAAuC,MAAM,KAAK;AAAA,IAC5D,EAAE;AAAA,IACJ,CAAC,UAAU;AAAA,EACb;AACA,QAAM,kBAAkBA;AAAA,IACtB,MACE,oBACK,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,iBAAiB,KAAK,OAC9D;AAAA,IACN,CAAC,mBAAmB,MAAM,KAAK;AAAA,EACjC;AACA,QAAM,sBAAsB,oBAAoB,eAAe,aAAa;AAC5E,QAAM,gBAAgBA;AAAA,IACpB,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG,UAAU,IAAI,CAAC,SAAS,QAAQ,KAAK,EAAE,EAAE;AAAA,MAC5C,GAAG,gBAAgB;AAAA,QAAQ,CAAC,UAC1B,MAAM,OAAO,IAAI,CAAC,UAAU;AAC1B,gBAAM,UAAU,2BAA2B,MAAM,IAAI,MAAM,EAAE;AAC7D,iBAAO,oCAAoC;AAAA,YACzC,UAAU,iBAAiB,IAAI,OAAO;AAAA,YACtC,SAAS,MAAM;AAAA,YACf;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,IACZ,CAAC,qBAAqB,WAAW,kBAAkB,SAAS,eAAe;AAAA,EAC7E;AACA,QAAM,mBAAmB,kBAAkB,QAAQ,oBAAoB;AACvE,QAAM,gBAAgBA,SAAQ,MAAM;AAClC,QAAI,kBAAkB;AACpB,aAAO,EAAE,wDAAwD;AAAA,QAC/D,OAAO,aAAa;AAAA,QACpB,OAAO,MAAM,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AACA,QAAI,MAAM,OAAO,UAAU,GAAG;AAC5B,aAAO,EAAE,uDAAuD;AAAA,QAC9D,OAAO,MAAM,OAAO;AAAA,QACpB,SAAS,MAAM,OAAO;AAAA,MACxB,CAAC;AAAA,IACH;AACA,QAAI,MAAM,OAAO,YAAY,GAAG;AAC9B,aAAO,EAAE,yDAAyD;AAAA,QAChE,OAAO,MAAM,OAAO;AAAA,QACpB,WAAW,MAAM,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AACA,WAAO,EAAE,qDAAqD;AAAA,MAC5D,OAAO,MAAM,OAAO;AAAA,IACtB,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AAED,QAAM,eAAeC;AAAA,IACnB,OACE,MACA,UAMG;AACH,YAAM,YAAY,GAAG,KAAK,cAAc,IAAI,MAAM,SAAS;AAC3D,6BAAuB,SAAS;AAChC,UAAI;AACF,cAAM,qBAAqB;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AACA,YAAI,oBAAoB;AACtB,mCAAyB;AAAA,YACvB,QAAQ;AAAA,YACR,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,QACH;AACA,cAAM,eAAe;AAAA,UACnB,GAAG;AAAA,UACH,gBAAgB,KAAK;AAAA,UACrB,YAAY,KAAK,eAAe;AAAA,QAClC,CAAC;AAAA,MACH,UAAE;AACA;AAAA,UAAuB,CAAC,YACtB,YAAY,YAAY,OAAO;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,wBAAwB,cAAc;AAAA,EACzC;AACA,QAAM,cAAcA;AAAA,IAClB,CAAC,QAAgB,SAA6B;AAC5C,UAAI,MAAM;AACR,qBAAa,QAAQ,IAAI,QAAQ,IAAI;AAAA,MACvC,OAAO;AACL,qBAAa,QAAQ,OAAO,MAAM;AAAA,MACpC;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AACA,QAAM,qBAAqBA;AAAA,IACzB,CAAC,WAAsC;AACrC,uBAAiB,CAAC,YAAY;AAC5B,cAAM,OAAO,IAAI;AAAA,UACf,WAAW,cAAc,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,QACvD;AACA,YAAI,KAAK,IAAI,MAAM,GAAG;AACpB,eAAK,OAAO,MAAM;AAAA,QACpB,OAAO;AACL,eAAK,IAAI,MAAM;AAAA,QACjB;AACA,eAAO,KAAK,SAAS,cAAc,SAAS,OAAO;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AACA,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,aAAqB;AACpB,yBAAmB,CAAC,YAAY;AAC9B,cAAM,OAAO,IAAI;AAAA,UACf,WAAW,gBAAgB,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,QACzD;AACA,YAAI,KAAK,IAAI,QAAQ,GAAG;AACtB,eAAK,OAAO,QAAQ;AAAA,QACtB,OAAO;AACL,eAAK,IAAI,QAAQ;AAAA,QACnB;AACA,eAAO,KAAK,SAAS,gBAAgB,SAAS,OAAO;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AACA,QAAM,eAAeA,aAAY,MAAM;AACrC,qBAAiB,IAAI;AACrB,uBAAmB,IAAI;AAAA,EACzB,GAAG,CAAC,CAAC;AACL,QAAM,cAAcA,aAAY,CAAC,YAAoB;AACnD,wBAAoB,CAAC,YAAY;AAC/B,UAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,WAAK,IAAI,OAAO;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AACL,QAAM,gBAAgBA,aAAY,CAAC,YAAoB;AACrD,wBAAoB,CAAC,YAAY;AAC/B,UAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,WAAK,OAAO,OAAO;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,EAAAC,iBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,iBAAiB;AAC7B;AAAA,IACF;AACA,QAAI,oCAAoC,YAAY,gBAAgB,IAAI;AACtE;AAAA,IACF;AACA,QACE,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC,GACD;AACA;AAAA,IACF;AACA,wCAAoC,UAAU,gBAAgB;AAC9D,qBAAiB,IAAI;AACrB,uBAAmB,IAAI;AAAA,EACzB,GAAG,CAAC,iBAAiB,MAAM,iBAAiB,aAAa,CAAC;AAE1D,EAAAA,iBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,mBAAmB;AAC/B;AAAA,IACF;AACA,eAAW,SAAS,iBAAiB;AACnC,iBAAW,SAAS,MAAM,QAAQ;AAChC,YACE,MAAM,MAAM,SAAS,KACrB,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,iBAAiB,GACxD;AACA,sBAAY,2BAA2B,MAAM,IAAI,MAAM,EAAE,CAAC;AAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,mBAAmB,iBAAiB,IAAI,CAAC;AAE1D,EAAAA,iBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,mBAAmB;AAC/B,uCAAiC,UAAU;AAC3C;AAAA,IACF;AACA,QACE,mBACA,CAAC,uBAAuB;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC,GACD;AACA;AAAA,IACF;AACA,QAAI,iCAAiC,YAAY,mBAAmB;AAClE;AAAA,IACF;AACA,UAAM,SAAS,aAAa,QAAQ,IAAI,iBAAiB;AACzD,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,qCAAiC,UAAU;AAC3C,WAAO,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAC7D,WAAO,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACtC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,EAAAJ,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,mBAAmB;AAC/B,aAAO;AAAA,IACT;AACA,UAAM,YAAY,OAAO,WAAW,MAAM;AACxC,iCAA2B,iBAAiB;AAAA,IAC9C,GAAG,IAAI;AACP,WAAO,MAAM;AACX,aAAO,aAAa,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,mBAAmB,0BAA0B,IAAI,CAAC;AAEtD,QAAM,0BAA0BG;AAAA,IAC9B,CACE,MACA,UAAqC,CAAC,MACnC;AACH,YAAM,cAAc,KAAK,OAAO;AAChC,YAAM,eAAe,QAAQ;AAC7B,YAAM,OACJ,gBAAAR;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA,cACE,wBACA,GAAG,KAAK,cAAc,IAAI,KAAK,eAAe,SAAS;AAAA,UAEzD,aACE,iBAAiB,UACjB,gBAAgB;AAAA,UAElB,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA;AAAA,QAdX,KAAK;AAAA,MAeZ;AAGF,UAAI,iBAAiB,QAAW;AAC9B,eAAO;AAAA,MACT;AAEA,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,gBAAgB,GAAG,KAAK,IAAI,eAAe,IAAI,EAAE,CAAC;AAAA,UACpD;AAAA,UAEC;AAAA;AAAA,QANI,KAAK;AAAA,MAOZ;AAAA,IAEJ;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,YAAU;AAAA,MACV,cAAc,CAAC,aAAsB;AACnC,YAAI,CAAC,UAAU;AACb,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAWU;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,eAAY;AAAA,UACZ,iBAAiB,mBAAmB;AAAA,UACpC,aAAa;AAAA,UACb,cAAY,EAAE,4CAA4C;AAAA,UAE1D,0BAAAT,MAAC,mBAAgB,eAAe,iCAC9B;AAAA,4BAAAD,KAAC,SAAI,WAAU,gEACb,0BAAAC,MAAC,SAAI,WAAU,mDACb;AAAA,8BAAAA,MAAC,SAAI,WAAU,WACb;AAAA,gCAAAD,KAAC,SAAI,WAAU,2EACZ,YAAE,4CAA4C,GACjD;AAAA,gBACA,gBAAAA,KAAC,SAAI,WAAU,8DACZ,yBACH;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAe;AAAA,kBACf;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,gBAAgB;AAAA,kBAChB,iBAAiB;AAAA,kBACjB,kBAAkB;AAAA,kBAClB,gBAAgB;AAAA;AAAA,cAClB;AAAA,eACF,GACF;AAAA,YAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,mBAAkB;AAAA,gBAClB,oBAAmB;AAAA,gBACnB,SAAS;AAAA,gBAER,oBAAU,SAAS,KAAK,UAAU,SAAS,IAC1C,gBAAAC,MAAC,SAAI,WAAU,sCACZ;AAAA,4BAAU,SAAS,IAClB,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,sBACP;AAAA,sBACA;AAAA,sBACA,cAAc;AAAA,sBACd;AAAA,sBACA;AAAA,sBACA,gBAAgB,CAAC,MAAM,UACrB,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,kBAEjC,IACE;AAAA,kBACH,gBAAgB,IAAI,CAAC,UACpB,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBAEC,WAAU;AAAA,sBACV,cAAY,GAAG,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM;AAAA,sBAEhD;AAAA,wCAAAD,KAAC,SAAI,WAAU,0DACb,0BAAAA,KAAC,6BAA0B,OAAc,GAC3C;AAAA,yBACE,MAAM;AACN,iCAAO,MAAM,OAAO,IAAI,CAAC,UAAU;AACjC,kCAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,gCAAI,CAAC,WAAW;AACd,qCAAO;AAAA,4BACT;AACA,gCAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,qCAAO,wBAAwB,SAAS;AAAA,4BAC1C;AACA,kCAAM,UAAU;AAAA,8BACd,MAAM;AAAA,8BACN,MAAM;AAAA,4BACR;AACA,mCACE,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCAEC,UAAU,iBAAiB,IAAI,OAAO;AAAA,gCACtC,SAAS;AAAA,gCACT;AAAA,gCACA,OAAO,MAAM;AAAA,gCACb,YAAY;AAAA,gCACZ,YAAY;AAAA,gCACZ,UAAU;AAAA;AAAA,8BAPL;AAAA,4BAQP;AAAA,0BAEJ,CAAC;AAAA,wBACH,GAAG;AAAA;AAAA;AAAA,oBAjCE,MAAM;AAAA,kBAkCb,CACD;AAAA,mBACH,IACE,MAAM,MAAM,SAAS,IACvB,gBAAAC,MAAC,SAAI,WAAU,kIACb;AAAA,kCAAAD,KAAC,UACE,YAAE,oDAAoD,GACzD;AAAA,kBACA,gBAAAA;AAAA,oBAACW;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA,sBAER,YAAE,mDAAmD;AAAA;AAAA,kBACxD;AAAA,mBACF,IAEA,gBAAAX,KAAC,SAAI,WAAU,iHACZ,YAAE,4CAA4C,GACjD;AAAA;AAAA,YAEJ;AAAA,aACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,IAAM,4BAA4BE,MAAK,SAASU,2BAA0B;AAAA,EACxE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYgB;AACd,QAAM,UAAUJ;AAAA,IACd,CAAC,SAA6B;AAC5B,mBAAa,KAAK,IAAI,IAAI;AAAA,IAC5B;AAAA,IACA,CAAC,KAAK,IAAI,YAAY;AAAA,EACxB;AACA,QAAM,qBAAqBA;AAAA,IACzB,CAAC,UAAkD;AACjD,qBAAe,MAAM,KAAK;AAAA,IAC5B;AAAA,IACA,CAAC,MAAM,cAAc;AAAA,EACvB;AAEA,SACE,gBAAAR;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA;AAAA,EAClB;AAEJ,CAAC;AAED,SAAS,0BAA0B;AAAA,EACjC;AACF,GAEgB;AACd;AACA,QAAM,eAAe,+BAA+B,MAAM,EAAE;AAE5D,MAAI,MAAM,UAAU;AAClB,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,GAAG,MAAM,KAAK,SAAM,MAAM,MAAM,MAAM;AAAA,QAClD,WAAU;AAAA,QACV,OAAO,GAAG,MAAM,KAAK,SAAM,MAAM,MAAM,MAAM;AAAA,QAE5C;AAAA,gBAAM,WACL,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,MAAM;AAAA,cAChB,UAAU,MAAM;AAAA;AAAA,UAClB,IAEA,gBAAAC,MAAC,UAAK,WAAU,4CACd;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,UAAU;AAAA,gBACV,UAAU,MAAM;AAAA,gBAChB,QAAQ,MAAM,UAAU;AAAA;AAAA,YAC1B;AAAA,YACA,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,gBAAM,OAAM;AAAA,aAClD;AAAA,UAEF,gBAAAC,MAAC,UAAK,WAAU,YAAW;AAAA;AAAA,YAAG,MAAM,MAAM;AAAA,aAAO;AAAA;AAAA;AAAA,IACnD;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAWS;AAAA,QACT;AAAA,QACA,eACI,6BAA6B,aAAa,IAAI,IAC9C;AAAA,MACN;AAAA,MACA,OAAO,GAAG,MAAM,KAAK,SAAM,MAAM,MAAM,MAAM;AAAA,MAE5C;AAAA,uBACC,gBAAAV;AAAA,UAACa;AAAA,UAAA;AAAA,YACC,MAAM,aAAa;AAAA,YACnB,OAAO,aAAa;AAAA,YACpB,MAAK;AAAA,YACL,OAAO,MAAM;AAAA;AAAA,QACf,IACE;AAAA,QACJ,gBAAAZ,MAAC,UAAK,WAAU,oBACb;AAAA,gBAAM;AAAA,UAAM;AAAA,UAAI,MAAM,MAAM;AAAA,WAC/B;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,+BAA+B,SAG/B;AACP,UAAQ,SAAS;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,MAAM,QAAQ;AAAA,IACtC,KAAK;AACH,aAAO,EAAE,OAAO,MAAM,MAAM,OAAO;AAAA,IACrC,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,IACrC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,MAAM,QAAQ;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;;;ASpwBO,SAAS,0CACd,UACA,MACkC;AAClC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,IAAI;AAAA,IAC5B,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,EAC9C;AACA,MAAI,eAAe,SAAS,MAAM,WAAW,KAAK,MAAM;AACxD,QAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,UAAU,UAAU;AAChD,UAAM,eAAe,kBAAkB,IAAI,SAAS,EAAE;AACtD,UAAM,aACJ,gBAAgB,wBAAwB,cAAc,QAAQ,IAC1D,eACA;AACN,QAAI,eAAe,SAAS,MAAM,KAAK,GAAG;AACxC,qBAAe;AAAA,IACjB;AACA,WAAO;AAAA,EACT,CAAC;AACD,QAAM,cAAc,eAAe,QAAQ,SAAS;AACpD,QAAM,eAAe,yBAAyB,SAAS,QAAQ,KAAK,MAAM,IACtE,SAAS,SACT,KAAK;AAET,MACE,SAAS,iBAAiB,KAAK,gBAC/B,gBAAgB,SAAS,SACzB,iBAAiB,SAAS,QAC1B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEA,SAAS,wBACP,MACA,OACS;AACT,SACE,KAAK,OAAO,MAAM,MAClB,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,aAAa,MAAM,YACxB,KAAK,WAAW,MAAM,UACtB,KAAK,UAAU,MAAM,SACrB,KAAK,aAAa,MAAM,YACxB,KAAK,QAAQ,MAAM,OACnB,KAAK,WAAW,MAAM,UACtB,KAAK,4BAA4B,MAAM,2BACvC,KAAK,6BAA6B,MAAM,4BACxC,KAAK,uBAAuB,MAAM,sBAClC,KAAK,0BAA0B,MAAM,yBACrC,KAAK,mBAAmB,MAAM,kBAC9B,2BAA2B,KAAK,UAAU,MAAM,QAAQ,KACxD,yBAAyB,KAAK,QAAQ,MAAM,MAAM,KAClD,yBAAyB,KAAK,eAAe,MAAM,aAAa,KAChE;AAAA,IACE,KAAK,qBAAqB;AAAA,IAC1B,MAAM,qBAAqB;AAAA,EAC7B;AAEJ;AAEA,SAAS,yBACP,MACA,OACS;AACT,SACE,KAAK,QAAQ,MAAM,OACnB,KAAK,YAAY,MAAM,WACvB,KAAK,YAAY,MAAM,WACvB,KAAK,cAAc,MAAM,aACzB,KAAK,WAAW,MAAM;AAE1B;AAEA,SAAS,2BACP,MACA,OACS;AACT,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,QAAQ,CAAC,OAAO;AACnB,WAAO;AAAA,EACT;AACA,SACE,KAAK,aAAa,MAAM,YACxB,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,cAAc,MAAM,aACzB,KAAK,mBAAmB,MAAM;AAElC;AAEA,SAAS,yBACP,MACA,OACS;AACT,SACE,KAAK,QAAQ,SAAS,MAAM,QAAQ,QACpC,KAAK,QAAQ,YAAY,MAAM,QAAQ,WACvC,KAAK,QAAQ,qBAAqB,MAAM,QAAQ;AAEpD;AAEA,SAAS,8BACP,MACA,OACS;AACT,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,QAAQ,CAAC,OAAO;AACnB,WAAO;AAAA,EACT;AACA,SACE,KAAK,oBAAoB,MAAM,mBAC/B,KAAK,WAAW,MAAM,UACtB,KAAK,WAAW,MAAM;AAE1B;AAEA,SAAS,yBACP,MACA,OACS;AACT,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,MAAM,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK;AACtD;","names":["memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","cn","StatusDot","AgentVerticalScrollArea","isAgentMessageRole","recordValue","stringValue","firstNonEmptyString","includesAny","positiveNumber","useEffect","useRef","useState","cn","cn","jsx","WorkspaceAgentMessageCenterCard","cn","WorkspaceAgentMessageCenterStack","timeoutId","jsx","jsxs","useRef","useState","useEffect","cn","Button","cn","messageCenterCollapsedStackSignature","jsx","jsxs","Button","cn","jsx","jsxs","memo","WorkspaceAgentMessageCenterPanel","useState","useEffect","useRef","useMemo","useCallback","useLayoutEffect","cn","Button","MessageCenterRenderedCard","StatusDot"]}
|