@tutti-os/agent-gui 0.0.232 → 0.0.234

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.
Files changed (87) hide show
  1. package/README.md +49 -0
  2. package/dist/{AgentRichTextReadonly-U3XUJYCW.js → AgentRichTextReadonly-CCELQPHE.js} +5 -5
  3. package/dist/agent-conversation/index.d.ts +17 -4
  4. package/dist/agent-conversation/index.js +13 -9
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-gui.d.ts +19 -3
  7. package/dist/agent-gui.js +22 -16
  8. package/dist/agent-message-center/index.d.ts +1 -1
  9. package/dist/agent-message-center/index.js +10 -7
  10. package/dist/agent-message-center/index.js.map +1 -1
  11. package/dist/{agentGuiNodeTypes-DW7T--Y8.d.ts → agentGuiNodeTypes-Dgl7kQHA.d.ts} +2 -2
  12. package/dist/agents.d.ts +1 -1
  13. package/dist/app/renderer/agentactivity.css +17 -0
  14. package/dist/{chunk-M6WEFXPL.js → chunk-2MCNNB2P.js} +2 -24
  15. package/dist/chunk-2MCNNB2P.js.map +1 -0
  16. package/dist/{chunk-CQFT3MI5.js → chunk-3YYI6RXA.js} +7 -5
  17. package/dist/{chunk-CQFT3MI5.js.map → chunk-3YYI6RXA.js.map} +1 -1
  18. package/dist/{chunk-EDP4D42H.js → chunk-45KN5Z5F.js} +877 -871
  19. package/dist/chunk-45KN5Z5F.js.map +1 -0
  20. package/dist/{chunk-T57ZZWTC.js → chunk-4HAG3FOY.js} +2 -2
  21. package/dist/{chunk-ZBI6R46N.js → chunk-5DN5N2XS.js} +2 -2
  22. package/dist/{chunk-BCBB4HOV.js → chunk-634MNSI5.js} +2 -2
  23. package/dist/chunk-A4KKC324.js +4768 -0
  24. package/dist/chunk-A4KKC324.js.map +1 -0
  25. package/dist/chunk-ALAGL6VL.js +48 -0
  26. package/dist/chunk-ALAGL6VL.js.map +1 -0
  27. package/dist/{chunk-2STAUA73.js → chunk-AYTUAZE3.js} +5 -2
  28. package/dist/chunk-AYTUAZE3.js.map +1 -0
  29. package/dist/{chunk-SWO67UWQ.js → chunk-CZOZBUIM.js} +7 -7
  30. package/dist/{chunk-SWO67UWQ.js.map → chunk-CZOZBUIM.js.map} +1 -1
  31. package/dist/{chunk-2L2LVSOD.js → chunk-EHNPHZE4.js} +881 -5812
  32. package/dist/chunk-EHNPHZE4.js.map +1 -0
  33. package/dist/{chunk-N5356722.js → chunk-EKQ7UX2B.js} +13 -319
  34. package/dist/chunk-EKQ7UX2B.js.map +1 -0
  35. package/dist/{chunk-ZXEICU6J.js → chunk-KK7YXPTS.js} +3 -1
  36. package/dist/chunk-KK7YXPTS.js.map +1 -0
  37. package/dist/{chunk-WGCDSA7P.js → chunk-MBM7PJIF.js} +27 -506
  38. package/dist/chunk-MBM7PJIF.js.map +1 -0
  39. package/dist/chunk-RMC2MGL4.js +557 -0
  40. package/dist/chunk-RMC2MGL4.js.map +1 -0
  41. package/dist/{chunk-JA6XAKKE.js → chunk-TWF6JXPC.js} +2 -2
  42. package/dist/{chunk-7AYFKNLD.js → chunk-TWMV6YTX.js} +4 -4
  43. package/dist/chunk-VV3YIU5W.js +25 -0
  44. package/dist/chunk-VV3YIU5W.js.map +1 -0
  45. package/dist/{chunk-GLVENTN6.js → chunk-WXLO33YP.js} +2 -2
  46. package/dist/chunk-XWPHTXEM.js +529 -0
  47. package/dist/chunk-XWPHTXEM.js.map +1 -0
  48. package/dist/chunk-YEXRTXTE.js +315 -0
  49. package/dist/chunk-YEXRTXTE.js.map +1 -0
  50. package/dist/{chunk-WMJDOMG6.js → chunk-ZELGKLW5.js} +4 -4
  51. package/dist/composer-projection.d.ts +37 -0
  52. package/dist/composer-projection.js +21 -0
  53. package/dist/composer-projection.js.map +1 -0
  54. package/dist/context-mention-palette/index.js +9 -7
  55. package/dist/conversation-projection.d.ts +551 -0
  56. package/dist/conversation-projection.js +42 -0
  57. package/dist/conversation-projection.js.map +1 -0
  58. package/dist/conversation-rail-projection.js +3 -3
  59. package/dist/i18n/index.d.ts +2 -0
  60. package/dist/i18n/index.js +2 -2
  61. package/dist/index.d.ts +32 -13
  62. package/dist/index.js +22 -16
  63. package/dist/index.js.map +1 -1
  64. package/dist/mention-search.js +7 -5
  65. package/dist/{types-CHAMK2g7.d.ts → types-DtXXsISB.d.ts} +1 -1
  66. package/dist/workbench/contribution.js +4 -4
  67. package/dist/workbench/index.js +4 -4
  68. package/dist/workbench/sessionTitle.js +3 -3
  69. package/dist/workspace-agent-generated-files.d.ts +1 -12
  70. package/dist/workspaceAgentActivityListTypes-BUKNyMbh.d.ts +48 -0
  71. package/dist/{workspaceLinkActions-CzsbvGmC.d.ts → workspaceLinkActions-DxyzMy10.d.ts} +13 -12
  72. package/package.json +31 -17
  73. package/dist/chunk-2L2LVSOD.js.map +0 -1
  74. package/dist/chunk-2STAUA73.js.map +0 -1
  75. package/dist/chunk-EDP4D42H.js.map +0 -1
  76. package/dist/chunk-M6WEFXPL.js.map +0 -1
  77. package/dist/chunk-N5356722.js.map +0 -1
  78. package/dist/chunk-WGCDSA7P.js.map +0 -1
  79. package/dist/chunk-ZXEICU6J.js.map +0 -1
  80. /package/dist/{AgentRichTextReadonly-U3XUJYCW.js.map → AgentRichTextReadonly-CCELQPHE.js.map} +0 -0
  81. /package/dist/{chunk-T57ZZWTC.js.map → chunk-4HAG3FOY.js.map} +0 -0
  82. /package/dist/{chunk-ZBI6R46N.js.map → chunk-5DN5N2XS.js.map} +0 -0
  83. /package/dist/{chunk-BCBB4HOV.js.map → chunk-634MNSI5.js.map} +0 -0
  84. /package/dist/{chunk-JA6XAKKE.js.map → chunk-TWF6JXPC.js.map} +0 -0
  85. /package/dist/{chunk-7AYFKNLD.js.map → chunk-TWMV6YTX.js.map} +0 -0
  86. /package/dist/{chunk-GLVENTN6.js.map → chunk-WXLO33YP.js.map} +0 -0
  87. /package/dist/{chunk-WMJDOMG6.js.map → chunk-ZELGKLW5.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../agent-message-center/WorkspaceAgentMessageCenterPanel.tsx","../../shared/AgentVerticalScrollArea.tsx","../../agent-message-center/workspaceAgentMessageCenterDigest.ts","../../agent-message-center/workspaceAgentMessageCenterCollection.ts","../../agent-message-center/workspaceAgentMessageCenterModel.ts","../../agent-message-center/WorkspaceAgentMessageCenterAttentionDeck.tsx","../../agent-message-center/WorkspaceAgentMessageCenterCard.tsx","../../agent-message-center/WorkspaceAgentMessageCenterIdentity.tsx","../../agent-message-center/workspaceAgentMessageCenterPreview.tsx","../../shared/utils/agentSessionMentionText.ts","../../agent-message-center/WorkspaceAgentMessageCenterViewControls.tsx","../../agent-message-center/workspaceAgentMessageCenterViewModel.ts","../../agent-message-center/WorkspaceAgentMessageCenterGroupHeading.tsx","../../agent-message-center/messageCenterFilterPreferences.ts","../../agent-message-center/workspaceAgentMessageCenterEngineModel.ts","../../agent-message-center/workspaceAgentMessageCenterModelStability.ts","../../agent-message-center/workspaceAgentConsumerSelectors.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 DrawerDescription,\n DrawerTitle,\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 resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard,\n type WorkspaceAgentMessageCenterCardProps\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport { MessageCenterGroupHeading } from \"./WorkspaceAgentMessageCenterGroupHeading\";\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\nexport type WorkspaceAgentMessageCenterPanelPresentation =\n | \"drawer\"\n | \"embedded\";\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 presentation?: WorkspaceAgentMessageCenterPanelPresentation;\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 promptStatus?: (\n item: WorkspaceAgentMessageCenterItem\n ) => \"idle\" | \"responding\" | \"unknown\" | \"failed\";\n onSubmitPrompt: (input: {\n action?: string;\n agentSessionId: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n promptKind?: string;\n requestId: string;\n turnId?: 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 presentation = \"drawer\",\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n promptStatus = () => \"idle\",\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 presentation={presentation}\n onClose={onClose}\n onHighlightedItemSettled={onHighlightedItemSettled}\n onLinkAction={onLinkAction}\n onNotificationActioned={onNotificationActioned}\n onOpenChat={onOpenChat}\n promptStatus={promptStatus}\n onSubmitPrompt={onSubmitPrompt}\n />\n </AgentGuiI18nProvider>\n );\n }\n);\n\nfunction WorkspaceAgentMessageCenterPanelContent({\n open,\n model,\n highlightedItemId = null,\n portalContainer = null,\n presentation = \"drawer\",\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n promptStatus = () => \"idle\",\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 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 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:\n item.pendingInteractionTarget?.agentSessionId ?? item.agentSessionId,\n ...(item.pendingInteractionTarget\n ? { turnId: item.pendingInteractionTarget.turnId }\n : {}),\n promptKind: item.pendingPrompt?.kind\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 promptStatus(item) === \"responding\" ||\n promptStatus(item) === \"unknown\"\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 promptStatus,\n setItemNode,\n submitPrompt\n ]\n );\n\n const panelContents = (\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 {presentation === \"drawer\" ? (\n <div className=\"min-w-0\">\n <DrawerTitle className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n </DrawerTitle>\n <DrawerDescription className=\"truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </DrawerDescription>\n </div>\n ) : (\n <p className=\"min-w-0 truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </p>\n )}\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 isPromptSubmitting={(item) =>\n promptStatus(item) === \"responding\" ||\n promptStatus(item) === \"unknown\"\n }\n registerNode={setItemNode}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(item, input) => void submitPrompt(item, input)}\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 );\n\n if (presentation === \"embedded\") {\n return (\n <section\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n className=\"t-modal nodrag flex h-full min-h-0 w-full flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)] [-webkit-app-region:no-drag]\"\n data-presentation=\"embedded\"\n data-testid=\"workspace-agent-message-center\"\n >\n {panelContents}\n </section>\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-presentation=\"drawer\"\n data-testid=\"workspace-agent-message-center\"\n portalContainer={portalContainer ?? undefined}\n showOverlay={false}\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n >\n {panelContents}\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","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 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\ninterface DigestAgentMessageSummaryCacheEntry {\n kind: string;\n payload: AgentActivityMessage[\"payload\"];\n role: string;\n status: string | null | undefined;\n summary: string;\n version: number;\n}\n\nconst digestAgentMessageSummaryByMessage = new WeakMap<\n AgentActivityMessage,\n DigestAgentMessageSummaryCacheEntry\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 const cached = digestAgentMessageSummaryByMessage.get(message);\n if (\n cached &&\n cached.role === message.role &&\n cached.kind === message.kind &&\n cached.status === message.status &&\n cached.payload === message.payload &&\n cached.version === message.version\n ) {\n return cached.summary;\n }\n if (\n !isAgentMessageRole(message.role) ||\n isReasoningMessageKind(message.kind)\n ) {\n digestAgentMessageSummaryByMessage.set(message, {\n kind: message.kind,\n payload: message.payload,\n role: message.role,\n status: message.status,\n summary: \"\",\n version: message.version\n });\n return \"\";\n }\n const summary = meaningfulMessageSummary(message);\n digestAgentMessageSummaryByMessage.set(message, {\n kind: message.kind,\n payload: message.payload,\n role: message.role,\n status: message.status,\n summary,\n version: message.version\n });\n return summary;\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\n/**\n * Mirrors the same-named guard in workspaceAgentMessageCenterModel.ts: a\n * reasoning/thinking message carries an assistant-like `role` but\n * `kind: \"reasoning\"` and must never be summarized as a normal agent reply.\n */\nfunction isReasoningMessageKind(kind: string): boolean {\n return kind.trim().toLowerCase() === \"reasoning\";\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 type {\n WorkspaceAgentMessageCenterCounts,\n WorkspaceAgentMessageCenterItem,\n WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\nimport type { AgentActivityNeedsAttentionItem } from \"@tutti-os/agent-activity-core\";\n\nconst EMPTY_COUNTS: WorkspaceAgentMessageCenterCounts = {\n all: 0,\n working: 0,\n waiting: 0,\n completed: 0,\n failed: 0\n};\n\nexport function buildWorkspaceAgentMessageCenterModelFromItems(\n sourceItems: readonly WorkspaceAgentMessageCenterItem[],\n itemCutoffUnixMs?: number | null\n): WorkspaceAgentMessageCenterModel {\n const items = sourceItems\n .filter((item) => isWithinItemCutoff(item, itemCutoffUnixMs))\n .sort(compareItems);\n return {\n waitingCount: items.filter(isWaitingMessageCenterItem).length,\n items,\n counts: countItems(items)\n };\n}\n\nexport function 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\nexport function isWaitingMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null || item.needsAttentionKind !== null;\n}\n\nexport function isInteractiveMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null;\n}\n\nexport function selectMessageCenterAttentionDeckItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterItem[] {\n return items.filter(isInteractiveMessageCenterItem);\n}\n\nexport function isCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n item.status === \"completed\" ||\n item.status === \"canceled\" ||\n item.status === \"idle\"\n );\n}\n\nfunction isWithinItemCutoff(\n item: WorkspaceAgentMessageCenterItem,\n cutoffUnixMs: number | null | undefined\n): boolean {\n if (!Number.isFinite(cutoffUnixMs)) return true;\n if (isWaitingMessageCenterItem(item)) return true;\n const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n return timestamp >= Number(cutoffUnixMs);\n}\n\nfunction countItems(\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 } else if (isCompletedMessageCenterItem(item)) {\n counts.completed += 1;\n } else if (item.status === \"working\") {\n counts.working += 1;\n } else if (item.status === \"failed\") {\n counts.failed += 1;\n }\n return counts;\n },\n { ...EMPTY_COUNTS }\n );\n}\n\nfunction compareItems(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): number {\n const leftWaiting = isWaitingMessageCenterItem(left);\n const rightWaiting = isWaitingMessageCenterItem(right);\n if (leftWaiting !== rightWaiting) return leftWaiting ? -1 : 1;\n return (\n right.sortTimeUnixMs - left.sortTimeUnixMs ||\n left.agentSessionId.localeCompare(right.agentSessionId)\n );\n}\n","import {\n type AgentActivityMessage,\n type AgentActivityNeedsAttentionItem,\n type AgentActivitySession,\n type WorkspaceAgentConsumerSession\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 { normalizeAgentApprovalPurpose } from \"../shared/agentConversation/agentApprovalPurpose\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"../shared/workspaceAgentSessionSortTime\";\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\";\nexport {\n buildWorkspaceAgentMessageCenterModelFromItems,\n isCompletedMessageCenterItem,\n isInteractiveMessageCenterItem,\n isWaitingMessageCenterItem,\n selectMessageCenterAttentionDeckItems\n} from \"./workspaceAgentMessageCenterCollection\";\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 agentTargetId?: string | null;\n agentName?: string | null;\n agentAvatarUrl?: string | null;\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 pendingInteractionTarget: WorkspaceAgentMessageCenterInteractionTarget | 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 WorkspaceAgentMessageCenterInteractionTarget {\n agentSessionId: string;\n requestId: string;\n turnId: string;\n}\n\nexport interface WorkspaceAgentMessageCenterTurnOutcome {\n notificationKey: string;\n status: \"completed\" | \"failed\";\n turnId: string | null;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterOptions {\n agentPresentations?: readonly WorkspaceAgentMessageCenterAgentPresentation[];\n avoidGroupingEdits?: boolean;\n identityBySessionId?: Record<string, WorkspaceAgentMessageCenterIdentity>;\n itemCutoffUnixMs?: number | null;\n promptFallbackLabels?: WorkspaceAgentMessageCenterPromptFallbackLabels;\n workspaceRoot?: string | null;\n}\n\nexport interface WorkspaceAgentMessageCenterAgentPresentation {\n agentTargetId: string;\n iconUrl?: string | null;\n name: string;\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\nexport interface BuildWorkspaceAgentMessageCenterItemInput {\n session: WorkspaceAgentMessageCenterSession;\n latestTurn?: WorkspaceAgentConsumerSession[\"latestTurn\"] | null;\n messages: readonly AgentActivityMessage[];\n status: WorkspaceAgentActivityStatus;\n needsAttention: AgentActivityNeedsAttentionItem | null;\n pendingInteractionTarget: WorkspaceAgentMessageCenterInteractionTarget | null;\n pendingPrompt: AgentConversationPromptVM | null;\n latestTurnOutcome: WorkspaceAgentMessageCenterTurnOutcome | null;\n options?: BuildWorkspaceAgentMessageCenterOptions;\n}\n\ntype WorkspaceAgentMessageCenterSession =\n | AgentActivitySession\n | WorkspaceAgentConsumerSession[\"session\"];\n\nexport function buildWorkspaceAgentMessageCenterItem({\n session,\n latestTurn,\n messages,\n status,\n needsAttention,\n pendingInteractionTarget,\n pendingPrompt,\n latestTurnOutcome,\n options = {}\n}: BuildWorkspaceAgentMessageCenterItemInput): WorkspaceAgentMessageCenterItem {\n const messageAnalysis = analyzeMessageCenterSessionMessages(\n session.agentSessionId,\n messages\n );\n const lastAgentMessage = messageAnalysis.latestAgentMessage;\n const title = session.title.trim();\n const digest = buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle: title,\n latestAgentMessage: messageAnalysis.latestDigestAgentMessage,\n needsAttention,\n pendingPrompt,\n status\n });\n const agentPresentation = resolveMessageCenterAgentPresentation(\n session.agentTargetId,\n options.agentPresentations\n );\n return {\n id: `message-center-${session.agentSessionId}`,\n agentSessionId: session.agentSessionId,\n agentTargetId: session.agentTargetId?.trim() || null,\n agentName: agentPresentation?.name ?? null,\n agentAvatarUrl: agentPresentation?.iconUrl ?? null,\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 pendingInteractionTarget,\n pendingPrompt,\n needsAttentionKind: needsAttention?.kind ?? null,\n needsAttentionSummary: needsAttention?.summary ?? null,\n latestTurnOutcome,\n sortTimeUnixMs: resolveWorkspaceAgentSessionSortTimeUnixMs({\n ...session,\n latestTurn\n })\n };\n}\n\nfunction resolveMessageCenterAgentPresentation(\n agentTargetId: string | null | undefined,\n presentations:\n | readonly WorkspaceAgentMessageCenterAgentPresentation[]\n | undefined\n): { iconUrl: string | null; name: string } | null {\n const targetId = agentTargetId?.trim() ?? \"\";\n if (!targetId) {\n return null;\n }\n const presentation = presentations?.find(\n (candidate) => candidate.agentTargetId.trim() === targetId\n );\n const name = presentation?.name.trim() ?? \"\";\n if (!presentation || !name) {\n return null;\n }\n return {\n iconUrl: presentation.iconUrl?.trim() || null,\n name\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: WorkspaceAgentMessageCenterSession\n): boolean {\n return \"imported\" in session && session.imported === true;\n}\n\ninterface MessageCenterSessionMessageAnalysis {\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 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 (\n isAgentMessageRole(message.role) &&\n !isReasoningMessageKind(message.kind)\n ) {\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 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 const approvalPurpose = normalizeAgentApprovalPurpose(\n payload.approvalPurpose\n );\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 ...(approvalPurpose ? { approvalPurpose } : {}),\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 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 isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\n/**\n * Reasoning/thinking messages are stored with an assistant-like `role` but a\n * distinct `kind: \"reasoning\"` (see workspaceAgentMessageProjection.ts, which\n * routes `kind === \"reasoning\"` to a separate \"assistant_thinking\" timeline\n * item instead of a normal reply). The message center must not treat these as\n * a normal agent reply when picking the latest message to preview, otherwise\n * raw thinking content (occasionally still carrying literal tag markup) can\n * surface verbatim in the message-center list instead of the actual reply.\n */\nfunction isReasoningMessageKind(kind: string): boolean {\n return kind.trim().toLowerCase() === \"reasoning\";\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 {\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX,\n type ReactNode\n} 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 isPromptSubmitting: (item: WorkspaceAgentMessageCenterItem) => boolean;\n registerNode?: (itemId: string, node: HTMLElement | null) => void;\n renderCard?: (\n input: WorkspaceAgentMessageCenterAttentionDeckRenderCardInput\n ) => ReactNode;\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 interface WorkspaceAgentMessageCenterAttentionDeckRenderCardInput {\n cardRef?: (node: HTMLElement | null) => void;\n highlighted: boolean;\n interactive: boolean;\n isSubmitting: boolean;\n item: WorkspaceAgentMessageCenterItem;\n onSubmitPrompt: (input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }) => void;\n}\n\nexport function WorkspaceAgentMessageCenterAttentionDeck({\n items,\n highlightedItemId = null,\n isPromptSubmitting,\n registerNode,\n renderCard,\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 = isPromptSubmitting(topItem);\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 {renderCard ? (\n renderCard({\n highlighted: false,\n interactive: false,\n isSubmitting: false,\n item: leavingItem,\n onSubmitPrompt: () => {}\n })\n ) : (\n <WorkspaceAgentMessageCenterCard\n interactive={false}\n isSubmitting={false}\n item={leavingItem}\n onOpenChat={onOpenChat}\n onSubmitPrompt={() => {}}\n />\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 {renderCard ? (\n renderCard({\n cardRef: registerNode\n ? (node) => registerNode(topItem.id, node)\n : undefined,\n highlighted: topItem.id === highlightedItemId,\n interactive: true,\n isSubmitting: topIsSubmitting || isTopCoolingDown,\n item: topItem,\n onSubmitPrompt: (input) => onSubmitPrompt(topItem, input)\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 )}\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 memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type ReactNode\n} from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { Button, cn, StatusDot } from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport { AgentInteractivePromptSurface } from \"../shared/agentConversation/components/AgentInteractivePromptSurface\";\nimport { AgentMessageMarkdown } from \"../shared/AgentMessageMarkdown\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport { workspaceAgentActivityStatusLabel } from \"../shared/workspaceAgentActivityStatusLabel\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\nimport {\n LazyMessageCenterTooltip,\n MessageCenterIdentityAvatarMark,\n MessageCenterOpenChatButton,\n ProjectPathInfo,\n messageCenterStatusTone,\n messageCenterStatusToneClass,\n statusClass\n} from \"./WorkspaceAgentMessageCenterIdentity\";\nexport * from \"./WorkspaceAgentMessageCenterIdentity\";\nimport {\n buildWorkspaceAgentInteractivePromptLabels,\n messageCenterStackPreviewNodes,\n messageCenterStackPreviewText\n} from \"./workspaceAgentMessageCenterPreview\";\nexport * from \"./workspaceAgentMessageCenterPreview\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n actionsAccessory?: ReactNode;\n footerAccessory?: ReactNode;\n headerAccessory?: ReactNode;\n highlighted?: boolean;\n interactive?: boolean;\n isSubmitting: boolean;\n lazySummary?: boolean;\n promptVariant?: \"compact\" | \"full\";\n showSummaryWithPrompt?: boolean;\n summaryAccessory?: ReactNode;\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 actionsAccessory,\n footerAccessory,\n headerAccessory,\n highlighted = false,\n interactive = true,\n item,\n isSubmitting,\n lazySummary = false,\n promptVariant = \"compact\",\n showSummaryWithPrompt = true,\n summaryAccessory,\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 = item.title.trim();\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 className=\"flex shrink-0 items-center gap-2\">\n {headerAccessory}\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 </span>\n </div>\n\n {summary && (showSummaryWithPrompt || !prompt || !interactive) ? (\n <MessageCenterSummary\n item={item}\n lazy={lazySummary}\n onLinkAction={onLinkAction}\n summary={summary}\n emptyLabel={t(\"agentHost.workspaceAgentMessageCenterNoSummary\")}\n />\n ) : null}\n\n {summaryAccessory}\n\n {prompt && interactive ? (\n <div className=\"min-w-0\">\n <AgentInteractivePromptSurface\n embedded\n variant={promptVariant}\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 {footerAccessory}\n\n <MessageCenterOpenChatButton\n actionsAccessory={actionsAccessory}\n provider={item.provider}\n item={item}\n label={t(\"agentHost.workspaceAgentMessageCenterOpenChat\")}\n onOpenChat={onOpenChat}\n // Keep the conversation available for full context and as a fallback\n // even when the compact card can complete the interaction inline.\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 agentAvatarUrl={items[0]?.agentAvatarUrl}\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 agentAvatarUrl={firstItem.agentAvatarUrl}\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 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\nexport function 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 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={onLinkAction}\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","import {\n cloneElement,\n useCallback,\n useEffect,\n useState,\n type FocusEvent as ReactFocusEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { ExternalLink, Info } from \"lucide-react\";\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport { managedAgentRoundedIconUrl } from \"../shared/managedAgentIcons\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport { userAvatarPlaceholderUrl } from \"../shared/userAvatarPlaceholder\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport function MessageCenterOpenChatButton({\n actionsAccessory,\n alwaysVisible = false,\n item,\n label,\n onOpenChat,\n provider\n}: {\n actionsAccessory?: ReactNode;\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 agentAvatarUrl={item.agentAvatarUrl}\n agentName={item.agentName}\n identity={item.identity}\n provider={provider}\n />\n <span className=\"inline-flex shrink-0 items-center gap-2\">\n {actionsAccessory}\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 </span>\n </div>\n );\n}\n\nexport function MessageCenterIdentityLabel({\n agentAvatarUrl,\n agentName,\n identity,\n provider\n}: {\n agentAvatarUrl?: string | null;\n agentName?: string | null;\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n if (!identity) {\n return (\n <AgentProviderLabel\n agentAvatarUrl={agentAvatarUrl}\n agentName={agentName}\n provider={provider}\n />\n );\n }\n\n const resolvedAgentAvatarUrl =\n identity.agentAvatarUrl?.trim() ||\n agentAvatarUrl?.trim() ||\n 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={resolvedAgentAvatarUrl}\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 agentAvatarUrl,\n identity,\n provider,\n userId\n}: {\n agentAvatarUrl?: string | null;\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={agentAvatarUrl?.trim() || 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() ||\n agentAvatarUrl?.trim() ||\n 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\nexport function 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\nexport function 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({\n agentAvatarUrl,\n agentName,\n provider\n}: {\n agentAvatarUrl?: string | null;\n agentName?: string | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n const label = agentName?.trim() || 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={agentAvatarUrl?.trim() || 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\nexport function 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\nexport function 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 { ReactElement, ReactNode } from \"react\";\nimport { AppWindow } from \"lucide-react\";\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 { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport type { WorkspaceAgentMessageCenterItem } from \"./workspaceAgentMessageCenterModel\";\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 fileChangeApprovalLead: t(\"agentHost.agentGui.fileChangeApprovalRequired\", {\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","import type { UiLanguage } from \"../../contexts/settings/domain/agentSettings\";\nimport { normalizeAgentTitleText } from \"./agentTitleText.ts\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\n\nconst MARKDOWN_LINK_PATTERN = /\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(([^)\\s]+)\\)/g;\nconst MARKDOWN_LABEL_ESCAPE_PATTERN = /\\\\([\\\\[\\]()])/g;\nconst SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE: Record<UiLanguage, string> = {\n \"zh-CN\": \"@会话 · \",\n en: \"@session · \"\n};\nconst PLAIN_SESSION_AGENT_LABELS = [\n \"Claude Code\",\n \"Hermes Agent\",\n \"OpenClaw\",\n \"Nexight\",\n \"Hermes\",\n \"Codex\"\n] as const;\n\nexport interface FormatAgentSessionMentionTextOptions {\n language?: UiLanguage;\n}\n\nexport function formatAgentSessionMentionText(\n value: string | null | undefined,\n options: FormatAgentSessionMentionTextOptions = {}\n): string {\n const trimmed = value?.trim() ?? \"\";\n if (!trimmed) {\n return \"\";\n }\n const sessionMentionDisplayPrefix = sessionMentionDisplayPrefixForLanguage(\n options.language\n );\n\n const withSessionMentionsNormalized = trimmed.replace(\n MARKDOWN_LINK_PATTERN,\n (fullMatch, rawLabel: string, href: string) => {\n const label = unescapeMarkdownLabel(rawLabel);\n const mention = parseRichTextMentionHref(href, label);\n if (!mention) {\n return isRichTextMentionHref(href) ? label : fullMatch;\n }\n const providerId = mention.providerId.trim().toLowerCase();\n const displayLabel = label || mention.label;\n if (providerId === \"agent-session\") {\n return formatSessionLabel(displayLabel, sessionMentionDisplayPrefix);\n }\n if (providerId === \"workspace-issue\") {\n return formatIssueLabel(displayLabel);\n }\n return displayLabel;\n }\n );\n const normalized = normalizeAgentTitleText(withSessionMentionsNormalized);\n if (isPlainSessionMentionText(normalized, sessionMentionDisplayPrefix)) {\n return formatSessionLabel(normalized, sessionMentionDisplayPrefix);\n }\n return normalized;\n}\n\nfunction isPlainSessionMentionText(\n value: string,\n sessionMentionDisplayPrefix: string\n): boolean {\n const trimmed = value.trim();\n if (\n !trimmed.startsWith(\"@\") ||\n trimmed.startsWith(sessionMentionDisplayPrefix)\n ) {\n return false;\n }\n\n return PLAIN_SESSION_AGENT_LABELS.some((agentLabel) => {\n const ampersandSeparator = ` & ${agentLabel}`;\n const ampersandIndex = trimmed.indexOf(ampersandSeparator);\n if (ampersandIndex > 1) {\n const trailing = trimmed.slice(\n ampersandIndex + ampersandSeparator.length\n );\n if (trailing === \"\" || trailing.startsWith(\" \")) {\n return true;\n }\n }\n\n const dottedSeparator = ` · ${agentLabel} · `;\n return trimmed.indexOf(dottedSeparator) > 1;\n });\n}\n\nfunction sessionMentionDisplayPrefixForLanguage(\n language: UiLanguage | undefined\n): string {\n return SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE[language ?? \"en\"];\n}\n\nfunction formatSessionLabel(\n label: string,\n sessionMentionDisplayPrefix: string\n): string {\n const normalizedLabel = label.trim().replace(/^@+/, \"\").trim();\n return normalizedLabel\n ? `${sessionMentionDisplayPrefix}${normalizedLabel}`\n : label.trim();\n}\n\nfunction formatIssueLabel(label: string): string {\n const normalizedLabel = label.trim().replace(/^@+/, \"\").trim();\n return normalizedLabel ? `@Task · ${normalizedLabel}` : label.trim();\n}\n\nfunction unescapeMarkdownLabel(label: string): string {\n return label.replace(MARKDOWN_LABEL_ESCAPE_PATTERN, \"$1\");\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 onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\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 onClick={(event) => {\n event.stopPropagation();\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\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, { count: number; label: string }>();\n for (const item of items) {\n const current = counts.get(item.provider);\n counts.set(item.provider, {\n count: (current?.count ?? 0) + 1,\n label:\n current?.label ||\n item.agentName?.trim() ||\n workspaceAgentProviderLabel(item.provider)\n });\n }\n return [...counts.entries()]\n .map(([value, option]) => ({\n count: option.count,\n label: option.label,\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 item.agentName?.trim() || 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 { cn, StatusDot } from \"@tutti-os/ui-system\";\nimport {\n MessageCenterIdentityAvatarMark,\n MessageCenterIdentityLabel,\n messageCenterStatusToneClass,\n type MessageCenterStatusTone\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport type { MessageCenterGroup } from \"./workspaceAgentMessageCenterViewModel\";\n\nexport function MessageCenterGroupHeading({\n group\n}: {\n group: MessageCenterGroup;\n}): React.JSX.Element {\n \"use memo\";\n const statusSignal = messageCenterGroupStatusSignal(group.id);\n const firstItem = group.items[0];\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 agentAvatarUrl={firstItem?.agentAvatarUrl}\n agentName={firstItem?.agentName}\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 agentAvatarUrl={firstItem?.agentAvatarUrl}\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 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 AgentActivityInteraction,\n AgentActivityMessage,\n AgentActivityNeedsAttentionItem,\n AgentActivitySnapshot,\n AgentSessionEngineState,\n WorkspaceAgentConsumerSession\n} from \"@tutti-os/agent-activity-core\";\nimport { normalizeAgentApprovalPurpose } from \"../shared/agentConversation/agentApprovalPurpose\";\nimport {\n selectEngineInteractionResponse,\n selectPendingSubmitsForSession,\n selectPlanDecisionForTurn,\n selectPlanTurnDismissed,\n selectWorkspaceAgentRootConversationSessions\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport { normalizeAskUserQuestions } from \"../shared/agentConversation/askUserQuestions\";\nimport {\n extractExitPlanKeepPlanningOptionId,\n extractExitPlanModeOptions,\n isExitPlanSwitchModeInput\n} from \"../shared/agentConversation/exitPlanOptions\";\nimport {\n latestPlanTurnId,\n planImplementationPromptFromPlanTurn\n} from \"../shared/agentConversation/planImplementationPresentation\";\nimport {\n buildWorkspaceAgentMessageCenterItem,\n buildWorkspaceAgentMessageCenterModelFromItems,\n type BuildWorkspaceAgentMessageCenterOptions,\n type WorkspaceAgentMessageCenterModel,\n type WorkspaceAgentMessageCenterTurnOutcome\n} from \"./workspaceAgentMessageCenterModel\";\nimport { workspaceAgentMessageCenterItemEqual } from \"./workspaceAgentMessageCenterModelStability\";\n\n/**\n * Canonical Message Center entrypoint. Session/turn/interaction truth comes\n * directly from the engine. Durable messages are presentation input only:\n * title and digest text may use them, but they cannot recreate lifecycle or\n * pending-interaction state.\n */\nexport function buildWorkspaceAgentMessageCenterModelFromEngine(\n presentation: WorkspaceAgentMessageCenterPresentation,\n snapshot: Pick<AgentActivitySnapshot, \"sessionMessagesById\" | \"workspaceId\">,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentMessageCenterModel {\n const items = presentation.consumers\n .filter((consumer) => consumer.session.visible !== false)\n .map((consumer) => {\n const interaction = latestPendingInteraction(consumer);\n const needsAttention = interaction\n ? needsAttentionFromInteraction(consumer, interaction)\n : null;\n return buildWorkspaceAgentMessageCenterItem({\n session: consumer.session,\n latestTurn: consumer.latestTurn,\n messages: sessionMessages(snapshot.sessionMessagesById, consumer),\n status: consumer.displayStatus,\n needsAttention,\n pendingInteractionTarget: interaction\n ? interactionTarget(interaction)\n : null,\n pendingPrompt: interaction ? promptFromInteraction(interaction) : null,\n latestTurnOutcome: turnOutcome(consumer),\n options\n });\n });\n return buildWorkspaceAgentMessageCenterModelFromItems(\n items,\n options.itemCutoffUnixMs\n );\n}\n\nexport interface WorkspaceAgentMessageCenterPresentation {\n consumers: readonly WorkspaceAgentConsumerSession[];\n dismissedPlanTurnKeys: Readonly<Record<string, true>>;\n promptStatusByKey: Readonly<\n Record<string, WorkspaceAgentMessageCenterPromptStatus>\n >;\n}\n\nexport function selectWorkspaceAgentMessageCenterPresentation(\n state: AgentSessionEngineState\n): WorkspaceAgentMessageCenterPresentation {\n const consumers = selectWorkspaceAgentRootConversationSessions(state);\n const promptStatusByKey: Record<\n string,\n WorkspaceAgentMessageCenterPromptStatus\n > = {};\n const dismissedPlanTurnKeys: Record<string, true> = {};\n for (const consumer of consumers) {\n const sessionId = consumer.session.agentSessionId;\n for (const interaction of consumer.pendingInteractions) {\n const response = selectEngineInteractionResponse(\n state,\n interaction.agentSessionId,\n interaction.turnId,\n interaction.requestId\n );\n if (response) {\n promptStatusByKey[\n promptStatusKey(\n interaction.agentSessionId,\n interaction.turnId,\n interaction.requestId\n )\n ] = response.status;\n }\n }\n const turnId = consumer.latestTurn?.turnId ?? \"\";\n if (!turnId) continue;\n if (selectPlanTurnDismissed(state, sessionId, turnId)) {\n dismissedPlanTurnKeys[promptStatusKey(sessionId, turnId, turnId)] = true;\n }\n const decision = selectPlanDecisionForTurn(state, sessionId, turnId);\n if (decision) {\n promptStatusByKey[promptStatusKey(sessionId, turnId, turnId)] =\n decision.status === \"requested\" ? \"responding\" : decision.status;\n continue;\n }\n const feedbackPrefix = [\n \"plan-implementation\",\n consumer.session.workspaceId,\n sessionId,\n turnId,\n \"feedback\"\n ].join(\":\");\n const submit = selectPendingSubmitsForSession(state, sessionId).find(\n (record) => record.clientSubmitId.startsWith(feedbackPrefix)\n );\n if (submit) {\n promptStatusByKey[promptStatusKey(sessionId, turnId, turnId)] =\n submit.status === \"failed\"\n ? \"failed\"\n : submit.status === \"uncertain\"\n ? \"unknown\"\n : \"responding\";\n }\n }\n return {\n consumers,\n dismissedPlanTurnKeys,\n promptStatusByKey\n };\n}\n\nexport function workspaceAgentMessageCenterPresentationEqual(\n left: WorkspaceAgentMessageCenterPresentation,\n right: WorkspaceAgentMessageCenterPresentation\n): boolean {\n return (\n booleanMapsEqual(left.dismissedPlanTurnKeys, right.dismissedPlanTurnKeys) &&\n promptStatusMapsEqual(left.promptStatusByKey, right.promptStatusByKey) &&\n left.consumers.length === right.consumers.length &&\n left.consumers.every((item, index) => {\n const candidate = right.consumers[index];\n return (\n candidate !== undefined &&\n item.session === candidate.session &&\n item.activeTurn === candidate.activeTurn &&\n item.latestTurn === candidate.latestTurn &&\n item.displayStatus === candidate.displayStatus &&\n item.pendingInteractions.length ===\n candidate.pendingInteractions.length &&\n item.pendingInteractions.every(\n (interaction, interactionIndex) =>\n interaction === candidate.pendingInteractions[interactionIndex]\n )\n );\n })\n );\n}\n\nexport type WorkspaceAgentAttentionTarget =\n | {\n kind: \"interaction\";\n workspaceId: string;\n agentSessionId: string;\n turnId: string;\n requestId: string;\n }\n | {\n kind: \"plan-implementation\";\n workspaceId: string;\n agentSessionId: string;\n turnId: string;\n requestId: string;\n };\n\nexport interface WorkspaceAgentAttentionItem {\n item: import(\"./workspaceAgentMessageCenterModel\").WorkspaceAgentMessageCenterItem;\n status: WorkspaceAgentMessageCenterPromptStatus;\n target: WorkspaceAgentAttentionTarget;\n}\n\n/**\n * Projects every canonical actionable target instead of collapsing a root\n * conversation to its latest interaction. The display item keeps the root\n * conversation identity for navigation while target keeps the exact child\n * session/turn/request identity used by the command.\n */\nexport function selectWorkspaceAgentAttentionItems(\n presentation: WorkspaceAgentMessageCenterPresentation,\n snapshot: Pick<AgentActivitySnapshot, \"sessionMessagesById\" | \"workspaceId\">,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentAttentionItem[] {\n const result: WorkspaceAgentAttentionItem[] = [];\n for (const consumer of presentation.consumers) {\n if (\n consumer.session.visible === false ||\n consumer.session.workspaceId !== snapshot.workspaceId\n ) {\n continue;\n }\n const messages = sessionMessages(snapshot.sessionMessagesById, consumer);\n for (const interaction of consumer.pendingInteractions) {\n const prompt = promptFromInteraction(interaction);\n if (!prompt) continue;\n const target: WorkspaceAgentAttentionTarget = {\n kind: \"interaction\",\n workspaceId: consumer.session.workspaceId,\n agentSessionId: interaction.agentSessionId,\n turnId: interaction.turnId,\n requestId: interaction.requestId\n };\n const item = buildWorkspaceAgentMessageCenterItem({\n session: consumer.session,\n latestTurn: consumer.latestTurn,\n messages,\n status: \"waiting\",\n needsAttention: needsAttentionFromInteraction(consumer, interaction),\n pendingInteractionTarget: interactionTarget(interaction),\n pendingPrompt: prompt,\n latestTurnOutcome: null,\n options\n });\n item.id = workspaceAgentAttentionKey(target);\n item.sortTimeUnixMs = interaction.createdAtUnixMs;\n result.push({\n item,\n status:\n presentation.promptStatusByKey[\n promptStatusKey(\n interaction.agentSessionId,\n interaction.turnId,\n interaction.requestId\n )\n ] ?? \"idle\",\n target\n });\n }\n\n const latestTurn = consumer.latestTurn;\n if (\n latestTurn?.phase !== \"settled\" ||\n latestTurn.outcome !== \"completed\" ||\n consumer.session.capabilities?.planImplementation !== true ||\n consumer.session.capabilities.planMode !== true ||\n latestPlanTurnId(messages) !== latestTurn.turnId\n ) {\n continue;\n }\n const target: WorkspaceAgentAttentionTarget = {\n kind: \"plan-implementation\",\n workspaceId: consumer.session.workspaceId,\n agentSessionId: consumer.session.agentSessionId,\n turnId: latestTurn.turnId,\n requestId: latestTurn.turnId\n };\n const statusKey = promptStatusKey(\n target.agentSessionId,\n target.turnId,\n target.requestId\n );\n if (presentation.dismissedPlanTurnKeys[statusKey]) continue;\n const prompt = planImplementationPromptFromPlanTurn(\n latestTurn.turnId,\n consumer.session.title\n );\n const needsAttention: AgentActivityNeedsAttentionItem = {\n id: `plan-implementation:${latestTurn.turnId}`,\n workspaceId: consumer.session.workspaceId,\n agentSessionId: consumer.session.agentSessionId,\n provider: consumer.session.provider,\n title: prompt.title,\n cwd: consumer.session.cwd,\n kind: \"constraint\",\n summary: prompt.title,\n occurredAtUnixMs: latestTurn.settledAtUnixMs ?? latestTurn.updatedAtUnixMs\n };\n const item = buildWorkspaceAgentMessageCenterItem({\n session: consumer.session,\n latestTurn,\n messages,\n status: \"waiting\",\n needsAttention,\n pendingInteractionTarget: null,\n pendingPrompt: prompt,\n latestTurnOutcome: null,\n options\n });\n item.id = workspaceAgentAttentionKey(target);\n item.sortTimeUnixMs = needsAttention.occurredAtUnixMs;\n result.push({\n item,\n status: presentation.promptStatusByKey[statusKey] ?? \"idle\",\n target\n });\n }\n return result;\n}\n\nexport function workspaceAgentAttentionItemsEqual(\n left: readonly WorkspaceAgentAttentionItem[],\n right: readonly WorkspaceAgentAttentionItem[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => {\n const candidate = right[index];\n return (\n candidate !== undefined &&\n entry.status === candidate.status &&\n workspaceAgentAttentionTargetEqual(entry.target, candidate.target) &&\n workspaceAgentMessageCenterItemEqual(entry.item, candidate.item)\n );\n })\n );\n}\n\nfunction workspaceAgentAttentionKey(target: WorkspaceAgentAttentionTarget) {\n return [\n target.workspaceId,\n target.agentSessionId,\n target.turnId,\n target.requestId\n ].join(\"\\n\");\n}\n\nfunction workspaceAgentAttentionTargetEqual(\n left: WorkspaceAgentAttentionTarget,\n right: WorkspaceAgentAttentionTarget\n): boolean {\n return (\n left.kind === right.kind &&\n left.workspaceId === right.workspaceId &&\n left.agentSessionId === right.agentSessionId &&\n left.turnId === right.turnId &&\n left.requestId === right.requestId\n );\n}\n\nexport type WorkspaceAgentMessageCenterPromptStatus =\n | \"idle\"\n | \"responding\"\n | \"unknown\"\n | \"failed\";\n\nexport function workspaceAgentMessageCenterPromptStatus(\n presentation: WorkspaceAgentMessageCenterPresentation,\n item: Pick<\n import(\"./workspaceAgentMessageCenterModel\").WorkspaceAgentMessageCenterItem,\n \"agentSessionId\" | \"pendingInteractionTarget\" | \"pendingPrompt\"\n >\n): WorkspaceAgentMessageCenterPromptStatus {\n const prompt = item.pendingPrompt;\n if (!prompt) return \"idle\";\n const target = item.pendingInteractionTarget;\n return (\n presentation.promptStatusByKey[\n target\n ? promptStatusKey(\n target.agentSessionId,\n target.turnId,\n target.requestId\n )\n : promptStatusKey(\n item.agentSessionId,\n prompt.requestId,\n prompt.requestId\n )\n ] ?? \"idle\"\n );\n}\n\nfunction promptStatusKey(\n agentSessionId: string,\n turnId: string,\n requestId: string\n): string {\n return `${agentSessionId}\\0${turnId}\\0${requestId}`;\n}\n\nfunction promptStatusMapsEqual(\n left: Readonly<Record<string, WorkspaceAgentMessageCenterPromptStatus>>,\n right: Readonly<Record<string, WorkspaceAgentMessageCenterPromptStatus>>\n): boolean {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => left[key] === right[key])\n );\n}\n\nfunction booleanMapsEqual(\n left: Readonly<Record<string, true>>,\n right: Readonly<Record<string, true>>\n): boolean {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => right[key] === true)\n );\n}\n\nfunction sessionMessages(\n sessionMessagesById: Readonly<Record<string, AgentActivityMessage[]>>,\n consumer: WorkspaceAgentConsumerSession\n): readonly AgentActivityMessage[] {\n for (const id of [\n consumer.session.agentSessionId,\n consumer.session.providerSessionId\n ]) {\n const normalized = id?.trim() ?? \"\";\n if (normalized && sessionMessagesById[normalized]) {\n return sessionMessagesById[normalized];\n }\n }\n return [];\n}\n\nfunction latestPendingInteraction(\n consumer: WorkspaceAgentConsumerSession\n): AgentActivityInteraction | null {\n return consumer.pendingInteractions.at(-1) ?? null;\n}\n\nfunction interactionTarget(\n interaction: AgentActivityInteraction\n): import(\"./workspaceAgentMessageCenterModel\").WorkspaceAgentMessageCenterInteractionTarget {\n return {\n agentSessionId: interaction.agentSessionId,\n requestId: interaction.requestId,\n turnId: interaction.turnId\n };\n}\n\nfunction needsAttentionFromInteraction(\n consumer: WorkspaceAgentConsumerSession,\n interaction: AgentActivityInteraction\n): AgentActivityNeedsAttentionItem {\n const summary = interactionSummary(interaction);\n return {\n id: `interaction:${interaction.requestId}`,\n workspaceId: consumer.session.workspaceId,\n agentSessionId: consumer.session.agentSessionId,\n provider: consumer.session.provider,\n title: summary,\n cwd: consumer.session.cwd,\n kind:\n interaction.kind === \"approval\"\n ? \"permission\"\n : interaction.kind === \"question\"\n ? \"question\"\n : \"constraint\",\n summary,\n occurredAtUnixMs: interaction.createdAtUnixMs\n };\n}\n\nfunction promptFromInteraction(\n interaction: AgentActivityInteraction\n): AgentConversationPromptVM | null {\n const input = interaction.input ?? {};\n const normalizedToolName = (interaction.toolName ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n if (\n interaction.kind === \"plan\" ||\n normalizedToolName === \"exitplanmode\" ||\n isExitPlanSwitchModeInput(input)\n ) {\n const keepPlanningOptionId = extractExitPlanKeepPlanningOptionId(input);\n return {\n kind: \"exit-plan\",\n requestId: interaction.requestId,\n title: interactionSummary(interaction),\n options: extractExitPlanModeOptions(input),\n ...(keepPlanningOptionId ? { keepPlanningOptionId } : {})\n };\n }\n if (interaction.kind === \"question\") {\n const questions = normalizeAskUserQuestions(input.questions);\n return {\n kind: \"ask-user\",\n requestId: interaction.requestId,\n title: interactionSummary(interaction),\n questions:\n questions.length > 0\n ? questions\n : [\n {\n id: \"response\",\n header: \"\",\n question: interactionSummary(interaction),\n options: [],\n multiSelect: false,\n answer: null\n }\n ]\n };\n }\n if (interaction.kind !== \"approval\") {\n return null;\n }\n const options = arrayValue(input.options).flatMap((value) => {\n const option = recordValue(value);\n const id = textValue(option.optionId) ?? textValue(option.id);\n return id\n ? [\n {\n id,\n label: textValue(option.label) ?? textValue(option.name) ?? id,\n kind: textValue(option.kind) ?? id,\n ...(textValue(option.description)\n ? { description: textValue(option.description) as string }\n : {})\n }\n ]\n : [];\n });\n const approvalPurpose = normalizeAgentApprovalPurpose(\n interaction.metadata?.approvalPurpose\n );\n return {\n kind: \"approval\",\n id: `approval:${interaction.requestId}`,\n turnId: interaction.turnId,\n requestId: interaction.requestId,\n callId: textValue(input.callId) ?? interaction.requestId,\n ...(approvalPurpose ? { approvalPurpose } : {}),\n title: interactionSummary(interaction),\n toolName: interaction.toolName ?? null,\n status: interaction.status,\n input,\n options,\n output: interaction.output ?? null,\n occurredAtUnixMs: interaction.createdAtUnixMs\n };\n}\n\nfunction turnOutcome(\n consumer: WorkspaceAgentConsumerSession\n): WorkspaceAgentMessageCenterTurnOutcome | null {\n if (\n consumer.displayStatus !== \"completed\" &&\n consumer.displayStatus !== \"failed\"\n ) {\n return null;\n }\n const turn = consumer.latestTurn;\n if (!turn || turn.phase !== \"settled\") return null;\n const status =\n turn.outcome === \"completed\"\n ? \"completed\"\n : turn.outcome === \"failed\"\n ? \"failed\"\n : null;\n return status\n ? {\n notificationKey: `${consumer.session.agentSessionId}:turn:${turn.turnId}:${status}`,\n status,\n turnId: turn.turnId\n }\n : null;\n}\n\nfunction interactionSummary(interaction: AgentActivityInteraction): string {\n const input = interaction.input ?? {};\n return (\n textValue(input.question) ??\n textValue(input.title) ??\n textValue(input.summary) ??\n interaction.toolName?.trim() ??\n interaction.kind\n );\n}\n\nfunction textValue(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","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\"];\ntype WorkspaceAgentMessageCenterAskUserQuestions = Extract<\n NonNullable<WorkspaceAgentMessageCenterPrompt>,\n { kind: \"ask-user\" }\n>[\"questions\"];\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 &&\n workspaceAgentMessageCenterItemEqual(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\nexport function workspaceAgentMessageCenterItemEqual(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n left.id === right.id &&\n left.agentSessionId === right.agentSessionId &&\n left.agentTargetId === right.agentTargetId &&\n left.agentName === right.agentName &&\n left.agentAvatarUrl === right.agentAvatarUrl &&\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 messageCenterInteractionTargetEqual(\n left.pendingInteractionTarget,\n right.pendingInteractionTarget\n ) &&\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 messageCenterInteractionTargetEqual(\n left: WorkspaceAgentMessageCenterItem[\"pendingInteractionTarget\"],\n right: WorkspaceAgentMessageCenterItem[\"pendingInteractionTarget\"]\n): boolean {\n return (\n left === right ||\n (left !== null &&\n right !== null &&\n left.agentSessionId === right.agentSessionId &&\n left.turnId === right.turnId &&\n left.requestId === right.requestId)\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 switch (left.kind) {\n case \"approval\":\n return (\n right.kind === \"approval\" &&\n left.id === right.id &&\n left.turnId === right.turnId &&\n left.requestId === right.requestId &&\n left.callId === right.callId &&\n left.title === right.title &&\n left.toolName === right.toolName &&\n left.status === right.status &&\n left.occurredAtUnixMs === right.occurredAtUnixMs &&\n messageCenterJsonValueEqual(left.input, right.input) &&\n messageCenterJsonValueEqual(\n left.output ?? null,\n right.output ?? null\n ) &&\n messageCenterApprovalOptionsEqual(left.options, right.options)\n );\n case \"ask-user\":\n return (\n right.kind === \"ask-user\" &&\n left.requestId === right.requestId &&\n left.title === right.title &&\n messageCenterAskUserQuestionsEqual(left.questions, right.questions)\n );\n case \"exit-plan\":\n return (\n right.kind === \"exit-plan\" &&\n left.requestId === right.requestId &&\n left.title === right.title &&\n left.keepPlanningOptionId === right.keepPlanningOptionId &&\n messageCenterApprovalOptionsEqual(left.options, right.options)\n );\n case \"plan-implementation\":\n return (\n right.kind === \"plan-implementation\" &&\n left.requestId === right.requestId &&\n left.title === right.title\n );\n }\n}\n\nfunction messageCenterApprovalOptionsEqual(\n left: readonly {\n description?: string;\n id: string;\n kind: string;\n label: string;\n }[],\n right: readonly {\n description?: string;\n id: string;\n kind: string;\n label: string;\n }[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((option, index) => {\n const rightOption = right[index];\n return (\n rightOption &&\n option.id === rightOption.id &&\n option.label === rightOption.label &&\n option.kind === rightOption.kind &&\n option.description === rightOption.description\n );\n });\n}\n\nfunction messageCenterAskUserQuestionsEqual(\n left: WorkspaceAgentMessageCenterAskUserQuestions,\n right: WorkspaceAgentMessageCenterAskUserQuestions\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((question, index) => {\n const rightQuestion = right[index];\n return (\n rightQuestion &&\n question.id === rightQuestion.id &&\n question.header === rightQuestion.header &&\n question.question === rightQuestion.question &&\n question.multiSelect === rightQuestion.multiSelect &&\n messageCenterAnswerEqual(\n question.answer ?? null,\n rightQuestion.answer ?? null\n ) &&\n question.options.length === rightQuestion.options.length &&\n question.options.every((option, optionIndex) => {\n const rightOption = rightQuestion.options[optionIndex];\n return (\n rightOption &&\n option.label === rightOption.label &&\n option.description === rightOption.description\n );\n })\n );\n });\n}\n\nfunction messageCenterAnswerEqual(\n left: string | string[] | null,\n right: string | string[] | null\n): boolean {\n if (left === right) {\n return true;\n }\n if (!Array.isArray(left) || !Array.isArray(right)) {\n return false;\n }\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n );\n}\n\nfunction messageCenterJsonValueEqual(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n if (\n !left ||\n !right ||\n typeof left !== \"object\" ||\n typeof right !== \"object\"\n ) {\n return false;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right)) {\n return false;\n }\n return (\n left.length === right.length &&\n left.every((value, index) =>\n messageCenterJsonValueEqual(value, right[index])\n )\n );\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord);\n if (leftKeys.length !== Object.keys(rightRecord).length) {\n return false;\n }\n return leftKeys.every((key) =>\n messageCenterJsonValueEqual(leftRecord[key], rightRecord[key])\n );\n}\n","export {\n selectWorkspaceAgentConsumerCounts,\n selectWorkspaceAgentConsumerSession,\n selectWorkspaceAgentConsumerSessions\n} from \"@tutti-os/agent-activity-core\";\nexport type {\n WorkspaceAgentConsumerCounts,\n WorkspaceAgentConsumerSession\n} from \"@tutti-os/agent-activity-core\";\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;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AClBP;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;;;ACRD,IAAM,qCAAqC,oBAAI,QAG7C;AAEK,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,QAAM,SAAS,mCAAmC,IAAI,OAAO;AAC7D,MACE,UACA,OAAO,SAAS,QAAQ,QACxB,OAAO,SAAS,QAAQ,QACxB,OAAO,WAAW,QAAQ,UAC1B,OAAO,YAAY,QAAQ,WAC3B,OAAO,YAAY,QAAQ,SAC3B;AACA,WAAO,OAAO;AAAA,EAChB;AACA,MACE,CAAC,mBAAmB,QAAQ,IAAI,KAChC,uBAAuB,QAAQ,IAAI,GACnC;AACA,uCAAmC,IAAI,SAAS;AAAA,MAC9C,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,SAAS;AAAA,MACT,SAAS,QAAQ;AAAA,IACnB,CAAC;AACD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,yBAAyB,OAAO;AAChD,qCAAmC,IAAI,SAAS;AAAA,IAC9C,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,SAAO;AACT;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;AAOA,SAAS,uBAAuB,MAAuB;AACrD,SAAO,KAAK,KAAK,EAAE,YAAY,MAAM;AACvC;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;;;ACviBA,IAAM,eAAkD;AAAA,EACtD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AACV;AAEO,SAAS,+CACd,aACA,kBACkC;AAClC,QAAM,QAAQ,YACX,OAAO,CAAC,SAAS,mBAAmB,MAAM,gBAAgB,CAAC,EAC3D,KAAK,YAAY;AACpB,SAAO;AAAA,IACL,cAAc,MAAM,OAAO,0BAA0B,EAAE;AAAA,IACvD;AAAA,IACA,QAAQ,WAAW,KAAK;AAAA,EAC1B;AACF;AAeO,SAAS,2BACd,MACS;AACT,SAAO,KAAK,kBAAkB,QAAQ,KAAK,uBAAuB;AACpE;AAEO,SAAS,+BACd,MACS;AACT,SAAO,KAAK,kBAAkB;AAChC;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,mBACP,MACA,cACS;AACT,MAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO;AAC3C,MAAI,2BAA2B,IAAI,EAAG,QAAO;AAC7C,QAAM,YAAY,KAAK,kBAAkB,KAAK,4BAA4B;AAC1E,SAAO,aAAa,OAAO,YAAY;AACzC;AAEA,SAAS,WACP,OACmC;AACnC,SAAO,MAAM;AAAA,IACX,CAAC,QAAQ,SAAS;AAChB,aAAO,OAAO;AACd,UAAI,2BAA2B,IAAI,GAAG;AACpC,eAAO,WAAW;AAAA,MACpB,WAAW,6BAA6B,IAAI,GAAG;AAC7C,eAAO,aAAa;AAAA,MACtB,WAAW,KAAK,WAAW,WAAW;AACpC,eAAO,WAAW;AAAA,MACpB,WAAW,KAAK,WAAW,UAAU;AACnC,eAAO,UAAU;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,GAAG,aAAa;AAAA,EACpB;AACF;AAEA,SAAS,aACP,MACA,OACQ;AACR,QAAM,cAAc,2BAA2B,IAAI;AACnD,QAAM,eAAe,2BAA2B,KAAK;AACrD,MAAI,gBAAgB,aAAc,QAAO,cAAc,KAAK;AAC5D,SACE,MAAM,iBAAiB,KAAK,kBAC5B,KAAK,eAAe,cAAc,MAAM,cAAc;AAE1D;;;ACcO,SAAS,qCAAqC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AACb,GAA+E;AAC7E,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,QAAM,mBAAmB,gBAAgB;AACzC,QAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,QAAM,SAAS,uCAAuC;AAAA,IACpD,eAAe;AAAA,IACf,oBAAoB,gBAAgB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,oBAAoB;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO;AAAA,IACL,IAAI,kBAAkB,QAAQ,cAAc;AAAA,IAC5C,gBAAgB,QAAQ;AAAA,IACxB,eAAe,QAAQ,eAAe,KAAK,KAAK;AAAA,IAChD,WAAW,mBAAmB,QAAQ;AAAA,IACtC,gBAAgB,mBAAmB,WAAW;AAAA,IAC9C,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ,QAAQ,KAAK,KAAK;AAAA,IAClC;AAAA,IACA,GAAI,+BAA+B,OAAO,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IACpE,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA,KAAK,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,IACA,yBACE,kBAAkB,WAAW,gBAAgB,WAAW;AAAA,IAC1D,0BAA0B,kBAAkB,oBAAoB;AAAA,IAChE;AAAA,IACA;AAAA,IACA,oBAAoB,gBAAgB,QAAQ;AAAA,IAC5C,uBAAuB,gBAAgB,WAAW;AAAA,IAClD;AAAA,IACA,gBAAgB,2CAA2C;AAAA,MACzD,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sCACP,eACA,eAGiD;AACjD,QAAM,WAAW,eAAe,KAAK,KAAK;AAC1C,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,eAAe,eAAe;AAAA,IAClC,CAAC,cAAc,UAAU,cAAc,KAAK,MAAM;AAAA,EACpD;AACA,QAAM,OAAO,cAAc,KAAK,KAAK,KAAK;AAC1C,MAAI,CAAC,gBAAgB,CAAC,MAAM;AAC1B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,aAAa,SAAS,KAAK,KAAK;AAAA,IACzC;AAAA,EACF;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,cAAc,WAAW,QAAQ,aAAa;AACvD;AAmBA,SAAS,oCACP,gBACA,UACqC;AACrC,MAAI,qBACF;AACF,MAAI,2BACF;AACF,MAAI,sBAAqD;AACzD,MAAI,gBAA6C;AAEjD,aAAW,WAAW,UAAU;AAC9B,QACEC,oBAAmB,QAAQ,IAAI,KAC/B,CAACC,wBAAuB,QAAQ,IAAI,GACpC;AACA,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,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,QAAM,kBAAkB;AAAA,IACtB,QAAQ;AAAA,EACV;AACA,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,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,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,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,CAACL,oBAAmB,QAAQ,IAAI,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,UAAUE,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,SAASH,oBAAmB,MAAuB;AACjD,QAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,SAAO,eAAe,eAAe,eAAe;AACtD;AAWA,SAASC,wBAAuB,MAAuB;AACrD,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;;;ACnqBA;AAAA,EACE,aAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAGK;AACP,SAAS,MAAAC,WAAU;;;ACRnB;AAAA,EACE;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,OAMK;AACP,SAAS,aAAa,iBAAiB;AACvC,SAAS,UAAAC,SAAQ,MAAAC,KAAI,iBAAiB;;;ACdtC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP,SAAS,cAAc,YAAY;AACnC;AAAA,EACE;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA6BD,gBAAAC,MAQE,YARF;AAnBC,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOgB;AACd;AAEA,SACE,qBAAC,SAAI,WAAU,0FACb;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,gBAAgB,KAAK;AAAA,QACrB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf;AAAA;AAAA,IACF;AAAA,IACA,qBAAC,UAAK,WAAU,2CACb;AAAA;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAWC;AAAA,YACT;AAAA,YACA,CAAC,iBACC;AAAA,UACJ;AAAA,UACA,SAAS,MACP,WAAW;AAAA,YACT,gBAAgB,KAAK;AAAA,YACrB,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,UAGH;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,aAAa;AAAA,gBACb,eAAY;AAAA;AAAA,YACd;AAAA,YACC;AAAA;AAAA;AAAA,MACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKgB;AACd;AAEA,MAAI,CAAC,UAAU;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,yBACJ,SAAS,gBAAgB,KAAK,KAC9B,gBAAgB,KAAK,KACrB,2BAA2B,QAAQ;AACrC,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,gBAAgB;AAAA;AAAA,QAClB;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;AAAA,EACA;AACF,GAKgB;AACd;AAEA,QAAM,WAAW,UAAU,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK;AAChE,MAAI,CAAC,UAAU;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,gBAAgB,KAAK,KAAK,2BAA2B,QAAQ;AAAA,QAClE,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,KAC/B,gBAAgB,KAAK,KACrB,2BAA2B,QAAQ;AAAA;AAAA,EAEvC;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;AAEO,SAAS,gBAAgB,EAAE,KAAK,GAAkC;AACvE;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;AASO,SAAS,yBAAyB;AAAA,EACvC;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;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAIgB;AACd;AACA,QAAM,QAAQ,WAAW,KAAK,KAAK,4BAA4B,QAAQ;AAEvE,SACE,qBAAC,UAAK,WAAU,gGACd;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,gBAAgB,KAAK,KAAK,2BAA2B,QAAQ;AAAA,QAClE,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;AAEO,SAAS,YAAY,MAA+C;AACzE,MAAI,2BAA2B,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,KAAK;AACd;AASO,SAAS,wBACd,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;;;AC1YA,SAAS,iBAAiB;AAC1B;AAAA,EACE,yBAAAE;AAAA,EACA,4BAAAC;AAAA,OACK;;;ACHP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,IAAM,wBAAwB;AAC9B,IAAM,gCAAgC;AACtC,IAAM,6CAAyE;AAAA,EAC7E,SAAS;AAAA,EACT,IAAI;AACN;AACA,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,SAAS,8BACd,OACA,UAAgD,CAAC,GACzC;AACR,QAAM,UAAU,OAAO,KAAK,KAAK;AACjC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,8BAA8B;AAAA,IAClC,QAAQ;AAAA,EACV;AAEA,QAAM,gCAAgC,QAAQ;AAAA,IAC5C;AAAA,IACA,CAAC,WAAW,UAAkB,SAAiB;AAC7C,YAAM,QAAQ,sBAAsB,QAAQ;AAC5C,YAAM,UAAU,yBAAyB,MAAM,KAAK;AACpD,UAAI,CAAC,SAAS;AACZ,eAAO,sBAAsB,IAAI,IAAI,QAAQ;AAAA,MAC/C;AACA,YAAM,aAAa,QAAQ,WAAW,KAAK,EAAE,YAAY;AACzD,YAAM,eAAe,SAAS,QAAQ;AACtC,UAAI,eAAe,iBAAiB;AAClC,eAAO,mBAAmB,cAAc,2BAA2B;AAAA,MACrE;AACA,UAAI,eAAe,mBAAmB;AACpC,eAAO,iBAAiB,YAAY;AAAA,MACtC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,aAAa,wBAAwB,6BAA6B;AACxE,MAAI,0BAA0B,YAAY,2BAA2B,GAAG;AACtE,WAAO,mBAAmB,YAAY,2BAA2B;AAAA,EACnE;AACA,SAAO;AACT;AAEA,SAAS,0BACP,OACA,6BACS;AACT,QAAM,UAAU,MAAM,KAAK;AAC3B,MACE,CAAC,QAAQ,WAAW,GAAG,KACvB,QAAQ,WAAW,2BAA2B,GAC9C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,2BAA2B,KAAK,CAAC,eAAe;AACrD,UAAM,qBAAqB,MAAM,UAAU;AAC3C,UAAM,iBAAiB,QAAQ,QAAQ,kBAAkB;AACzD,QAAI,iBAAiB,GAAG;AACtB,YAAM,WAAW,QAAQ;AAAA,QACvB,iBAAiB,mBAAmB;AAAA,MACtC;AACA,UAAI,aAAa,MAAM,SAAS,WAAW,GAAG,GAAG;AAC/C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,kBAAkB,SAAM,UAAU;AACxC,WAAO,QAAQ,QAAQ,eAAe,IAAI;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,uCACP,UACQ;AACR,SAAO,2CAA2C,YAAY,IAAI;AACpE;AAEA,SAAS,mBACP,OACA,6BACQ;AACR,QAAM,kBAAkB,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC7D,SAAO,kBACH,GAAG,2BAA2B,GAAG,eAAe,KAChD,MAAM,KAAK;AACjB;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,kBAAkB,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC7D,SAAO,kBAAkB,cAAW,eAAe,KAAK,MAAM,KAAK;AACrE;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,MAAM,QAAQ,+BAA+B,IAAI;AAC1D;;;AD3CU,gBAAAC,MA6CN,QAAAC,aA7CM;AA9DV,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,UAAUC,0BAAyB,MAAM,KAAK;AACpD,QAAI,CAAC,SAAS;AACZ,YAAM,KAAKC,uBAAsB,IAAI,IAAI,QAAQ,SAAS;AAAA,IAC5D,OAAO;AACL,YAAM,OAAO,gCAAgC,QAAQ,UAAU;AAC/D,YAAM,eAAe,SAAS,QAAQ;AACtC,YAAM;AAAA,QACJ,OACE,gBAAAH;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,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,2BAAyB;AAAA,MAEzB;AAAA,wBAAAD,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,wBAAwB,EAAE,iDAAiD;AAAA,MACzE,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;;;AF7GU,SAOI,OAAAI,MAPJ,QAAAC,aAAA;AAlDV,SAAS,wCACP,OACM;AACN,QAAM,gBAAgB;AACxB;AAEO,IAAM,kCAAkC;AAAA,EAC7C,SAASC,iCAAgC;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsD;AACpD;AACA,UAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,UAAM,SAAS,KAAK;AACpB,UAAM,eAAe,KAAK,MAAM,KAAK;AACrC,UAAM,UAAU,4BAA4B,IAAI;AAChD,UAAM,gBAAgB,YAAY,IAAI;AACtC,UAAM,aAAa,wBAAwB,IAAI;AAC/C,UAAM,cAAc,kCAAkC,eAAe,CAAC;AAEtE,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAWE;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,0BAAAF,MAAC,SAAI,WAAU,qDACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,qCACb;AAAA,8BAAAD;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,gBAAAC,MAAC,UAAK,WAAU,oCACb;AAAA;AAAA,cACD,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAWE;AAAA,oBACT;AAAA,oBACA,6BAA6B,UAAU;AAAA,kBACzC;AAAA,kBACA,eAAa;AAAA,kBACb,OAAO;AAAA,kBAEP;AAAA,oCAAAH;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAM;AAAA,wBACN,OACE,2BAA2B,IAAI,KAAK,KAAK,WAAW;AAAA,wBAEtD,MAAK;AAAA,wBACL,OAAO;AAAA;AAAA,oBACT;AAAA,oBACA,gBAAAA,KAAC,UAAM,uBAAY;AAAA;AAAA;AAAA,cACrB;AAAA,eACF;AAAA,aACF;AAAA,UAEC,YAAY,yBAAyB,CAAC,UAAU,CAAC,eAChD,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,YAAY,EAAE,gDAAgD;AAAA;AAAA,UAChE,IACE;AAAA,UAEH;AAAA,UAEA,UAAU,cACT,gBAAAA,KAAC,SAAI,WAAU,WACb,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,UAAQ;AAAA,cACR,SAAS;AAAA,cACT,mBAAmB;AAAA,cACnB;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,QAAQ;AAAA,gBACN;AAAA,gBACA,KAAK;AAAA,cACP;AAAA;AAAA,UACF,GACF,IACE;AAAA,UAEH;AAAA,UAED,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,UAAU,KAAK;AAAA,cACf;AAAA,cACA,OAAO,EAAE,+CAA+C;AAAA,cACxD;AAAA,cAGA,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,IAAII,UAAS,OAAO;AAC9C,QAAM,UAAU,WAAW,CAAC;AAE5B,kBAAgB,MAAM;AACpB,QAAI,SAAS;AACX,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,EAAAC,WAAU,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,iBAAiBC;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,SAASC,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,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,WAAWE,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,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,WAAWG;AAAA,gBACT;AAAA,gBACA,cAAc,UACV,wDACA;AAAA,cACN;AAAA,cACA,gBAAgB,cAAc;AAAA,cAE9B,0BAAAH;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,WAAWG;AAAA,gBACT;AAAA,gBACA,YAAY,UACR,wDACA;AAAA,cACN;AAAA,cACA,gBAAgB,YAAY;AAAA,cAE5B,0BAAAF;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAa,YAAY,UAAU,OAAO;AAAA,kBAC1C,OAAO,YAAY,UAAU,OAAO;AAAA,kBAEpC;AAAA,oCAAAA,MAAC,SAAI,WAAU,iEACb;AAAA,sCAAAA,MAAC,UAAK,WAAU,qGACd;AAAA,wCAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,gBAAgB,MAAM,CAAC,GAAG;AAAA,4BAC1B,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,4BAACQ;AAAA,4BAAA;AAAA,8BACC,MAAK;AAAA,8BACL,SAAQ;AAAA,8BACR,MAAK;AAAA,8BACL,cAAY;AAAA,8BACZ,WAAU;AAAA,8BACV,SAAS,MAAM,WAAW,OAAO;AAAA,8BAEjC,0BAAAR,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,IAAII,UAAS,YAAY;AAE3D,EAAAC,WAAU,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,EAAAA,WAAU,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,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,EAAE,wDAAwD;AAAA,QACpE,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,MACD,WAAWG;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,0BAAAF;AAAA,QAAC;AAAA;AAAA,UACC,WAAWE;AAAA,YACT;AAAA,YACA,MAAM,SAAS,IACX,mJACA;AAAA,YACJ,cACE;AAAA,UACJ;AAAA,UAEA;AAAA,4BAAAF,MAAC,UAAK,WAAU,qDACd;AAAA,8BAAAA,MAAC,UAAK,WAAU,mCACd;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAgB,UAAU;AAAA,oBAC1B,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,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;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMgB;AACd;AACA,QAAM,aAAa,OAA8B,IAAI;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAII,UAAS,KAAK;AACxD,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACA,EAAAC,WAAU,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,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAWG;AAAA,QACT;AAAA,QACA,iBAAiB;AAAA,MACnB;AAAA,MACA,mBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,oBAAmB;AAAA,MACnB,SAAS;AAAA,MAER,qBAAW,0BACV,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV;AAAA,UACA,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,IAAII,UAAS,CAAC,IAAI;AAExC,EAAAC,WAAU,MAAM;AACd,aAAS,CAAC,IAAI;AAAA,EAChB,GAAG,CAAC,IAAI,CAAC;AAET,EAAAA,WAAU,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,IAAID,UAAS,KAAK;AAExC,EAAAC,WAAU,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;;;ADnlBM,gBAAAC,MACE,QAAAC,aADF;AApIN,IAAM,gBAAgB;AACtB,IAAM,4BAA4B;AAClC,IAAM,mCAAmC;AAqClC,SAAS,yCAAyC;AAAA,EACvD;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;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,kBAAkB,mBAAmB,OAAO;AAElD,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,kBAEC,uBACC,WAAW;AAAA,oBACT,aAAa;AAAA,oBACb,aAAa;AAAA,oBACb,cAAc;AAAA,oBACd,MAAM;AAAA,oBACN,gBAAgB,MAAM;AAAA,oBAAC;AAAA,kBACzB,CAAC,IAED,gBAAAA;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,gBA5BG,WAAW,YAAY,cAAc;AAAA,cA8B5C,IACE;AAAA,cACJ,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAWK;AAAA,oBACT;AAAA,oBACA,YAAY,IACR,mJACA,YAAY,KACV;AAAA,kBACR;AAAA,kBAEC,uBACC,WAAW;AAAA,oBACT,SAAS,eACL,CAAC,SAAS,aAAa,QAAQ,IAAI,IAAI,IACvC;AAAA,oBACJ,aAAa,QAAQ,OAAO;AAAA,oBAC5B,aAAa;AAAA,oBACb,cAAc,mBAAmB;AAAA,oBACjC,MAAM;AAAA,oBACN,gBAAgB,CAAC,UAAU,eAAe,SAAS,KAAK;AAAA,kBAC1D,CAAC,IAED,gBAAAL;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,gBAlCG,QAAQ;AAAA,cAoCf;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;;;AK5PA,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,IAA8C;AACjE,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,OAAO,IAAI,KAAK,QAAQ;AACxC,WAAO,IAAI,KAAK,UAAU;AAAA,MACxB,QAAQ,SAAS,SAAS,KAAK;AAAA,MAC/B,OACE,SAAS,SACT,KAAK,WAAW,KAAK,KACrB,4BAA4B,KAAK,QAAQ;AAAA,IAC7C,CAAC;AAAA,EACH;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,IAAI,CAAC,CAAC,OAAO,MAAM,OAAO;AAAA,IACzB,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd;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,KAAK,WAAW,KAAK,KAAK,4BAA4B,KAAK,QAAQ;AAC5E;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;;;AD5XQ,SAwFE,UArEA,OAAAC,MAnBF,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,QACA,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,gBAAM,gBAAgB;AAAA,QACxB;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,QAC3C,SAAS,CAAC,UAAU;AAClB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,kBAAkB,CAAC,UAAU;AAC3B,gBAAM,eAAe;AAAA,QACvB;AAAA,QACA,WAAW,CAAC,UAAU;AACpB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,eAAe,CAAC,UAAU;AACxB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QAEA;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;;;AEnMA,SAAS,MAAAI,KAAI,aAAAC,kBAAiB;AA0BpB,gBAAAC,MAOA,QAAAC,aAPA;AAjBH,SAAS,0BAA0B;AAAA,EACxC;AACF,GAEsB;AACpB;AACA,QAAM,eAAe,+BAA+B,MAAM,EAAE;AAC5D,QAAM,YAAY,MAAM,MAAM,CAAC;AAE/B,MAAI,MAAM,UAAU;AAClB,WACE,gBAAAA;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,gBAAgB,WAAW;AAAA,cAC3B,WAAW,WAAW;AAAA,cACtB,UAAU,MAAM;AAAA,cAChB,UAAU,MAAM;AAAA;AAAA,UAClB,IAEA,gBAAAC,MAAC,UAAK,WAAU,4CACd;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAgB,WAAW;AAAA,gBAC3B,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,WAAWC;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,gBAAAF;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,MAAM,aAAa;AAAA,YACnB,OAAO,aAAa;AAAA,YACpB,MAAK;AAAA,YACL,OAAO,MAAM;AAAA;AAAA,QACf,IACE;AAAA,QACJ,gBAAAF,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;;;ACtFO,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;;;AbaQ,gBAAAG,MAkZI,QAAAC,aAlZJ;AAhER,IAAM,kCAAkC;AACxC,IAAM,2CAA2C;AAwC1C,IAAM,mCAAmCC;AAAA,EAC9C,SAASC,kCAAiC;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,MAAM;AAAA,IACrB;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,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,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,MAAM;AAAA,EACrB;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,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,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,MACF;AACA,UAAI,oBAAoB;AACtB,iCAAyB;AAAA,UACvB,QAAQ;AAAA,UACR,UAAU,KAAK;AAAA,QACjB,CAAC;AAAA,MACH;AACA,YAAM,eAAe;AAAA,QACnB,GAAG;AAAA,QACH,gBACE,KAAK,0BAA0B,kBAAkB,KAAK;AAAA,QACxD,GAAI,KAAK,2BACL,EAAE,QAAQ,KAAK,yBAAyB,OAAO,IAC/C,CAAC;AAAA,QACL,YAAY,KAAK,eAAe;AAAA,MAClC,CAAC;AAAA,IACH;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,aAAa,IAAI,MAAM,gBACvB,aAAa,IAAI,MAAM;AAAA,UAEzB,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,QAAM,gBACJ,gBAAAC,MAAC,mBAAgB,eAAe,iCAC9B;AAAA,oBAAAD,KAAC,SAAI,WAAU,gEACb,0BAAAC,MAAC,SAAI,WAAU,mDACZ;AAAA,uBAAiB,WAChB,gBAAAA,MAAC,SAAI,WAAU,WACb;AAAA,wBAAAD,KAAC,eAAY,WAAU,2EACpB,YAAE,4CAA4C,GACjD;AAAA,QACA,gBAAAA,KAAC,qBAAkB,WAAU,8DAC1B,yBACH;AAAA,SACF,IAEA,gBAAAA,KAAC,OAAE,WAAU,sEACV,yBACH;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,kBAAkB;AAAA,UAClB,gBAAgB;AAAA;AAAA,MAClB;AAAA,OACF,GACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,mBAAkB;AAAA,QAClB,oBAAmB;AAAA,QACnB,SAAS;AAAA,QAER,oBAAU,SAAS,KAAK,UAAU,SAAS,IAC1C,gBAAAC,MAAC,SAAI,WAAU,sCACZ;AAAA,oBAAU,SAAS,IAClB,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP;AAAA,cACA,oBAAoB,CAAC,SACnB,aAAa,IAAI,MAAM,gBACvB,aAAa,IAAI,MAAM;AAAA,cAEzB,cAAc;AAAA,cACd;AAAA,cACA;AAAA,cACA,gBAAgB,CAAC,MAAM,UAAU,KAAK,aAAa,MAAM,KAAK;AAAA;AAAA,UAChE,IACE;AAAA,UACH,gBAAgB,IAAI,CAAC,UACpB,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,cAAY,GAAG,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM;AAAA,cAEhD;AAAA,gCAAAD,KAAC,SAAI,WAAU,0DACb,0BAAAA,KAAC,6BAA0B,OAAc,GAC3C;AAAA,iBACE,MAAM;AACN,yBAAO,MAAM,OAAO,IAAI,CAAC,UAAU;AACjC,0BAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,wBAAI,CAAC,WAAW;AACd,6BAAO;AAAA,oBACT;AACA,wBAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,6BAAO,wBAAwB,SAAS;AAAA,oBAC1C;AACA,0BAAM,UAAU;AAAA,sBACd,MAAM;AAAA,sBACN,MAAM;AAAA,oBACR;AACA,2BACE,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEC,UAAU,iBAAiB,IAAI,OAAO;AAAA,wBACtC,SAAS;AAAA,wBACT;AAAA,wBACA,OAAO,MAAM;AAAA,wBACb,YAAY;AAAA,wBACZ,YAAY;AAAA,wBACZ,UAAU;AAAA;AAAA,sBAPL;AAAA,oBAQP;AAAA,kBAEJ,CAAC;AAAA,gBACH,GAAG;AAAA;AAAA;AAAA,YAjCE,MAAM;AAAA,UAkCb,CACD;AAAA,WACH,IACE,MAAM,MAAM,SAAS,IACvB,gBAAAC,MAAC,SAAI,WAAU,kIACb;AAAA,0BAAAD,KAAC,UACE,YAAE,oDAAoD,GACzD;AAAA,UACA,gBAAAA;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAER,YAAE,mDAAmD;AAAA;AAAA,UACxD;AAAA,WACF,IAEA,gBAAAV,KAAC,SAAI,WAAU,iHACZ,YAAE,4CAA4C,GACjD;AAAA;AAAA,IAEJ;AAAA,KACF;AAGF,MAAI,iBAAiB,YAAY;AAC/B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,EAAE,4CAA4C;AAAA,QAC1D,WAAU;AAAA,QACV,qBAAkB;AAAA,QAClB,eAAY;AAAA,QAEX;AAAA;AAAA,IACH;AAAA,EAEJ;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,WAAWW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,qBAAkB;AAAA,UAClB,eAAY;AAAA,UACZ,iBAAiB,mBAAmB;AAAA,UACpC,aAAa;AAAA,UACb,cAAY,EAAE,4CAA4C;AAAA,UAEzD;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,IAAM,4BAA4BT,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;;;ActtBD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACCA,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,gBACA,qCAAqC,cAAc,QAAQ,IACvD,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;AAEO,SAAS,qCACd,MACA,OACS;AACT,SACE,KAAK,OAAO,MAAM,MAClB,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,cAAc,MAAM,aACzB,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;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,EACR,KACA,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,oCACP,MACA,OACS;AACT,SACE,SAAS,SACR,SAAS,QACR,UAAU,QACV,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,WAAW,MAAM,UACtB,KAAK,cAAc,MAAM;AAE/B;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,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aACE,MAAM,SAAS,cACf,KAAK,OAAO,MAAM,MAClB,KAAK,WAAW,MAAM,UACtB,KAAK,cAAc,MAAM,aACzB,KAAK,WAAW,MAAM,UACtB,KAAK,UAAU,MAAM,SACrB,KAAK,aAAa,MAAM,YACxB,KAAK,WAAW,MAAM,UACtB,KAAK,qBAAqB,MAAM,oBAChC,4BAA4B,KAAK,OAAO,MAAM,KAAK,KACnD;AAAA,QACE,KAAK,UAAU;AAAA,QACf,MAAM,UAAU;AAAA,MAClB,KACA,kCAAkC,KAAK,SAAS,MAAM,OAAO;AAAA,IAEjE,KAAK;AACH,aACE,MAAM,SAAS,cACf,KAAK,cAAc,MAAM,aACzB,KAAK,UAAU,MAAM,SACrB,mCAAmC,KAAK,WAAW,MAAM,SAAS;AAAA,IAEtE,KAAK;AACH,aACE,MAAM,SAAS,eACf,KAAK,cAAc,MAAM,aACzB,KAAK,UAAU,MAAM,SACrB,KAAK,yBAAyB,MAAM,wBACpC,kCAAkC,KAAK,SAAS,MAAM,OAAO;AAAA,IAEjE,KAAK;AACH,aACE,MAAM,SAAS,yBACf,KAAK,cAAc,MAAM,aACzB,KAAK,UAAU,MAAM;AAAA,EAE3B;AACF;AAEA,SAAS,kCACP,MAMA,OAMS;AACT,MAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,CAAC,QAAQ,UAAU;AACnC,UAAM,cAAc,MAAM,KAAK;AAC/B,WACE,eACA,OAAO,OAAO,YAAY,MAC1B,OAAO,UAAU,YAAY,SAC7B,OAAO,SAAS,YAAY,QAC5B,OAAO,gBAAgB,YAAY;AAAA,EAEvC,CAAC;AACH;AAEA,SAAS,mCACP,MACA,OACS;AACT,MAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,CAAC,UAAU,UAAU;AACrC,UAAM,gBAAgB,MAAM,KAAK;AACjC,WACE,iBACA,SAAS,OAAO,cAAc,MAC9B,SAAS,WAAW,cAAc,UAClC,SAAS,aAAa,cAAc,YACpC,SAAS,gBAAgB,cAAc,eACvC;AAAA,MACE,SAAS,UAAU;AAAA,MACnB,cAAc,UAAU;AAAA,IAC1B,KACA,SAAS,QAAQ,WAAW,cAAc,QAAQ,UAClD,SAAS,QAAQ,MAAM,CAAC,QAAQ,gBAAgB;AAC9C,YAAM,cAAc,cAAc,QAAQ,WAAW;AACrD,aACE,eACA,OAAO,UAAU,YAAY,SAC7B,OAAO,gBAAgB,YAAY;AAAA,IAEvC,CAAC;AAAA,EAEL,CAAC;AACH;AAEA,SAAS,yBACP,MACA,OACS;AACT,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AACA,SACE,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK,CAAC;AAEvD;AAEA,SAAS,4BAA4B,MAAe,OAAyB;AAC3E,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,MACE,CAAC,QACD,CAAC,SACD,OAAO,SAAS,YAChB,OAAO,UAAU,UACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;AAC/C,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,QAAQ,KAAK,GAAG;AACjD,aAAO;AAAA,IACT;AACA,WACE,KAAK,WAAW,MAAM,UACtB,KAAK;AAAA,MAAM,CAAC,OAAO,UACjB,4BAA4B,OAAO,MAAM,KAAK,CAAC;AAAA,IACjD;AAAA,EAEJ;AACA,QAAM,aAAa;AACnB,QAAM,cAAc;AACpB,QAAM,WAAW,OAAO,KAAK,UAAU;AACvC,MAAI,SAAS,WAAW,OAAO,KAAK,WAAW,EAAE,QAAQ;AACvD,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAAA,IAAM,CAAC,QACrB,4BAA4B,WAAW,GAAG,GAAG,YAAY,GAAG,CAAC;AAAA,EAC/D;AACF;;;ADhSO,SAAS,gDACd,cACA,UACA,UAAmD,CAAC,GAClB;AAClC,QAAM,QAAQ,aAAa,UACxB,OAAO,CAAC,aAAa,SAAS,QAAQ,YAAY,KAAK,EACvD,IAAI,CAAC,aAAa;AACjB,UAAM,cAAc,yBAAyB,QAAQ;AACrD,UAAM,iBAAiB,cACnB,8BAA8B,UAAU,WAAW,IACnD;AACJ,WAAO,qCAAqC;AAAA,MAC1C,SAAS,SAAS;AAAA,MAClB,YAAY,SAAS;AAAA,MACrB,UAAU,gBAAgB,SAAS,qBAAqB,QAAQ;AAAA,MAChE,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA,0BAA0B,cACtB,kBAAkB,WAAW,IAC7B;AAAA,MACJ,eAAe,cAAc,sBAAsB,WAAW,IAAI;AAAA,MAClE,mBAAmB,YAAY,QAAQ;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAUO,SAAS,8CACd,OACyC;AACzC,QAAM,YAAY,6CAA6C,KAAK;AACpE,QAAM,oBAGF,CAAC;AACL,QAAM,wBAA8C,CAAC;AACrD,aAAW,YAAY,WAAW;AAChC,UAAM,YAAY,SAAS,QAAQ;AACnC,eAAW,eAAe,SAAS,qBAAqB;AACtD,YAAM,WAAW;AAAA,QACf;AAAA,QACA,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AACA,UAAI,UAAU;AACZ,0BACE;AAAA,UACE,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,QACd,CACF,IAAI,SAAS;AAAA,MACf;AAAA,IACF;AACA,UAAM,SAAS,SAAS,YAAY,UAAU;AAC9C,QAAI,CAAC,OAAQ;AACb,QAAI,wBAAwB,OAAO,WAAW,MAAM,GAAG;AACrD,4BAAsB,gBAAgB,WAAW,QAAQ,MAAM,CAAC,IAAI;AAAA,IACtE;AACA,UAAM,WAAW,0BAA0B,OAAO,WAAW,MAAM;AACnE,QAAI,UAAU;AACZ,wBAAkB,gBAAgB,WAAW,QAAQ,MAAM,CAAC,IAC1D,SAAS,WAAW,cAAc,eAAe,SAAS;AAC5D;AAAA,IACF;AACA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AACV,UAAM,SAAS,+BAA+B,OAAO,SAAS,EAAE;AAAA,MAC9D,CAAC,WAAW,OAAO,eAAe,WAAW,cAAc;AAAA,IAC7D;AACA,QAAI,QAAQ;AACV,wBAAkB,gBAAgB,WAAW,QAAQ,MAAM,CAAC,IAC1D,OAAO,WAAW,WACd,WACA,OAAO,WAAW,cAChB,YACA;AAAA,IACV;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,6CACd,MACA,OACS;AACT,SACE,iBAAiB,KAAK,uBAAuB,MAAM,qBAAqB,KACxE,sBAAsB,KAAK,mBAAmB,MAAM,iBAAiB,KACrE,KAAK,UAAU,WAAW,MAAM,UAAU,UAC1C,KAAK,UAAU,MAAM,CAAC,MAAM,UAAU;AACpC,UAAM,YAAY,MAAM,UAAU,KAAK;AACvC,WACE,cAAc,UACd,KAAK,YAAY,UAAU,WAC3B,KAAK,eAAe,UAAU,cAC9B,KAAK,eAAe,UAAU,cAC9B,KAAK,kBAAkB,UAAU,iBACjC,KAAK,oBAAoB,WACvB,UAAU,oBAAoB,UAChC,KAAK,oBAAoB;AAAA,MACvB,CAAC,aAAa,qBACZ,gBAAgB,UAAU,oBAAoB,gBAAgB;AAAA,IAClE;AAAA,EAEJ,CAAC;AAEL;AA8BO,SAAS,mCACd,cACA,UACA,UAAmD,CAAC,GACrB;AAC/B,QAAM,SAAwC,CAAC;AAC/C,aAAW,YAAY,aAAa,WAAW;AAC7C,QACE,SAAS,QAAQ,YAAY,SAC7B,SAAS,QAAQ,gBAAgB,SAAS,aAC1C;AACA;AAAA,IACF;AACA,UAAM,WAAW,gBAAgB,SAAS,qBAAqB,QAAQ;AACvE,eAAW,eAAe,SAAS,qBAAqB;AACtD,YAAMa,UAAS,sBAAsB,WAAW;AAChD,UAAI,CAACA,QAAQ;AACb,YAAMC,UAAwC;AAAA,QAC5C,MAAM;AAAA,QACN,aAAa,SAAS,QAAQ;AAAA,QAC9B,gBAAgB,YAAY;AAAA,QAC5B,QAAQ,YAAY;AAAA,QACpB,WAAW,YAAY;AAAA,MACzB;AACA,YAAMC,QAAO,qCAAqC;AAAA,QAChD,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,QAAQ;AAAA,QACR,gBAAgB,8BAA8B,UAAU,WAAW;AAAA,QACnE,0BAA0B,kBAAkB,WAAW;AAAA,QACvD,eAAeF;AAAA,QACf,mBAAmB;AAAA,QACnB;AAAA,MACF,CAAC;AACD,MAAAE,MAAK,KAAK,2BAA2BD,OAAM;AAC3C,MAAAC,MAAK,iBAAiB,YAAY;AAClC,aAAO,KAAK;AAAA,QACV,MAAAA;AAAA,QACA,QACE,aAAa,kBACX;AAAA,UACE,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,QACd,CACF,KAAK;AAAA,QACP,QAAAD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,SAAS;AAC5B,QACE,YAAY,UAAU,aACtB,WAAW,YAAY,eACvB,SAAS,QAAQ,cAAc,uBAAuB,QACtD,SAAS,QAAQ,aAAa,aAAa,QAC3C,iBAAiB,QAAQ,MAAM,WAAW,QAC1C;AACA;AAAA,IACF;AACA,UAAM,SAAwC;AAAA,MAC5C,MAAM;AAAA,MACN,aAAa,SAAS,QAAQ;AAAA,MAC9B,gBAAgB,SAAS,QAAQ;AAAA,MACjC,QAAQ,WAAW;AAAA,MACnB,WAAW,WAAW;AAAA,IACxB;AACA,UAAM,YAAY;AAAA,MAChB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,QAAI,aAAa,sBAAsB,SAAS,EAAG;AACnD,UAAM,SAAS;AAAA,MACb,WAAW;AAAA,MACX,SAAS,QAAQ;AAAA,IACnB;AACA,UAAM,iBAAkD;AAAA,MACtD,IAAI,uBAAuB,WAAW,MAAM;AAAA,MAC5C,aAAa,SAAS,QAAQ;AAAA,MAC9B,gBAAgB,SAAS,QAAQ;AAAA,MACjC,UAAU,SAAS,QAAQ;AAAA,MAC3B,OAAO,OAAO;AAAA,MACd,KAAK,SAAS,QAAQ;AAAA,MACtB,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,kBAAkB,WAAW,mBAAmB,WAAW;AAAA,IAC7D;AACA,UAAM,OAAO,qCAAqC;AAAA,MAChD,SAAS,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,0BAA0B;AAAA,MAC1B,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB;AAAA,IACF,CAAC;AACD,SAAK,KAAK,2BAA2B,MAAM;AAC3C,SAAK,iBAAiB,eAAe;AACrC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ,aAAa,kBAAkB,SAAS,KAAK;AAAA,MACrD;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,kCACd,MACA,OACS;AACT,SACE,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,OAAO,UAAU;AAC3B,UAAM,YAAY,MAAM,KAAK;AAC7B,WACE,cAAc,UACd,MAAM,WAAW,UAAU,UAC3B,mCAAmC,MAAM,QAAQ,UAAU,MAAM,KACjE,qCAAqC,MAAM,MAAM,UAAU,IAAI;AAAA,EAEnE,CAAC;AAEL;AAEA,SAAS,2BAA2B,QAAuC;AACzE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,mCACP,MACA,OACS;AACT,SACE,KAAK,SAAS,MAAM,QACpB,KAAK,gBAAgB,MAAM,eAC3B,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,WAAW,MAAM,UACtB,KAAK,cAAc,MAAM;AAE7B;AAQO,SAAS,wCACd,cACA,MAIyC;AACzC,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,KAAK;AACpB,SACE,aAAa,kBACX,SACI;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT,IACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CACN,KAAK;AAET;AAEA,SAAS,gBACP,gBACA,QACA,WACQ;AACR,SAAO,GAAG,cAAc,KAAK,MAAM,KAAK,SAAS;AACnD;AAEA,SAAS,sBACP,MACA,OACS;AACT,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,SACE,KAAK,WAAW,OAAO,KAAK,KAAK,EAAE,UACnC,KAAK,MAAM,CAAC,QAAQ,KAAK,GAAG,MAAM,MAAM,GAAG,CAAC;AAEhD;AAEA,SAAS,iBACP,MACA,OACS;AACT,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,SACE,KAAK,WAAW,OAAO,KAAK,KAAK,EAAE,UACnC,KAAK,MAAM,CAAC,QAAQ,MAAM,GAAG,MAAM,IAAI;AAE3C;AAEA,SAAS,gBACP,qBACA,UACiC;AACjC,aAAW,MAAM;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,EACnB,GAAG;AACD,UAAM,aAAa,IAAI,KAAK,KAAK;AACjC,QAAI,cAAc,oBAAoB,UAAU,GAAG;AACjD,aAAO,oBAAoB,UAAU;AAAA,IACvC;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,yBACP,UACiC;AACjC,SAAO,SAAS,oBAAoB,GAAG,EAAE,KAAK;AAChD;AAEA,SAAS,kBACP,aAC2F;AAC3F,SAAO;AAAA,IACL,gBAAgB,YAAY;AAAA,IAC5B,WAAW,YAAY;AAAA,IACvB,QAAQ,YAAY;AAAA,EACtB;AACF;AAEA,SAAS,8BACP,UACA,aACiC;AACjC,QAAM,UAAU,mBAAmB,WAAW;AAC9C,SAAO;AAAA,IACL,IAAI,eAAe,YAAY,SAAS;AAAA,IACxC,aAAa,SAAS,QAAQ;AAAA,IAC9B,gBAAgB,SAAS,QAAQ;AAAA,IACjC,UAAU,SAAS,QAAQ;AAAA,IAC3B,OAAO;AAAA,IACP,KAAK,SAAS,QAAQ;AAAA,IACtB,MACE,YAAY,SAAS,aACjB,eACA,YAAY,SAAS,aACnB,aACA;AAAA,IACR;AAAA,IACA,kBAAkB,YAAY;AAAA,EAChC;AACF;AAEA,SAAS,sBACP,aACkC;AAClC,QAAM,QAAQ,YAAY,SAAS,CAAC;AACpC,QAAM,sBAAsB,YAAY,YAAY,IACjD,QAAQ,YAAY,EAAE,EACtB,KAAK,EACL,YAAY;AACf,MACE,YAAY,SAAS,UACrB,uBAAuB,kBACvB,0BAA0B,KAAK,GAC/B;AACA,UAAM,uBAAuB,oCAAoC,KAAK;AACtE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,YAAY;AAAA,MACvB,OAAO,mBAAmB,WAAW;AAAA,MACrC,SAAS,2BAA2B,KAAK;AAAA,MACzC,GAAI,uBAAuB,EAAE,qBAAqB,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AACA,MAAI,YAAY,SAAS,YAAY;AACnC,UAAM,YAAY,0BAA0B,MAAM,SAAS;AAC3D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,YAAY;AAAA,MACvB,OAAO,mBAAmB,WAAW;AAAA,MACrC,WACE,UAAU,SAAS,IACf,YACA;AAAA,QACE;AAAA,UACE,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,UAAU,mBAAmB,WAAW;AAAA,UACxC,SAAS,CAAC;AAAA,UACV,aAAa;AAAA,UACb,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACR;AAAA,EACF;AACA,MAAI,YAAY,SAAS,YAAY;AACnC,WAAO;AAAA,EACT;AACA,QAAM,UAAUE,YAAW,MAAM,OAAO,EAAE,QAAQ,CAAC,UAAU;AAC3D,UAAM,SAASC,aAAY,KAAK;AAChC,UAAM,KAAK,UAAU,OAAO,QAAQ,KAAK,UAAU,OAAO,EAAE;AAC5D,WAAO,KACH;AAAA,MACE;AAAA,QACE;AAAA,QACA,OAAO,UAAU,OAAO,KAAK,KAAK,UAAU,OAAO,IAAI,KAAK;AAAA,QAC5D,MAAM,UAAU,OAAO,IAAI,KAAK;AAAA,QAChC,GAAI,UAAU,OAAO,WAAW,IAC5B,EAAE,aAAa,UAAU,OAAO,WAAW,EAAY,IACvD,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AACD,QAAM,kBAAkB;AAAA,IACtB,YAAY,UAAU;AAAA,EACxB;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,YAAY,YAAY,SAAS;AAAA,IACrC,QAAQ,YAAY;AAAA,IACpB,WAAW,YAAY;AAAA,IACvB,QAAQ,UAAU,MAAM,MAAM,KAAK,YAAY;AAAA,IAC/C,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,OAAO,mBAAmB,WAAW;AAAA,IACrC,UAAU,YAAY,YAAY;AAAA,IAClC,QAAQ,YAAY;AAAA,IACpB;AAAA,IACA;AAAA,IACA,QAAQ,YAAY,UAAU;AAAA,IAC9B,kBAAkB,YAAY;AAAA,EAChC;AACF;AAEA,SAAS,YACP,UAC+C;AAC/C,MACE,SAAS,kBAAkB,eAC3B,SAAS,kBAAkB,UAC3B;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,QAAQ,KAAK,UAAU,UAAW,QAAO;AAC9C,QAAM,SACJ,KAAK,YAAY,cACb,cACA,KAAK,YAAY,WACf,WACA;AACR,SAAO,SACH;AAAA,IACE,iBAAiB,GAAG,SAAS,QAAQ,cAAc,SAAS,KAAK,MAAM,IAAI,MAAM;AAAA,IACjF;AAAA,IACA,QAAQ,KAAK;AAAA,EACf,IACA;AACN;AAEA,SAAS,mBAAmB,aAA+C;AACzE,QAAM,QAAQ,YAAY,SAAS,CAAC;AACpC,SACE,UAAU,MAAM,QAAQ,KACxB,UAAU,MAAM,KAAK,KACrB,UAAU,MAAM,OAAO,KACvB,YAAY,UAAU,KAAK,KAC3B,YAAY;AAEhB;AAEA,SAAS,UAAU,OAA+B;AAChD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAASA,aAAY,OAAyC;AAC5D,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD,CAAC;AACP;AAEA,SAASD,YAAW,OAA2B;AAC7C,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;;;AE1lBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","cn","AgentVerticalScrollArea","isAgentMessageRole","isReasoningMessageKind","recordValue","stringValue","firstNonEmptyString","includesAny","positiveNumber","useEffect","useRef","useState","cn","useCallback","useEffect","useState","Button","cn","cn","jsx","cn","isRichTextMentionHref","parseRichTextMentionHref","jsx","jsxs","parseRichTextMentionHref","isRichTextMentionHref","jsx","jsxs","WorkspaceAgentMessageCenterCard","cn","useState","useEffect","useCallback","WorkspaceAgentMessageCenterStack","Button","timeoutId","jsx","jsxs","useRef","useState","useEffect","cn","Button","cn","messageCenterCollapsedStackSignature","jsx","jsxs","Button","cn","cn","StatusDot","jsx","jsxs","cn","StatusDot","jsx","jsxs","memo","WorkspaceAgentMessageCenterPanel","useState","useEffect","useRef","useMemo","useCallback","useLayoutEffect","Button","cn","MessageCenterRenderedCard","prompt","target","item","arrayValue","recordValue"]}
1
+ {"version":3,"sources":["../../agent-message-center/WorkspaceAgentMessageCenterPanel.tsx","../../shared/AgentVerticalScrollArea.tsx","../../agent-message-center/workspaceAgentMessageCenterDigest.ts","../../agent-message-center/workspaceAgentMessageCenterCollection.ts","../../agent-message-center/workspaceAgentMessageCenterModel.ts","../../agent-message-center/WorkspaceAgentMessageCenterAttentionDeck.tsx","../../agent-message-center/WorkspaceAgentMessageCenterCard.tsx","../../agent-message-center/WorkspaceAgentMessageCenterIdentity.tsx","../../agent-message-center/workspaceAgentMessageCenterPreview.tsx","../../shared/utils/agentSessionMentionText.ts","../../agent-message-center/WorkspaceAgentMessageCenterViewControls.tsx","../../agent-message-center/workspaceAgentMessageCenterViewModel.ts","../../agent-message-center/WorkspaceAgentMessageCenterGroupHeading.tsx","../../agent-message-center/messageCenterFilterPreferences.ts","../../agent-message-center/workspaceAgentMessageCenterEngineModel.ts","../../agent-message-center/workspaceAgentMessageCenterModelStability.ts","../../agent-message-center/workspaceAgentConsumerSelectors.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 DrawerDescription,\n DrawerTitle,\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 resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard,\n type WorkspaceAgentMessageCenterCardProps\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport { MessageCenterGroupHeading } from \"./WorkspaceAgentMessageCenterGroupHeading\";\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\nexport type WorkspaceAgentMessageCenterPanelPresentation =\n | \"drawer\"\n | \"embedded\";\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 presentation?: WorkspaceAgentMessageCenterPanelPresentation;\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 promptStatus?: (\n item: WorkspaceAgentMessageCenterItem\n ) => \"idle\" | \"responding\" | \"unknown\" | \"failed\";\n onSubmitPrompt: (input: {\n action?: string;\n agentSessionId: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n promptKind?: string;\n requestId: string;\n turnId?: 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 presentation = \"drawer\",\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n promptStatus = () => \"idle\",\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 presentation={presentation}\n onClose={onClose}\n onHighlightedItemSettled={onHighlightedItemSettled}\n onLinkAction={onLinkAction}\n onNotificationActioned={onNotificationActioned}\n onOpenChat={onOpenChat}\n promptStatus={promptStatus}\n onSubmitPrompt={onSubmitPrompt}\n />\n </AgentGuiI18nProvider>\n );\n }\n);\n\nfunction WorkspaceAgentMessageCenterPanelContent({\n open,\n model,\n highlightedItemId = null,\n portalContainer = null,\n presentation = \"drawer\",\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n promptStatus = () => \"idle\",\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 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 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:\n item.pendingInteractionTarget?.agentSessionId ?? item.agentSessionId,\n ...(item.pendingInteractionTarget\n ? { turnId: item.pendingInteractionTarget.turnId }\n : {}),\n promptKind: item.pendingPrompt?.kind\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 promptStatus(item) === \"responding\" ||\n promptStatus(item) === \"unknown\"\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 promptStatus,\n setItemNode,\n submitPrompt\n ]\n );\n\n const panelContents = (\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 {presentation === \"drawer\" ? (\n <div className=\"min-w-0\">\n <DrawerTitle className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n </DrawerTitle>\n <DrawerDescription className=\"truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </DrawerDescription>\n </div>\n ) : (\n <p className=\"min-w-0 truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </p>\n )}\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 isPromptSubmitting={(item) =>\n promptStatus(item) === \"responding\" ||\n promptStatus(item) === \"unknown\"\n }\n registerNode={setItemNode}\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(item, input) => void submitPrompt(item, input)}\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 );\n\n if (presentation === \"embedded\") {\n return (\n <section\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n className=\"t-modal nodrag flex h-full min-h-0 w-full flex-col overflow-hidden bg-[var(--background-panel)] text-[var(--text-primary)] [-webkit-app-region:no-drag]\"\n data-presentation=\"embedded\"\n data-testid=\"workspace-agent-message-center\"\n >\n {panelContents}\n </section>\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-presentation=\"drawer\"\n data-testid=\"workspace-agent-message-center\"\n portalContainer={portalContainer ?? undefined}\n showOverlay={false}\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n >\n {panelContents}\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","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 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\ninterface DigestAgentMessageSummaryCacheEntry {\n kind: string;\n payload: AgentActivityMessage[\"payload\"];\n role: string;\n status: string | null | undefined;\n summary: string;\n version: number;\n}\n\nconst digestAgentMessageSummaryByMessage = new WeakMap<\n AgentActivityMessage,\n DigestAgentMessageSummaryCacheEntry\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 const cached = digestAgentMessageSummaryByMessage.get(message);\n if (\n cached &&\n cached.role === message.role &&\n cached.kind === message.kind &&\n cached.status === message.status &&\n cached.payload === message.payload &&\n cached.version === message.version\n ) {\n return cached.summary;\n }\n if (\n !isAgentMessageRole(message.role) ||\n isReasoningMessageKind(message.kind)\n ) {\n digestAgentMessageSummaryByMessage.set(message, {\n kind: message.kind,\n payload: message.payload,\n role: message.role,\n status: message.status,\n summary: \"\",\n version: message.version\n });\n return \"\";\n }\n const summary = meaningfulMessageSummary(message);\n digestAgentMessageSummaryByMessage.set(message, {\n kind: message.kind,\n payload: message.payload,\n role: message.role,\n status: message.status,\n summary,\n version: message.version\n });\n return summary;\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\n/**\n * Mirrors the same-named guard in workspaceAgentMessageCenterModel.ts: a\n * reasoning/thinking message carries an assistant-like `role` but\n * `kind: \"reasoning\"` and must never be summarized as a normal agent reply.\n */\nfunction isReasoningMessageKind(kind: string): boolean {\n return kind.trim().toLowerCase() === \"reasoning\";\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 type {\n WorkspaceAgentMessageCenterCounts,\n WorkspaceAgentMessageCenterItem,\n WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\nimport type { AgentActivityNeedsAttentionItem } from \"@tutti-os/agent-activity-core\";\n\nconst EMPTY_COUNTS: WorkspaceAgentMessageCenterCounts = {\n all: 0,\n working: 0,\n waiting: 0,\n completed: 0,\n failed: 0\n};\n\nexport function buildWorkspaceAgentMessageCenterModelFromItems(\n sourceItems: readonly WorkspaceAgentMessageCenterItem[],\n itemCutoffUnixMs?: number | null\n): WorkspaceAgentMessageCenterModel {\n const items = sourceItems\n .filter((item) => isWithinItemCutoff(item, itemCutoffUnixMs))\n .sort(compareItems);\n return {\n waitingCount: items.filter(isWaitingMessageCenterItem).length,\n items,\n counts: countItems(items)\n };\n}\n\nexport function 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\nexport function isWaitingMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null || item.needsAttentionKind !== null;\n}\n\nexport function isInteractiveMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null;\n}\n\nexport function selectMessageCenterAttentionDeckItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterItem[] {\n return items.filter(isInteractiveMessageCenterItem);\n}\n\nexport function isCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n item.status === \"completed\" ||\n item.status === \"canceled\" ||\n item.status === \"idle\"\n );\n}\n\nfunction isWithinItemCutoff(\n item: WorkspaceAgentMessageCenterItem,\n cutoffUnixMs: number | null | undefined\n): boolean {\n if (!Number.isFinite(cutoffUnixMs)) return true;\n if (isWaitingMessageCenterItem(item)) return true;\n const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n return timestamp >= Number(cutoffUnixMs);\n}\n\nfunction countItems(\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 } else if (isCompletedMessageCenterItem(item)) {\n counts.completed += 1;\n } else if (item.status === \"working\") {\n counts.working += 1;\n } else if (item.status === \"failed\") {\n counts.failed += 1;\n }\n return counts;\n },\n { ...EMPTY_COUNTS }\n );\n}\n\nfunction compareItems(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): number {\n const leftWaiting = isWaitingMessageCenterItem(left);\n const rightWaiting = isWaitingMessageCenterItem(right);\n if (leftWaiting !== rightWaiting) return leftWaiting ? -1 : 1;\n return (\n right.sortTimeUnixMs - left.sortTimeUnixMs ||\n left.agentSessionId.localeCompare(right.agentSessionId)\n );\n}\n","import {\n type AgentActivityMessage,\n type AgentActivityNeedsAttentionItem,\n type AgentActivitySession,\n type WorkspaceAgentConsumerSession\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 { normalizeAgentApprovalPurpose } from \"../shared/agentConversation/agentApprovalPurpose\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"../shared/workspaceAgentSessionSortTime\";\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\";\nexport {\n buildWorkspaceAgentMessageCenterModelFromItems,\n isCompletedMessageCenterItem,\n isInteractiveMessageCenterItem,\n isWaitingMessageCenterItem,\n selectMessageCenterAttentionDeckItems\n} from \"./workspaceAgentMessageCenterCollection\";\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 agentTargetId?: string | null;\n agentName?: string | null;\n agentAvatarUrl?: string | null;\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 pendingInteractionTarget: WorkspaceAgentMessageCenterInteractionTarget | 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 WorkspaceAgentMessageCenterInteractionTarget {\n agentSessionId: string;\n requestId: string;\n turnId: string;\n}\n\nexport interface WorkspaceAgentMessageCenterTurnOutcome {\n notificationKey: string;\n status: \"completed\" | \"failed\";\n turnId: string | null;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterOptions {\n agentPresentations?: readonly WorkspaceAgentMessageCenterAgentPresentation[];\n avoidGroupingEdits?: boolean;\n identityBySessionId?: Record<string, WorkspaceAgentMessageCenterIdentity>;\n itemCutoffUnixMs?: number | null;\n promptFallbackLabels?: WorkspaceAgentMessageCenterPromptFallbackLabels;\n workspaceRoot?: string | null;\n}\n\nexport interface WorkspaceAgentMessageCenterAgentPresentation {\n agentTargetId: string;\n iconUrl?: string | null;\n name: string;\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\nexport interface BuildWorkspaceAgentMessageCenterItemInput {\n session: WorkspaceAgentMessageCenterSession;\n latestTurn?: WorkspaceAgentConsumerSession[\"latestTurn\"] | null;\n messages: readonly AgentActivityMessage[];\n status: WorkspaceAgentActivityStatus;\n needsAttention: AgentActivityNeedsAttentionItem | null;\n pendingInteractionTarget: WorkspaceAgentMessageCenterInteractionTarget | null;\n pendingPrompt: AgentConversationPromptVM | null;\n latestTurnOutcome: WorkspaceAgentMessageCenterTurnOutcome | null;\n options?: BuildWorkspaceAgentMessageCenterOptions;\n}\n\ntype WorkspaceAgentMessageCenterSession =\n | AgentActivitySession\n | WorkspaceAgentConsumerSession[\"session\"];\n\nexport function buildWorkspaceAgentMessageCenterItem({\n session,\n latestTurn,\n messages,\n status,\n needsAttention,\n pendingInteractionTarget,\n pendingPrompt,\n latestTurnOutcome,\n options = {}\n}: BuildWorkspaceAgentMessageCenterItemInput): WorkspaceAgentMessageCenterItem {\n const messageAnalysis = analyzeMessageCenterSessionMessages(\n session.agentSessionId,\n messages\n );\n const lastAgentMessage = messageAnalysis.latestAgentMessage;\n const title = session.title.trim();\n const digest = buildWorkspaceAgentMessageCenterDigest({\n fallbackTitle: title,\n latestAgentMessage: messageAnalysis.latestDigestAgentMessage,\n needsAttention,\n pendingPrompt,\n status\n });\n const agentPresentation = resolveMessageCenterAgentPresentation(\n session.agentTargetId,\n options.agentPresentations\n );\n return {\n id: `message-center-${session.agentSessionId}`,\n agentSessionId: session.agentSessionId,\n agentTargetId: session.agentTargetId?.trim() || null,\n agentName: agentPresentation?.name ?? null,\n agentAvatarUrl: agentPresentation?.iconUrl ?? null,\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 pendingInteractionTarget,\n pendingPrompt,\n needsAttentionKind: needsAttention?.kind ?? null,\n needsAttentionSummary: needsAttention?.summary ?? null,\n latestTurnOutcome,\n sortTimeUnixMs: resolveWorkspaceAgentSessionSortTimeUnixMs({\n ...session,\n latestTurn\n })\n };\n}\n\nfunction resolveMessageCenterAgentPresentation(\n agentTargetId: string | null | undefined,\n presentations:\n | readonly WorkspaceAgentMessageCenterAgentPresentation[]\n | undefined\n): { iconUrl: string | null; name: string } | null {\n const targetId = agentTargetId?.trim() ?? \"\";\n if (!targetId) {\n return null;\n }\n const presentation = presentations?.find(\n (candidate) => candidate.agentTargetId.trim() === targetId\n );\n const name = presentation?.name.trim() ?? \"\";\n if (!presentation || !name) {\n return null;\n }\n return {\n iconUrl: presentation.iconUrl?.trim() || null,\n name\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: WorkspaceAgentMessageCenterSession\n): boolean {\n return \"imported\" in session && session.imported === true;\n}\n\ninterface MessageCenterSessionMessageAnalysis {\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 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 (\n isAgentMessageRole(message.role) &&\n !isReasoningMessageKind(message.kind)\n ) {\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 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 const approvalPurpose = normalizeAgentApprovalPurpose(\n payload.approvalPurpose\n );\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 ...(approvalPurpose ? { approvalPurpose } : {}),\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 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 isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\n/**\n * Reasoning/thinking messages are stored with an assistant-like `role` but a\n * distinct `kind: \"reasoning\"` (see workspaceAgentMessageProjection.ts, which\n * routes `kind === \"reasoning\"` to a separate \"assistant_thinking\" timeline\n * item instead of a normal reply). The message center must not treat these as\n * a normal agent reply when picking the latest message to preview, otherwise\n * raw thinking content (occasionally still carrying literal tag markup) can\n * surface verbatim in the message-center list instead of the actual reply.\n */\nfunction isReasoningMessageKind(kind: string): boolean {\n return kind.trim().toLowerCase() === \"reasoning\";\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 {\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX,\n type ReactNode\n} 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 isPromptSubmitting: (item: WorkspaceAgentMessageCenterItem) => boolean;\n registerNode?: (itemId: string, node: HTMLElement | null) => void;\n renderCard?: (\n input: WorkspaceAgentMessageCenterAttentionDeckRenderCardInput\n ) => ReactNode;\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 interface WorkspaceAgentMessageCenterAttentionDeckRenderCardInput {\n cardRef?: (node: HTMLElement | null) => void;\n highlighted: boolean;\n interactive: boolean;\n isSubmitting: boolean;\n item: WorkspaceAgentMessageCenterItem;\n onSubmitPrompt: (input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }) => void;\n}\n\nexport function WorkspaceAgentMessageCenterAttentionDeck({\n items,\n highlightedItemId = null,\n isPromptSubmitting,\n registerNode,\n renderCard,\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 = isPromptSubmitting(topItem);\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 {renderCard ? (\n renderCard({\n highlighted: false,\n interactive: false,\n isSubmitting: false,\n item: leavingItem,\n onSubmitPrompt: () => {}\n })\n ) : (\n <WorkspaceAgentMessageCenterCard\n interactive={false}\n isSubmitting={false}\n item={leavingItem}\n onOpenChat={onOpenChat}\n onSubmitPrompt={() => {}}\n />\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 {renderCard ? (\n renderCard({\n cardRef: registerNode\n ? (node) => registerNode(topItem.id, node)\n : undefined,\n highlighted: topItem.id === highlightedItemId,\n interactive: true,\n isSubmitting: topIsSubmitting || isTopCoolingDown,\n item: topItem,\n onSubmitPrompt: (input) => onSubmitPrompt(topItem, input)\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 )}\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 memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type ReactNode\n} from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\nimport { Button, cn, StatusDot } from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport { AgentInteractivePromptSurface } from \"../shared/agentConversation/components/AgentInteractivePromptSurface\";\nimport { AgentMessageMarkdown } from \"../shared/AgentMessageMarkdown\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport { workspaceAgentActivityStatusLabel } from \"../shared/workspaceAgentActivityStatusLabel\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\nimport {\n LazyMessageCenterTooltip,\n MessageCenterIdentityAvatarMark,\n MessageCenterOpenChatButton,\n ProjectPathInfo,\n messageCenterStatusTone,\n messageCenterStatusToneClass,\n statusClass\n} from \"./WorkspaceAgentMessageCenterIdentity\";\nexport * from \"./WorkspaceAgentMessageCenterIdentity\";\nimport {\n buildWorkspaceAgentInteractivePromptLabels,\n messageCenterStackPreviewNodes,\n messageCenterStackPreviewText\n} from \"./workspaceAgentMessageCenterPreview\";\nexport * from \"./workspaceAgentMessageCenterPreview\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n actionsAccessory?: ReactNode;\n footerAccessory?: ReactNode;\n headerAccessory?: ReactNode;\n highlighted?: boolean;\n interactive?: boolean;\n isSubmitting: boolean;\n lazySummary?: boolean;\n promptVariant?: \"compact\" | \"full\";\n showSummaryWithPrompt?: boolean;\n summaryAccessory?: ReactNode;\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 actionsAccessory,\n footerAccessory,\n headerAccessory,\n highlighted = false,\n interactive = true,\n item,\n isSubmitting,\n lazySummary = false,\n promptVariant = \"compact\",\n showSummaryWithPrompt = true,\n summaryAccessory,\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 = item.title.trim();\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 className=\"flex shrink-0 items-center gap-2\">\n {headerAccessory}\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 </span>\n </div>\n\n {summary && (showSummaryWithPrompt || !prompt || !interactive) ? (\n <MessageCenterSummary\n item={item}\n lazy={lazySummary}\n onLinkAction={onLinkAction}\n summary={summary}\n emptyLabel={t(\"agentHost.workspaceAgentMessageCenterNoSummary\")}\n />\n ) : null}\n\n {summaryAccessory}\n\n {prompt && interactive ? (\n <div className=\"min-w-0\">\n <AgentInteractivePromptSurface\n embedded\n variant={promptVariant}\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 {footerAccessory}\n\n <MessageCenterOpenChatButton\n actionsAccessory={actionsAccessory}\n provider={item.provider}\n item={item}\n label={t(\"agentHost.workspaceAgentMessageCenterOpenChat\")}\n onOpenChat={onOpenChat}\n // Keep the conversation available for full context and as a fallback\n // even when the compact card can complete the interaction inline.\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 agentAvatarUrl={items[0]?.agentAvatarUrl}\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 agentAvatarUrl={firstItem.agentAvatarUrl}\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 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\nexport function 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 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={onLinkAction}\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","import {\n cloneElement,\n useCallback,\n useEffect,\n useState,\n type FocusEvent as ReactFocusEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { ExternalLink, Info } from \"lucide-react\";\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport { managedAgentRoundedIconUrl } from \"../shared/managedAgentIcons\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport { userAvatarPlaceholderUrl } from \"../shared/userAvatarPlaceholder\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport function MessageCenterOpenChatButton({\n actionsAccessory,\n alwaysVisible = false,\n item,\n label,\n onOpenChat,\n provider\n}: {\n actionsAccessory?: ReactNode;\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 agentAvatarUrl={item.agentAvatarUrl}\n agentName={item.agentName}\n identity={item.identity}\n provider={provider}\n />\n <span className=\"inline-flex shrink-0 items-center gap-2\">\n {actionsAccessory}\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 </span>\n </div>\n );\n}\n\nexport function MessageCenterIdentityLabel({\n agentAvatarUrl,\n agentName,\n identity,\n provider\n}: {\n agentAvatarUrl?: string | null;\n agentName?: string | null;\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n if (!identity) {\n return (\n <AgentProviderLabel\n agentAvatarUrl={agentAvatarUrl}\n agentName={agentName}\n provider={provider}\n />\n );\n }\n\n const resolvedAgentAvatarUrl =\n identity.agentAvatarUrl?.trim() ||\n agentAvatarUrl?.trim() ||\n 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={resolvedAgentAvatarUrl}\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 agentAvatarUrl,\n identity,\n provider,\n userId\n}: {\n agentAvatarUrl?: string | null;\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={agentAvatarUrl?.trim() || 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() ||\n agentAvatarUrl?.trim() ||\n 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\nexport function 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\nexport function 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({\n agentAvatarUrl,\n agentName,\n provider\n}: {\n agentAvatarUrl?: string | null;\n agentName?: string | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n const label = agentName?.trim() || 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={agentAvatarUrl?.trim() || 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\nexport function 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\nexport function 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 { ReactElement, ReactNode } from \"react\";\nimport { AppWindow } from \"lucide-react\";\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 { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport type { WorkspaceAgentMessageCenterItem } from \"./workspaceAgentMessageCenterModel\";\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 fileChangeApprovalLead: t(\"agentHost.agentGui.fileChangeApprovalRequired\", {\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","import type { UiLanguage } from \"../../contexts/settings/domain/agentSettings\";\nimport { normalizeAgentTitleText } from \"./agentTitleText.ts\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\n\nconst MARKDOWN_LINK_PATTERN = /\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(([^)\\s]+)\\)/g;\nconst MARKDOWN_LABEL_ESCAPE_PATTERN = /\\\\([\\\\[\\]()])/g;\nconst SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE: Record<UiLanguage, string> = {\n \"zh-CN\": \"@会话 · \",\n en: \"@session · \"\n};\nconst PLAIN_SESSION_AGENT_LABELS = [\n \"Claude Code\",\n \"Hermes Agent\",\n \"OpenClaw\",\n \"Nexight\",\n \"Hermes\",\n \"Codex\"\n] as const;\n\nexport interface FormatAgentSessionMentionTextOptions {\n language?: UiLanguage;\n}\n\nexport function formatAgentSessionMentionText(\n value: string | null | undefined,\n options: FormatAgentSessionMentionTextOptions = {}\n): string {\n const trimmed = value?.trim() ?? \"\";\n if (!trimmed) {\n return \"\";\n }\n const sessionMentionDisplayPrefix = sessionMentionDisplayPrefixForLanguage(\n options.language\n );\n\n const withSessionMentionsNormalized = trimmed.replace(\n MARKDOWN_LINK_PATTERN,\n (fullMatch, rawLabel: string, href: string) => {\n const label = unescapeMarkdownLabel(rawLabel);\n const mention = parseRichTextMentionHref(href, label);\n if (!mention) {\n return isRichTextMentionHref(href) ? label : fullMatch;\n }\n const providerId = mention.providerId.trim().toLowerCase();\n const displayLabel = label || mention.label;\n if (providerId === \"agent-session\") {\n return formatSessionLabel(displayLabel, sessionMentionDisplayPrefix);\n }\n if (providerId === \"workspace-issue\") {\n return formatIssueLabel(displayLabel);\n }\n return displayLabel;\n }\n );\n const normalized = normalizeAgentTitleText(withSessionMentionsNormalized);\n if (isPlainSessionMentionText(normalized, sessionMentionDisplayPrefix)) {\n return formatSessionLabel(normalized, sessionMentionDisplayPrefix);\n }\n return normalized;\n}\n\nfunction isPlainSessionMentionText(\n value: string,\n sessionMentionDisplayPrefix: string\n): boolean {\n const trimmed = value.trim();\n if (\n !trimmed.startsWith(\"@\") ||\n trimmed.startsWith(sessionMentionDisplayPrefix)\n ) {\n return false;\n }\n\n return PLAIN_SESSION_AGENT_LABELS.some((agentLabel) => {\n const ampersandSeparator = ` & ${agentLabel}`;\n const ampersandIndex = trimmed.indexOf(ampersandSeparator);\n if (ampersandIndex > 1) {\n const trailing = trimmed.slice(\n ampersandIndex + ampersandSeparator.length\n );\n if (trailing === \"\" || trailing.startsWith(\" \")) {\n return true;\n }\n }\n\n const dottedSeparator = ` · ${agentLabel} · `;\n return trimmed.indexOf(dottedSeparator) > 1;\n });\n}\n\nfunction sessionMentionDisplayPrefixForLanguage(\n language: UiLanguage | undefined\n): string {\n return SESSION_MENTION_DISPLAY_PREFIX_BY_LANGUAGE[language ?? \"en\"];\n}\n\nfunction formatSessionLabel(\n label: string,\n sessionMentionDisplayPrefix: string\n): string {\n const normalizedLabel = label.trim().replace(/^@+/, \"\").trim();\n return normalizedLabel\n ? `${sessionMentionDisplayPrefix}${normalizedLabel}`\n : label.trim();\n}\n\nfunction formatIssueLabel(label: string): string {\n const normalizedLabel = label.trim().replace(/^@+/, \"\").trim();\n return normalizedLabel ? `@Task · ${normalizedLabel}` : label.trim();\n}\n\nfunction unescapeMarkdownLabel(label: string): string {\n return label.replace(MARKDOWN_LABEL_ESCAPE_PATTERN, \"$1\");\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 onClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\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 onClick={(event) => {\n event.stopPropagation();\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\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, { count: number; label: string }>();\n for (const item of items) {\n const current = counts.get(item.provider);\n counts.set(item.provider, {\n count: (current?.count ?? 0) + 1,\n label:\n current?.label ||\n item.agentName?.trim() ||\n workspaceAgentProviderLabel(item.provider)\n });\n }\n return [...counts.entries()]\n .map(([value, option]) => ({\n count: option.count,\n label: option.label,\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 item.agentName?.trim() || 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 { cn, StatusDot } from \"@tutti-os/ui-system\";\nimport {\n MessageCenterIdentityAvatarMark,\n MessageCenterIdentityLabel,\n messageCenterStatusToneClass,\n type MessageCenterStatusTone\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport type { MessageCenterGroup } from \"./workspaceAgentMessageCenterViewModel\";\n\nexport function MessageCenterGroupHeading({\n group\n}: {\n group: MessageCenterGroup;\n}): React.JSX.Element {\n \"use memo\";\n const statusSignal = messageCenterGroupStatusSignal(group.id);\n const firstItem = group.items[0];\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 agentAvatarUrl={firstItem?.agentAvatarUrl}\n agentName={firstItem?.agentName}\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 agentAvatarUrl={firstItem?.agentAvatarUrl}\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 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 AgentActivityInteraction,\n AgentActivityMessage,\n AgentActivityNeedsAttentionItem,\n AgentActivitySnapshot,\n AgentSessionEngineState,\n WorkspaceAgentConsumerSession\n} from \"@tutti-os/agent-activity-core\";\nimport { normalizeAgentApprovalPurpose } from \"../shared/agentConversation/agentApprovalPurpose\";\nimport {\n selectEngineInteractionResponse,\n selectPendingSubmitsForSession,\n selectPlanDecisionForTurn,\n selectPlanTurnDismissed,\n selectWorkspaceAgentRootConversationSessions\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport { normalizeAskUserQuestions } from \"../shared/agentConversation/askUserQuestions\";\nimport {\n extractExitPlanKeepPlanningOptionId,\n extractExitPlanModeOptions,\n isExitPlanSwitchModeInput\n} from \"../shared/agentConversation/exitPlanOptions\";\nimport {\n latestPlanTurnId,\n planImplementationPromptFromPlanTurn\n} from \"../shared/agentConversation/planImplementationPresentation\";\nimport {\n buildWorkspaceAgentMessageCenterItem,\n buildWorkspaceAgentMessageCenterModelFromItems,\n type BuildWorkspaceAgentMessageCenterOptions,\n type WorkspaceAgentMessageCenterModel,\n type WorkspaceAgentMessageCenterTurnOutcome\n} from \"./workspaceAgentMessageCenterModel\";\nimport { workspaceAgentMessageCenterItemEqual } from \"./workspaceAgentMessageCenterModelStability\";\n\n/**\n * Canonical Message Center entrypoint. Session/turn/interaction truth comes\n * directly from the engine. Durable messages are presentation input only:\n * title and digest text may use them, but they cannot recreate lifecycle or\n * pending-interaction state.\n */\nexport function buildWorkspaceAgentMessageCenterModelFromEngine(\n presentation: WorkspaceAgentMessageCenterPresentation,\n snapshot: Pick<AgentActivitySnapshot, \"sessionMessagesById\" | \"workspaceId\">,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentMessageCenterModel {\n const items = presentation.consumers\n .filter((consumer) => consumer.session.visible !== false)\n .map((consumer) => {\n const interaction = latestPendingInteraction(consumer);\n const needsAttention = interaction\n ? needsAttentionFromInteraction(consumer, interaction)\n : null;\n return buildWorkspaceAgentMessageCenterItem({\n session: consumer.session,\n latestTurn: consumer.latestTurn,\n messages: sessionMessages(snapshot.sessionMessagesById, consumer),\n status: consumer.displayStatus,\n needsAttention,\n pendingInteractionTarget: interaction\n ? interactionTarget(interaction)\n : null,\n pendingPrompt: interaction ? promptFromInteraction(interaction) : null,\n latestTurnOutcome: turnOutcome(consumer),\n options\n });\n });\n return buildWorkspaceAgentMessageCenterModelFromItems(\n items,\n options.itemCutoffUnixMs\n );\n}\n\nexport interface WorkspaceAgentMessageCenterPresentation {\n consumers: readonly WorkspaceAgentConsumerSession[];\n dismissedPlanTurnKeys: Readonly<Record<string, true>>;\n promptStatusByKey: Readonly<\n Record<string, WorkspaceAgentMessageCenterPromptStatus>\n >;\n}\n\nexport function selectWorkspaceAgentMessageCenterPresentation(\n state: AgentSessionEngineState\n): WorkspaceAgentMessageCenterPresentation {\n const consumers = selectWorkspaceAgentRootConversationSessions(state);\n const promptStatusByKey: Record<\n string,\n WorkspaceAgentMessageCenterPromptStatus\n > = {};\n const dismissedPlanTurnKeys: Record<string, true> = {};\n for (const consumer of consumers) {\n const sessionId = consumer.session.agentSessionId;\n for (const interaction of consumer.pendingInteractions) {\n const response = selectEngineInteractionResponse(\n state,\n interaction.agentSessionId,\n interaction.turnId,\n interaction.requestId\n );\n if (response) {\n promptStatusByKey[\n promptStatusKey(\n interaction.agentSessionId,\n interaction.turnId,\n interaction.requestId\n )\n ] = response.status;\n }\n }\n const turnId = consumer.latestTurn?.turnId ?? \"\";\n if (!turnId) continue;\n if (selectPlanTurnDismissed(state, sessionId, turnId)) {\n dismissedPlanTurnKeys[promptStatusKey(sessionId, turnId, turnId)] = true;\n }\n const decision = selectPlanDecisionForTurn(state, sessionId, turnId);\n if (decision) {\n promptStatusByKey[promptStatusKey(sessionId, turnId, turnId)] =\n decision.status === \"requested\" ? \"responding\" : decision.status;\n continue;\n }\n const feedbackPrefix = [\n \"plan-implementation\",\n consumer.session.workspaceId,\n sessionId,\n turnId,\n \"feedback\"\n ].join(\":\");\n const submit = selectPendingSubmitsForSession(state, sessionId).find(\n (record) => record.clientSubmitId.startsWith(feedbackPrefix)\n );\n if (submit) {\n promptStatusByKey[promptStatusKey(sessionId, turnId, turnId)] =\n submit.status === \"failed\"\n ? \"failed\"\n : submit.status === \"uncertain\"\n ? \"unknown\"\n : \"responding\";\n }\n }\n return {\n consumers,\n dismissedPlanTurnKeys,\n promptStatusByKey\n };\n}\n\nexport function workspaceAgentMessageCenterPresentationEqual(\n left: WorkspaceAgentMessageCenterPresentation,\n right: WorkspaceAgentMessageCenterPresentation\n): boolean {\n return (\n booleanMapsEqual(left.dismissedPlanTurnKeys, right.dismissedPlanTurnKeys) &&\n promptStatusMapsEqual(left.promptStatusByKey, right.promptStatusByKey) &&\n left.consumers.length === right.consumers.length &&\n left.consumers.every((item, index) => {\n const candidate = right.consumers[index];\n return (\n candidate !== undefined &&\n item.session === candidate.session &&\n item.activeTurn === candidate.activeTurn &&\n item.latestTurn === candidate.latestTurn &&\n item.displayStatus === candidate.displayStatus &&\n item.pendingInteractions.length ===\n candidate.pendingInteractions.length &&\n item.pendingInteractions.every(\n (interaction, interactionIndex) =>\n interaction === candidate.pendingInteractions[interactionIndex]\n )\n );\n })\n );\n}\n\nexport type WorkspaceAgentAttentionTarget =\n | {\n kind: \"interaction\";\n workspaceId: string;\n agentSessionId: string;\n turnId: string;\n requestId: string;\n }\n | {\n kind: \"plan-implementation\";\n workspaceId: string;\n agentSessionId: string;\n turnId: string;\n requestId: string;\n };\n\nexport interface WorkspaceAgentAttentionItem {\n item: import(\"./workspaceAgentMessageCenterModel\").WorkspaceAgentMessageCenterItem;\n status: WorkspaceAgentMessageCenterPromptStatus;\n target: WorkspaceAgentAttentionTarget;\n}\n\n/**\n * Projects every canonical actionable target instead of collapsing a root\n * conversation to its latest interaction. The display item keeps the root\n * conversation identity for navigation while target keeps the exact child\n * session/turn/request identity used by the command.\n */\nexport function selectWorkspaceAgentAttentionItems(\n presentation: WorkspaceAgentMessageCenterPresentation,\n snapshot: Pick<AgentActivitySnapshot, \"sessionMessagesById\" | \"workspaceId\">,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentAttentionItem[] {\n const result: WorkspaceAgentAttentionItem[] = [];\n for (const consumer of presentation.consumers) {\n if (\n consumer.session.visible === false ||\n consumer.session.workspaceId !== snapshot.workspaceId\n ) {\n continue;\n }\n const messages = sessionMessages(snapshot.sessionMessagesById, consumer);\n for (const interaction of consumer.pendingInteractions) {\n const prompt = promptFromInteraction(interaction);\n if (!prompt) continue;\n const target: WorkspaceAgentAttentionTarget = {\n kind: \"interaction\",\n workspaceId: consumer.session.workspaceId,\n agentSessionId: interaction.agentSessionId,\n turnId: interaction.turnId,\n requestId: interaction.requestId\n };\n const item = buildWorkspaceAgentMessageCenterItem({\n session: consumer.session,\n latestTurn: consumer.latestTurn,\n messages,\n status: \"waiting\",\n needsAttention: needsAttentionFromInteraction(consumer, interaction),\n pendingInteractionTarget: interactionTarget(interaction),\n pendingPrompt: prompt,\n latestTurnOutcome: null,\n options\n });\n item.id = workspaceAgentAttentionKey(target);\n item.sortTimeUnixMs = interaction.createdAtUnixMs;\n result.push({\n item,\n status:\n presentation.promptStatusByKey[\n promptStatusKey(\n interaction.agentSessionId,\n interaction.turnId,\n interaction.requestId\n )\n ] ?? \"idle\",\n target\n });\n }\n\n const latestTurn = consumer.latestTurn;\n if (\n latestTurn?.phase !== \"settled\" ||\n latestTurn.outcome !== \"completed\" ||\n consumer.session.capabilities?.planImplementation !== true ||\n consumer.session.capabilities.planMode !== true ||\n latestPlanTurnId(messages) !== latestTurn.turnId\n ) {\n continue;\n }\n const target: WorkspaceAgentAttentionTarget = {\n kind: \"plan-implementation\",\n workspaceId: consumer.session.workspaceId,\n agentSessionId: consumer.session.agentSessionId,\n turnId: latestTurn.turnId,\n requestId: latestTurn.turnId\n };\n const statusKey = promptStatusKey(\n target.agentSessionId,\n target.turnId,\n target.requestId\n );\n if (presentation.dismissedPlanTurnKeys[statusKey]) continue;\n const prompt = planImplementationPromptFromPlanTurn(\n latestTurn.turnId,\n consumer.session.title\n );\n const needsAttention: AgentActivityNeedsAttentionItem = {\n id: `plan-implementation:${latestTurn.turnId}`,\n workspaceId: consumer.session.workspaceId,\n agentSessionId: consumer.session.agentSessionId,\n provider: consumer.session.provider,\n title: prompt.title,\n cwd: consumer.session.cwd,\n kind: \"constraint\",\n summary: prompt.title,\n occurredAtUnixMs: latestTurn.settledAtUnixMs ?? latestTurn.updatedAtUnixMs\n };\n const item = buildWorkspaceAgentMessageCenterItem({\n session: consumer.session,\n latestTurn,\n messages,\n status: \"waiting\",\n needsAttention,\n pendingInteractionTarget: null,\n pendingPrompt: prompt,\n latestTurnOutcome: null,\n options\n });\n item.id = workspaceAgentAttentionKey(target);\n item.sortTimeUnixMs = needsAttention.occurredAtUnixMs;\n result.push({\n item,\n status: presentation.promptStatusByKey[statusKey] ?? \"idle\",\n target\n });\n }\n return result;\n}\n\nexport function workspaceAgentAttentionItemsEqual(\n left: readonly WorkspaceAgentAttentionItem[],\n right: readonly WorkspaceAgentAttentionItem[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => {\n const candidate = right[index];\n return (\n candidate !== undefined &&\n entry.status === candidate.status &&\n workspaceAgentAttentionTargetEqual(entry.target, candidate.target) &&\n workspaceAgentMessageCenterItemEqual(entry.item, candidate.item)\n );\n })\n );\n}\n\nfunction workspaceAgentAttentionKey(target: WorkspaceAgentAttentionTarget) {\n return [\n target.workspaceId,\n target.agentSessionId,\n target.turnId,\n target.requestId\n ].join(\"\\n\");\n}\n\nfunction workspaceAgentAttentionTargetEqual(\n left: WorkspaceAgentAttentionTarget,\n right: WorkspaceAgentAttentionTarget\n): boolean {\n return (\n left.kind === right.kind &&\n left.workspaceId === right.workspaceId &&\n left.agentSessionId === right.agentSessionId &&\n left.turnId === right.turnId &&\n left.requestId === right.requestId\n );\n}\n\nexport type WorkspaceAgentMessageCenterPromptStatus =\n | \"idle\"\n | \"responding\"\n | \"unknown\"\n | \"failed\";\n\nexport function workspaceAgentMessageCenterPromptStatus(\n presentation: WorkspaceAgentMessageCenterPresentation,\n item: Pick<\n import(\"./workspaceAgentMessageCenterModel\").WorkspaceAgentMessageCenterItem,\n \"agentSessionId\" | \"pendingInteractionTarget\" | \"pendingPrompt\"\n >\n): WorkspaceAgentMessageCenterPromptStatus {\n const prompt = item.pendingPrompt;\n if (!prompt) return \"idle\";\n const target = item.pendingInteractionTarget;\n return (\n presentation.promptStatusByKey[\n target\n ? promptStatusKey(\n target.agentSessionId,\n target.turnId,\n target.requestId\n )\n : promptStatusKey(\n item.agentSessionId,\n prompt.requestId,\n prompt.requestId\n )\n ] ?? \"idle\"\n );\n}\n\nfunction promptStatusKey(\n agentSessionId: string,\n turnId: string,\n requestId: string\n): string {\n return `${agentSessionId}\\0${turnId}\\0${requestId}`;\n}\n\nfunction promptStatusMapsEqual(\n left: Readonly<Record<string, WorkspaceAgentMessageCenterPromptStatus>>,\n right: Readonly<Record<string, WorkspaceAgentMessageCenterPromptStatus>>\n): boolean {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => left[key] === right[key])\n );\n}\n\nfunction booleanMapsEqual(\n left: Readonly<Record<string, true>>,\n right: Readonly<Record<string, true>>\n): boolean {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => right[key] === true)\n );\n}\n\nfunction sessionMessages(\n sessionMessagesById: Readonly<Record<string, AgentActivityMessage[]>>,\n consumer: WorkspaceAgentConsumerSession\n): readonly AgentActivityMessage[] {\n for (const id of [\n consumer.session.agentSessionId,\n consumer.session.providerSessionId\n ]) {\n const normalized = id?.trim() ?? \"\";\n if (normalized && sessionMessagesById[normalized]) {\n return sessionMessagesById[normalized];\n }\n }\n return [];\n}\n\nfunction latestPendingInteraction(\n consumer: WorkspaceAgentConsumerSession\n): AgentActivityInteraction | null {\n return consumer.pendingInteractions.at(-1) ?? null;\n}\n\nfunction interactionTarget(\n interaction: AgentActivityInteraction\n): import(\"./workspaceAgentMessageCenterModel\").WorkspaceAgentMessageCenterInteractionTarget {\n return {\n agentSessionId: interaction.agentSessionId,\n requestId: interaction.requestId,\n turnId: interaction.turnId\n };\n}\n\nfunction needsAttentionFromInteraction(\n consumer: WorkspaceAgentConsumerSession,\n interaction: AgentActivityInteraction\n): AgentActivityNeedsAttentionItem {\n const summary = interactionSummary(interaction);\n return {\n id: `interaction:${interaction.requestId}`,\n workspaceId: consumer.session.workspaceId,\n agentSessionId: consumer.session.agentSessionId,\n provider: consumer.session.provider,\n title: summary,\n cwd: consumer.session.cwd,\n kind:\n interaction.kind === \"approval\"\n ? \"permission\"\n : interaction.kind === \"question\"\n ? \"question\"\n : \"constraint\",\n summary,\n occurredAtUnixMs: interaction.createdAtUnixMs\n };\n}\n\nfunction promptFromInteraction(\n interaction: AgentActivityInteraction\n): AgentConversationPromptVM | null {\n const input = interaction.input ?? {};\n const normalizedToolName = (interaction.toolName ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n if (\n interaction.kind === \"plan\" ||\n normalizedToolName === \"exitplanmode\" ||\n isExitPlanSwitchModeInput(input)\n ) {\n const keepPlanningOptionId = extractExitPlanKeepPlanningOptionId(input);\n return {\n kind: \"exit-plan\",\n requestId: interaction.requestId,\n title: interactionSummary(interaction),\n options: extractExitPlanModeOptions(input),\n ...(keepPlanningOptionId ? { keepPlanningOptionId } : {})\n };\n }\n if (interaction.kind === \"question\") {\n const questions = normalizeAskUserQuestions(input.questions);\n return {\n kind: \"ask-user\",\n requestId: interaction.requestId,\n title: interactionSummary(interaction),\n questions:\n questions.length > 0\n ? questions\n : [\n {\n id: \"response\",\n header: \"\",\n question: interactionSummary(interaction),\n options: [],\n multiSelect: false,\n answer: null\n }\n ]\n };\n }\n if (interaction.kind !== \"approval\") {\n return null;\n }\n const options = arrayValue(input.options).flatMap((value) => {\n const option = recordValue(value);\n const id = textValue(option.optionId) ?? textValue(option.id);\n return id\n ? [\n {\n id,\n label: textValue(option.label) ?? textValue(option.name) ?? id,\n kind: textValue(option.kind) ?? id,\n ...(textValue(option.description)\n ? { description: textValue(option.description) as string }\n : {})\n }\n ]\n : [];\n });\n const approvalPurpose = normalizeAgentApprovalPurpose(\n interaction.metadata?.approvalPurpose\n );\n return {\n kind: \"approval\",\n id: `approval:${interaction.requestId}`,\n turnId: interaction.turnId,\n requestId: interaction.requestId,\n callId: textValue(input.callId) ?? interaction.requestId,\n ...(approvalPurpose ? { approvalPurpose } : {}),\n title: interactionSummary(interaction),\n toolName: interaction.toolName ?? null,\n status: interaction.status,\n input,\n options,\n output: interaction.output ?? null,\n occurredAtUnixMs: interaction.createdAtUnixMs\n };\n}\n\nfunction turnOutcome(\n consumer: WorkspaceAgentConsumerSession\n): WorkspaceAgentMessageCenterTurnOutcome | null {\n if (\n consumer.displayStatus !== \"completed\" &&\n consumer.displayStatus !== \"failed\"\n ) {\n return null;\n }\n const turn = consumer.latestTurn;\n if (!turn || turn.phase !== \"settled\") return null;\n const status =\n turn.outcome === \"completed\"\n ? \"completed\"\n : turn.outcome === \"failed\"\n ? \"failed\"\n : null;\n return status\n ? {\n notificationKey: `${consumer.session.agentSessionId}:turn:${turn.turnId}:${status}`,\n status,\n turnId: turn.turnId\n }\n : null;\n}\n\nfunction interactionSummary(interaction: AgentActivityInteraction): string {\n const input = interaction.input ?? {};\n return (\n textValue(input.question) ??\n textValue(input.title) ??\n textValue(input.summary) ??\n interaction.toolName?.trim() ??\n interaction.kind\n );\n}\n\nfunction textValue(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","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\"];\ntype WorkspaceAgentMessageCenterAskUserQuestions = Extract<\n NonNullable<WorkspaceAgentMessageCenterPrompt>,\n { kind: \"ask-user\" }\n>[\"questions\"];\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 &&\n workspaceAgentMessageCenterItemEqual(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\nexport function workspaceAgentMessageCenterItemEqual(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n left.id === right.id &&\n left.agentSessionId === right.agentSessionId &&\n left.agentTargetId === right.agentTargetId &&\n left.agentName === right.agentName &&\n left.agentAvatarUrl === right.agentAvatarUrl &&\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 messageCenterInteractionTargetEqual(\n left.pendingInteractionTarget,\n right.pendingInteractionTarget\n ) &&\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 messageCenterInteractionTargetEqual(\n left: WorkspaceAgentMessageCenterItem[\"pendingInteractionTarget\"],\n right: WorkspaceAgentMessageCenterItem[\"pendingInteractionTarget\"]\n): boolean {\n return (\n left === right ||\n (left !== null &&\n right !== null &&\n left.agentSessionId === right.agentSessionId &&\n left.turnId === right.turnId &&\n left.requestId === right.requestId)\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 switch (left.kind) {\n case \"approval\":\n return (\n right.kind === \"approval\" &&\n left.id === right.id &&\n left.turnId === right.turnId &&\n left.requestId === right.requestId &&\n left.callId === right.callId &&\n left.title === right.title &&\n left.toolName === right.toolName &&\n left.status === right.status &&\n left.occurredAtUnixMs === right.occurredAtUnixMs &&\n messageCenterJsonValueEqual(left.input, right.input) &&\n messageCenterJsonValueEqual(\n left.output ?? null,\n right.output ?? null\n ) &&\n messageCenterApprovalOptionsEqual(left.options, right.options)\n );\n case \"ask-user\":\n return (\n right.kind === \"ask-user\" &&\n left.requestId === right.requestId &&\n left.title === right.title &&\n messageCenterAskUserQuestionsEqual(left.questions, right.questions)\n );\n case \"exit-plan\":\n return (\n right.kind === \"exit-plan\" &&\n left.requestId === right.requestId &&\n left.title === right.title &&\n left.keepPlanningOptionId === right.keepPlanningOptionId &&\n messageCenterApprovalOptionsEqual(left.options, right.options)\n );\n case \"plan-implementation\":\n return (\n right.kind === \"plan-implementation\" &&\n left.requestId === right.requestId &&\n left.title === right.title\n );\n }\n}\n\nfunction messageCenterApprovalOptionsEqual(\n left: readonly {\n description?: string;\n id: string;\n kind: string;\n label: string;\n }[],\n right: readonly {\n description?: string;\n id: string;\n kind: string;\n label: string;\n }[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((option, index) => {\n const rightOption = right[index];\n return (\n rightOption &&\n option.id === rightOption.id &&\n option.label === rightOption.label &&\n option.kind === rightOption.kind &&\n option.description === rightOption.description\n );\n });\n}\n\nfunction messageCenterAskUserQuestionsEqual(\n left: WorkspaceAgentMessageCenterAskUserQuestions,\n right: WorkspaceAgentMessageCenterAskUserQuestions\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((question, index) => {\n const rightQuestion = right[index];\n return (\n rightQuestion &&\n question.id === rightQuestion.id &&\n question.header === rightQuestion.header &&\n question.question === rightQuestion.question &&\n question.multiSelect === rightQuestion.multiSelect &&\n messageCenterAnswerEqual(\n question.answer ?? null,\n rightQuestion.answer ?? null\n ) &&\n question.options.length === rightQuestion.options.length &&\n question.options.every((option, optionIndex) => {\n const rightOption = rightQuestion.options[optionIndex];\n return (\n rightOption &&\n option.label === rightOption.label &&\n option.description === rightOption.description\n );\n })\n );\n });\n}\n\nfunction messageCenterAnswerEqual(\n left: string | string[] | null,\n right: string | string[] | null\n): boolean {\n if (left === right) {\n return true;\n }\n if (!Array.isArray(left) || !Array.isArray(right)) {\n return false;\n }\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n );\n}\n\nfunction messageCenterJsonValueEqual(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n if (\n !left ||\n !right ||\n typeof left !== \"object\" ||\n typeof right !== \"object\"\n ) {\n return false;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right)) {\n return false;\n }\n return (\n left.length === right.length &&\n left.every((value, index) =>\n messageCenterJsonValueEqual(value, right[index])\n )\n );\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord);\n if (leftKeys.length !== Object.keys(rightRecord).length) {\n return false;\n }\n return leftKeys.every((key) =>\n messageCenterJsonValueEqual(leftRecord[key], rightRecord[key])\n );\n}\n","export {\n selectWorkspaceAgentConsumerCounts,\n selectWorkspaceAgentConsumerSession,\n selectWorkspaceAgentConsumerSessions\n} from \"@tutti-os/agent-activity-core\";\nexport type {\n WorkspaceAgentConsumerCounts,\n WorkspaceAgentConsumerSession\n} from \"@tutti-os/agent-activity-core\";\n"],"mappings":"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","names":["memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","cn","AgentVerticalScrollArea","isAgentMessageRole","isReasoningMessageKind","recordValue","stringValue","firstNonEmptyString","includesAny","positiveNumber","useEffect","useRef","useState","cn","useCallback","useEffect","useState","Button","cn","cn","jsx","cn","isRichTextMentionHref","parseRichTextMentionHref","jsx","jsxs","parseRichTextMentionHref","isRichTextMentionHref","jsx","jsxs","WorkspaceAgentMessageCenterCard","cn","useState","useEffect","useCallback","WorkspaceAgentMessageCenterStack","Button","timeoutId","jsx","jsxs","useRef","useState","useEffect","cn","Button","cn","messageCenterCollapsedStackSignature","jsx","jsxs","Button","cn","cn","StatusDot","jsx","jsxs","cn","StatusDot","jsx","jsxs","memo","WorkspaceAgentMessageCenterPanel","useState","useEffect","useRef","useMemo","useCallback","useLayoutEffect","Button","cn","MessageCenterRenderedCard","prompt","target","item","arrayValue","recordValue"]}