@tutti-os/agent-gui 0.0.3

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 (112) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +56 -0
  3. package/dist/agent-message-center/index.d.ts +218 -0
  4. package/dist/agent-message-center/index.js +1962 -0
  5. package/dist/agent-message-center/index.js.map +1 -0
  6. package/dist/agent-rich-text-at-provider.d.ts +49 -0
  7. package/dist/agent-rich-text-at-provider.js +7 -0
  8. package/dist/agent-rich-text-at-provider.js.map +1 -0
  9. package/dist/agent-title-text.d.ts +3 -0
  10. package/dist/agent-title-text.js +7 -0
  11. package/dist/agent-title-text.js.map +1 -0
  12. package/dist/app/renderer/agentactivity.css +6773 -0
  13. package/dist/app/renderer/assets/icons/agent-sessions-filled.svg +1 -0
  14. package/dist/app/renderer/assets/icons/agents/claude-rounded.png +0 -0
  15. package/dist/app/renderer/assets/icons/agents/codex-rounded.png +0 -0
  16. package/dist/app/renderer/assets/icons/agents/gemini-rounded.png +0 -0
  17. package/dist/app/renderer/assets/icons/agents/hermes-rounded.png +0 -0
  18. package/dist/app/renderer/assets/icons/agents/manage-agent-claude-code.png +0 -0
  19. package/dist/app/renderer/assets/icons/agents/manage-agent-codex.png +0 -0
  20. package/dist/app/renderer/assets/icons/agents/manage-agent-gemini.png +0 -0
  21. package/dist/app/renderer/assets/icons/agents/manage-agent-hermes.png +0 -0
  22. package/dist/app/renderer/assets/icons/agents/manage-agent-nextop.png +0 -0
  23. package/dist/app/renderer/assets/icons/agents/manage-agent-openclaw.png +0 -0
  24. package/dist/app/renderer/assets/icons/agents/nextop-doc-rounded.png +0 -0
  25. package/dist/app/renderer/assets/icons/agents/openclaw-rounded.png +0 -0
  26. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-claude-code.png +0 -0
  27. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-codex.png +0 -0
  28. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-gemini.png +0 -0
  29. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-nexight.png +0 -0
  30. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-openclaw.png +0 -0
  31. package/dist/app/renderer/assets/icons/code-filled.svg +1 -0
  32. package/dist/app/renderer/assets/icons/doc-filled.svg +1 -0
  33. package/dist/app/renderer/assets/icons/folder-filled.svg +1 -0
  34. package/dist/app/renderer/assets/icons/image-filled.svg +1 -0
  35. package/dist/app/renderer/assets/icons/issue-filled.svg +1 -0
  36. package/dist/app/renderer/assets/icons/product-filled.svg +1 -0
  37. package/dist/app/renderer/assets/icons/user-avatar-placeholder.png +0 -0
  38. package/dist/app/renderer/assets/icons/video-filled.svg +1 -0
  39. package/dist/chunk-22L4VWUR.js +70 -0
  40. package/dist/chunk-22L4VWUR.js.map +1 -0
  41. package/dist/chunk-3D5VTIKP.js +93 -0
  42. package/dist/chunk-3D5VTIKP.js.map +1 -0
  43. package/dist/chunk-AF5CXBJN.js +3075 -0
  44. package/dist/chunk-AF5CXBJN.js.map +1 -0
  45. package/dist/chunk-BABBC24I.js +28 -0
  46. package/dist/chunk-BABBC24I.js.map +1 -0
  47. package/dist/chunk-GCBDIQDX.js +22 -0
  48. package/dist/chunk-GCBDIQDX.js.map +1 -0
  49. package/dist/chunk-HSR5DI6O.js +4695 -0
  50. package/dist/chunk-HSR5DI6O.js.map +1 -0
  51. package/dist/chunk-IVPB4MLI.js +7 -0
  52. package/dist/chunk-IVPB4MLI.js.map +1 -0
  53. package/dist/chunk-KCC3GNPB.js +13 -0
  54. package/dist/chunk-KCC3GNPB.js.map +1 -0
  55. package/dist/chunk-PJP5BUU6.js +18 -0
  56. package/dist/chunk-PJP5BUU6.js.map +1 -0
  57. package/dist/chunk-RORLLV27.js +144 -0
  58. package/dist/chunk-RORLLV27.js.map +1 -0
  59. package/dist/chunk-UJWUGMWC.js +128 -0
  60. package/dist/chunk-UJWUGMWC.js.map +1 -0
  61. package/dist/chunk-UKQIGNN3.js +921 -0
  62. package/dist/chunk-UKQIGNN3.js.map +1 -0
  63. package/dist/chunk-ZP7P7DYO.js +270 -0
  64. package/dist/chunk-ZP7P7DYO.js.map +1 -0
  65. package/dist/chunk-ZX5PDYAS.js +346 -0
  66. package/dist/chunk-ZX5PDYAS.js.map +1 -0
  67. package/dist/claude-rounded-F6VPQETB.png +0 -0
  68. package/dist/codex-rounded-SC63MZAW.png +0 -0
  69. package/dist/gemini-rounded-O4KAJFIM.png +0 -0
  70. package/dist/hermes-rounded-QGDHBNRJ.png +0 -0
  71. package/dist/i18n/index.d.ts +4580 -0
  72. package/dist/i18n/index.js +19 -0
  73. package/dist/i18n/index.js.map +1 -0
  74. package/dist/index.d.ts +775 -0
  75. package/dist/index.js +33699 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/manage-agent-claude-code-F6VPQETB.png +0 -0
  78. package/dist/manage-agent-codex-SC63MZAW.png +0 -0
  79. package/dist/manage-agent-gemini-O4KAJFIM.png +0 -0
  80. package/dist/manage-agent-hermes-QGDHBNRJ.png +0 -0
  81. package/dist/manage-agent-nextop-UFAQ22K2.png +0 -0
  82. package/dist/manage-agent-openclaw-24U7O6CA.png +0 -0
  83. package/dist/mention-file-presentation.d.ts +16 -0
  84. package/dist/mention-file-presentation.js +10 -0
  85. package/dist/mention-file-presentation.js.map +1 -0
  86. package/dist/nextop-doc-rounded-UFAQ22K2.png +0 -0
  87. package/dist/openclaw-rounded-24U7O6CA.png +0 -0
  88. package/dist/user-avatar-placeholder-WP2373TS.png +0 -0
  89. package/dist/workbench/contribution.d.ts +42 -0
  90. package/dist/workbench/contribution.js +24 -0
  91. package/dist/workbench/contribution.js.map +1 -0
  92. package/dist/workbench/index.d.ts +24 -0
  93. package/dist/workbench/index.js +82 -0
  94. package/dist/workbench/index.js.map +1 -0
  95. package/dist/workbench/launch.d.ts +49 -0
  96. package/dist/workbench/launch.js +23 -0
  97. package/dist/workbench/launch.js.map +1 -0
  98. package/dist/workbench/providerCatalog.d.ts +15 -0
  99. package/dist/workbench/providerCatalog.js +27 -0
  100. package/dist/workbench/providerCatalog.js.map +1 -0
  101. package/dist/workbench/state.d.ts +22 -0
  102. package/dist/workbench/state.js +22 -0
  103. package/dist/workbench/state.js.map +1 -0
  104. package/dist/workbench/types.d.ts +43 -0
  105. package/dist/workbench/types.js +7 -0
  106. package/dist/workbench/types.js.map +1 -0
  107. package/dist/workspace-agent-generated-files.d.ts +2 -0
  108. package/dist/workspace-agent-generated-files.js +21 -0
  109. package/dist/workspace-agent-generated-files.js.map +1 -0
  110. package/dist/workspaceAgentActivityListViewModel-PvLQDj60.d.ts +309 -0
  111. package/dist/workspaceLinkActions-Bwa-phu8.d.ts +51 -0
  112. package/package.json +166 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../agent-message-center/WorkspaceAgentMessageCenterPanel.tsx","../../shared/AgentVerticalScrollArea.tsx","../../agent-message-center/WorkspaceAgentMessageCenterViewControls.tsx","../../agent-message-center/workspaceAgentMessageCenterModel.ts","../../agent-message-center/workspaceAgentMessageCenterViewModel.ts","../../agent-message-center/WorkspaceAgentMessageCenterCard.tsx"],"sourcesContent":["import {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type JSX\n} from \"react\";\nimport {\n Button,\n cn,\n Drawer,\n DrawerContent,\n TooltipProvider\n} from \"@tutti-os/ui-system\";\nimport type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport {\n AgentGuiI18nProvider,\n useTranslation,\n type AgentGuiI18nLocale\n} from \"../i18n/index\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport type {\n WorkspaceAgentMessageCenterItem,\n WorkspaceAgentMessageCenterModel\n} from \"./workspaceAgentMessageCenterModel\";\nimport { MessageCenterViewMenu } from \"./WorkspaceAgentMessageCenterViewControls\";\nimport {\n resolveMessageCenterNotificationAction,\n WorkspaceAgentMessageCenterStack,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nimport {\n buildMessageCenterProviderOptions,\n buildMessageCenterStatusOptions,\n groupMessageCenterItems,\n itemMatchesViewFilters,\n partitionMessageCenterItemsByProvider,\n statusFilterSummary,\n type MessageCenterGroupBy,\n type MessageCenterStatusFilter\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport {\n buildWorkspaceAgentInteractivePromptLabels,\n WorkspaceAgentMessageCenterCard\n} from \"./WorkspaceAgentMessageCenterCard\";\nexport type { WorkspaceAgentMessageCenterCardProps } from \"./WorkspaceAgentMessageCenterCard\";\n\nconst MESSAGE_CENTER_TOOLTIP_DELAY_MS = 300;\n\nexport interface WorkspaceAgentMessageCenterPanelProps {\n i18n?: I18nRuntime<string> | null;\n locale?: AgentGuiI18nLocale;\n open: boolean;\n model: WorkspaceAgentMessageCenterModel;\n highlightedItemId?: string | null;\n portalContainer?: HTMLElement | null;\n onClose: () => void;\n onHighlightedItemSettled?: (itemId: string) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onNotificationActioned?: (input: {\n action: string;\n provider: string;\n }) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (input: {\n action?: string;\n agentSessionId: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }) => Promise<void> | void;\n}\n\nexport const WorkspaceAgentMessageCenterPanel = memo(\n function WorkspaceAgentMessageCenterPanel({\n open,\n i18n,\n locale,\n model,\n highlightedItemId = null,\n portalContainer = null,\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n onSubmitPrompt\n }: WorkspaceAgentMessageCenterPanelProps): JSX.Element | null {\n \"use memo\";\n return (\n <AgentGuiI18nProvider runtime={i18n} locale={locale}>\n <WorkspaceAgentMessageCenterPanelContent\n open={open}\n model={model}\n highlightedItemId={highlightedItemId}\n portalContainer={portalContainer}\n onClose={onClose}\n onHighlightedItemSettled={onHighlightedItemSettled}\n onLinkAction={onLinkAction}\n onNotificationActioned={onNotificationActioned}\n onOpenChat={onOpenChat}\n onSubmitPrompt={onSubmitPrompt}\n />\n </AgentGuiI18nProvider>\n );\n }\n);\n\nfunction WorkspaceAgentMessageCenterPanelContent({\n open,\n model,\n highlightedItemId = null,\n portalContainer = null,\n onClose,\n onHighlightedItemSettled,\n onLinkAction,\n onNotificationActioned,\n onOpenChat,\n onSubmitPrompt\n}: Omit<\n WorkspaceAgentMessageCenterPanelProps,\n \"i18n\" | \"locale\"\n>): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const [groupBy, setGroupBy] = useState<MessageCenterGroupBy>(\"priority\");\n const [statusFilters, setStatusFilters] =\n useState<Set<MessageCenterStatusFilter> | null>(null);\n const [providerFilters, setProviderFilters] = useState<Set<string> | null>(\n null\n );\n const [expandedStackIds, setExpandedStackIds] = useState<Set<string>>(\n () => new Set()\n );\n const [submittingPromptKey, setSubmittingPromptKey] = useState<string | null>(\n null\n );\n const itemNodesRef = useRef<Map<string, HTMLElement>>(new Map());\n const lastScrolledHighlightedItemIdRef = useRef<string | null>(null);\n const lastFilterResetHighlightedItemIdRef = useRef<string | null>(null);\n const statusOptions = useMemo(\n () => buildMessageCenterStatusOptions(model.counts, t),\n [model.counts, t]\n );\n const providerOptions = useMemo(\n () => buildMessageCenterProviderOptions(model.items),\n [model.items]\n );\n const visibleItems = useMemo(\n () =>\n model.items.filter((item) =>\n itemMatchesViewFilters({\n item,\n providerFilters,\n statusFilters\n })\n ),\n [model.items, providerFilters, statusFilters]\n );\n const itemGroups = useMemo(\n () => groupMessageCenterItems(visibleItems, groupBy, t),\n [groupBy, t, visibleItems]\n );\n const highlightedItem = useMemo(\n () =>\n highlightedItemId\n ? (model.items.find((item) => item.id === highlightedItemId) ?? null)\n : null,\n [highlightedItemId, model.items]\n );\n const activeStatusSummary = statusFilterSummary(statusFilters, statusOptions);\n const hasActiveFilters = statusFilters !== null || providerFilters !== null;\n const headerSummary = useMemo(() => {\n if (hasActiveFilters) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryFiltered\", {\n count: visibleItems.length,\n total: model.counts.all\n });\n }\n if (model.counts.waiting > 0) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryWaiting\", {\n count: model.counts.all,\n waiting: model.counts.waiting\n });\n }\n if (model.counts.completed > 0) {\n return t(\"agentHost.workspaceAgentMessageCenterSummaryCompleted\", {\n count: model.counts.all,\n completed: model.counts.completed\n });\n }\n return t(\"agentHost.workspaceAgentMessageCenterSummaryCount\", {\n count: model.counts.all\n });\n }, [\n hasActiveFilters,\n model.counts.all,\n model.counts.completed,\n model.counts.waiting,\n t,\n visibleItems.length\n ]);\n\n const submitPrompt = useCallback(\n async (\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }\n ) => {\n const promptKey = `${item.agentSessionId}:${input.requestId}`;\n setSubmittingPromptKey(promptKey);\n try {\n const notificationAction = resolveMessageCenterNotificationAction(\n item,\n input\n );\n if (notificationAction) {\n onNotificationActioned?.({\n action: notificationAction,\n provider: item.provider\n });\n }\n await onSubmitPrompt({\n ...input,\n agentSessionId: item.agentSessionId\n });\n } finally {\n setSubmittingPromptKey((current) =>\n current === promptKey ? null : current\n );\n }\n },\n [onNotificationActioned, onSubmitPrompt]\n );\n const setItemNode = useCallback(\n (itemId: string, node: HTMLElement | null) => {\n if (node) {\n itemNodesRef.current.set(itemId, node);\n } else {\n itemNodesRef.current.delete(itemId);\n }\n },\n []\n );\n const toggleStatusFilter = useCallback(\n (status: MessageCenterStatusFilter) => {\n setStatusFilters((current) => {\n const next = new Set(\n current ?? statusOptions.map((option) => option.value)\n );\n if (next.has(status)) {\n next.delete(status);\n } else {\n next.add(status);\n }\n return next.size === statusOptions.length ? null : next;\n });\n },\n [statusOptions]\n );\n const toggleProviderFilter = useCallback(\n (provider: string) => {\n setProviderFilters((current) => {\n const next = new Set(\n current ?? providerOptions.map((option) => option.value)\n );\n if (next.has(provider)) {\n next.delete(provider);\n } else {\n next.add(provider);\n }\n return next.size === providerOptions.length ? null : next;\n });\n },\n [providerOptions]\n );\n const clearFilters = useCallback(() => {\n setStatusFilters(null);\n setProviderFilters(null);\n }, []);\n const expandStack = useCallback((groupId: string) => {\n setExpandedStackIds((current) => {\n if (current.has(groupId)) {\n return current;\n }\n const next = new Set(current);\n next.add(groupId);\n return next;\n });\n }, []);\n const collapseStack = useCallback((groupId: string) => {\n setExpandedStackIds((current) => {\n if (!current.has(groupId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(groupId);\n return next;\n });\n }, []);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItem) {\n return;\n }\n if (lastFilterResetHighlightedItemIdRef.current === highlightedItem.id) {\n return;\n }\n if (\n itemMatchesViewFilters({\n item: highlightedItem,\n providerFilters,\n statusFilters\n })\n ) {\n return;\n }\n lastFilterResetHighlightedItemIdRef.current = highlightedItem.id;\n setStatusFilters(null);\n setProviderFilters(null);\n }, [highlightedItem, open, providerFilters, statusFilters]);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItemId) {\n return;\n }\n for (const group of itemGroups) {\n for (const stack of partitionMessageCenterItemsByProvider(group.items)) {\n if (\n stack.items.length > 1 &&\n stack.items.some((item) => item.id === highlightedItemId)\n ) {\n expandStack(`${group.id}:${stack.provider}`);\n return;\n }\n }\n }\n }, [expandStack, highlightedItemId, itemGroups, open]);\n\n useLayoutEffect(() => {\n if (!open || !highlightedItemId) {\n lastScrolledHighlightedItemIdRef.current = null;\n return;\n }\n if (\n highlightedItem &&\n !itemMatchesViewFilters({\n item: highlightedItem,\n providerFilters,\n statusFilters\n })\n ) {\n return;\n }\n if (lastScrolledHighlightedItemIdRef.current === highlightedItemId) {\n return;\n }\n const target = itemNodesRef.current.get(highlightedItemId);\n if (!target) {\n return;\n }\n lastScrolledHighlightedItemIdRef.current = highlightedItemId;\n target.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n target.focus({ preventScroll: true });\n }, [\n expandedStackIds,\n highlightedItem,\n highlightedItemId,\n open,\n providerFilters,\n statusFilters,\n visibleItems\n ]);\n\n useEffect(() => {\n if (!open || !highlightedItemId) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n onHighlightedItemSettled?.(highlightedItemId);\n }, 3200);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [highlightedItemId, onHighlightedItemSettled, open]);\n\n return (\n <Drawer\n open={open}\n direction=\"right\"\n handleOnly\n onOpenChange={(nextOpen: boolean) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DrawerContent\n className={cn(\n \"t-modal nodrag min-h-0 w-[min(440px,calc(100vw-16px))] max-w-none overflow-hidden rounded-none border-y-0 border-r-0 bg-[var(--background-panel)] text-[var(--text-primary)] shadow-side-panel data-[vaul-drawer-direction=right]:rounded-none\",\n \"[-webkit-app-region:no-drag]\"\n )}\n data-testid=\"workspace-agent-message-center\"\n portalContainer={portalContainer ?? undefined}\n showOverlay={false}\n aria-label={t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n >\n <TooltipProvider delayDuration={MESSAGE_CENTER_TOOLTIP_DELAY_MS}>\n <div className=\"flex-none border-b border-[var(--border-1)] px-3.5 pt-3 pb-3\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterTitle\")}\n </div>\n <div className=\"truncate text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {headerSummary}\n </div>\n </div>\n <MessageCenterViewMenu\n filtersActive={hasActiveFilters}\n groupBy={groupBy}\n providerFilters={providerFilters}\n providerOptions={providerOptions}\n statusFilters={statusFilters}\n statusOptions={statusOptions}\n onClearFilters={clearFilters}\n onGroupByChange={setGroupBy}\n onProviderToggle={toggleProviderFilter}\n onStatusToggle={toggleStatusFilter}\n />\n </div>\n </div>\n\n <AgentVerticalScrollArea\n className=\"min-h-0 flex-1\"\n viewportClassName=\"flex h-full w-full flex-col px-3.5 pt-4 pb-4\"\n scrollbarClassName=\"top-4 bottom-4\"\n syncKey={`${groupBy}:${activeStatusSummary}:${visibleItems.map((item) => item.id).join(\"|\")}`}\n >\n {visibleItems.length > 0 ? (\n <div className=\"flex w-full min-w-0 flex-col gap-4\">\n {itemGroups.map((group) => (\n <section\n key={group.id}\n className=\"flex min-w-0 flex-col gap-2.5\"\n aria-label={`${group.label} ${group.items.length}`}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-3 px-0.5\">\n <h3 className=\"truncate text-[11px] font-normal leading-4 text-[var(--text-tertiary)]\">\n {group.label} · {group.items.length}\n </h3>\n </div>\n {(() => {\n const renderCard = (\n item: WorkspaceAgentMessageCenterItem,\n options: { stackedIndex?: number } = {}\n ) => {\n const highlighted = item.id === highlightedItemId;\n const card = (\n <MessageCenterCard\n key={item.agentSessionId}\n cardRef={(node) => setItemNode(item.id, node)}\n highlighted={highlighted}\n item={item}\n isSubmitting={\n submittingPromptKey ===\n `${item.agentSessionId}:${item.pendingPrompt?.requestId}`\n }\n onLinkAction={onLinkAction}\n onOpenChat={onOpenChat}\n onSubmitPrompt={(input) =>\n void submitPrompt(item, input)\n }\n />\n );\n\n if (options.stackedIndex === undefined) {\n return card;\n }\n\n return (\n <div\n key={item.agentSessionId}\n className=\"min-w-0 motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 motion-safe:duration-200 motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\"\n style={{\n animationDelay: `${Math.min(options.stackedIndex * 24, 96)}ms`\n }}\n >\n {card}\n </div>\n );\n };\n\n return partitionMessageCenterItemsByProvider(\n group.items\n ).map((stack) => {\n const firstItem = stack.items[0];\n if (!firstItem) {\n return null;\n }\n if (stack.items.length === 1) {\n return renderCard(firstItem);\n }\n const stackId = `${group.id}:${stack.provider}`;\n return (\n <MessageCenterStack\n key={stackId}\n expanded={expandedStackIds.has(stackId)}\n groupId={stackId}\n items={stack.items}\n renderCard={renderCard}\n onCollapse={() => collapseStack(stackId)}\n onExpand={() => expandStack(stackId)}\n />\n );\n });\n })()}\n </section>\n ))}\n </div>\n ) : model.items.length > 0 ? (\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-2.5 px-6 py-8 text-center text-[13px] text-[var(--text-tertiary)]\">\n <span>\n {t(\"agentHost.workspaceAgentMessageCenterFilteredEmpty\")}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"border border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n onClick={clearFilters}\n >\n {t(\"agentHost.workspaceAgentMessageCenterClearFilters\")}\n </Button>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center px-6 py-8 text-center text-[13px] text-[var(--text-tertiary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterEmpty\")}\n </div>\n )}\n </AgentVerticalScrollArea>\n </TooltipProvider>\n </DrawerContent>\n </Drawer>\n );\n}\n\nconst MessageCenterCard = WorkspaceAgentMessageCenterCard;\nconst MessageCenterStack = WorkspaceAgentMessageCenterStack;\n","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 { JSX } from \"react\";\nimport { ListFilter } from \"lucide-react\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport {\n messageCenterGroupLabel,\n type MessageCenterGroupBy,\n type MessageCenterProviderOption,\n type MessageCenterStatusFilter,\n type MessageCenterStatusOption\n} from \"./workspaceAgentMessageCenterViewModel\";\n\nexport function MessageCenterViewMenu({\n filtersActive = false,\n groupBy,\n providerFilters,\n providerOptions,\n statusFilters,\n statusOptions,\n onClearFilters,\n onGroupByChange,\n onProviderToggle,\n onStatusToggle\n}: {\n filtersActive?: boolean;\n groupBy: MessageCenterGroupBy;\n providerFilters: Set<string> | null;\n providerOptions: MessageCenterProviderOption[];\n statusFilters: Set<MessageCenterStatusFilter> | null;\n statusOptions: MessageCenterStatusOption[];\n onClearFilters: () => void;\n onGroupByChange: (groupBy: MessageCenterGroupBy) => void;\n onProviderToggle: (provider: string) => void;\n onStatusToggle: (status: MessageCenterStatusFilter) => void;\n}): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterViewOptions\")}\n title={t(\"agentHost.workspaceAgentMessageCenterViewOptions\")}\n className={cn(\n \"relative size-8 shrink-0 rounded-md border bg-[var(--background-fronted)] shadow-none\",\n filtersActive\n ? \"border-[var(--border-focus)] text-[var(--accent)]\"\n : \"border-[var(--line-2)] text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n )}\n >\n <ListFilter className=\"size-4\" strokeWidth={2.1} aria-hidden=\"true\" />\n {filtersActive ? (\n <span\n aria-label={t(\n \"agentHost.workspaceAgentMessageCenterFilterActive\"\n )}\n className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full border border-[var(--background-panel)] bg-[var(--accent)]\"\n />\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={8}\n className=\"min-w-[240px] p-1.5\"\n style={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterGroupBy\")}\n </DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={groupBy}\n onValueChange={(value) =>\n onGroupByChange(value as MessageCenterGroupBy)\n }\n >\n {([\"priority\", \"status\", \"agent\", \"time\"] as const).map((value) => (\n <DropdownMenuRadioItem key={value} value={value}>\n {messageCenterGroupLabel(value, t)}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n\n <DropdownMenuSeparator />\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterFilterStatus\")}\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {statusOptions.map((option) => (\n <DropdownMenuCheckboxItem\n key={option.value}\n aria-label={`${option.label} ${option.count}`}\n checked={\n statusFilters === null || statusFilters.has(option.value)\n }\n onCheckedChange={() => onStatusToggle(option.value)}\n onSelect={(event) => event.preventDefault()}\n >\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n <span className=\"ml-auto text-[11px] text-[var(--text-tertiary)]\">\n {option.count}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n\n {providerOptions.length > 0 ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>\n {t(\"agentHost.workspaceAgentMessageCenterFilterAgent\")}\n </DropdownMenuLabel>\n <DropdownMenuGroup>\n {providerOptions.map((option) => (\n <DropdownMenuCheckboxItem\n key={option.value}\n aria-label={`${option.label} ${option.count}`}\n checked={\n providerFilters === null ||\n providerFilters.has(option.value)\n }\n onCheckedChange={() => onProviderToggle(option.value)}\n onSelect={(event) => event.preventDefault()}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {option.label}\n </span>\n <span className=\"ml-auto text-[11px] text-[var(--text-tertiary)]\">\n {option.count}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuGroup>\n </>\n ) : null}\n\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onClearFilters}>\n {t(\"agentHost.workspaceAgentMessageCenterClearFilters\")}\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import {\n selectNeedsAttentionItems,\n selectSessionDisplayStatuses,\n type AgentActivityMessage,\n type AgentActivityNeedsAttentionItem,\n type AgentActivitySession,\n type AgentActivitySnapshot\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../shared/agentConversation/contracts/agentConversationVM\";\nimport type { WorkspaceAgentActivityStatus } from \"../shared/workspaceAgentActivityListViewModel\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"../shared/workspaceAgentSessionSortTime\";\n\nexport interface WorkspaceAgentMessageCenterModel {\n waitingCount: number;\n items: WorkspaceAgentMessageCenterItem[];\n counts: WorkspaceAgentMessageCenterCounts;\n}\n\nexport interface WorkspaceAgentMessageCenterCounts {\n all: number;\n working: number;\n waiting: number;\n completed: number;\n failed: number;\n}\n\nexport interface WorkspaceAgentMessageCenterItem {\n id: string;\n agentSessionId: string;\n provider: string;\n title: string;\n identity: WorkspaceAgentMessageCenterIdentity | null;\n cwd: string;\n status: WorkspaceAgentActivityStatus;\n lastAgentMessageSummary: string;\n lastAgentMessageAtUnixMs: number | null;\n pendingPrompt: AgentConversationPromptVM | null;\n needsAttentionKind: AgentActivityNeedsAttentionItem[\"kind\"] | null;\n needsAttentionSummary: string | null;\n sortTimeUnixMs: number;\n}\n\nexport interface BuildWorkspaceAgentMessageCenterOptions {\n avoidGroupingEdits?: boolean;\n identityBySessionId?: Record<string, WorkspaceAgentMessageCenterIdentity>;\n promptFallbackLabels?: WorkspaceAgentMessageCenterPromptFallbackLabels;\n workspaceRoot?: string | null;\n}\n\nexport interface WorkspaceAgentMessageCenterIdentity {\n userName: string;\n userAvatarUrl?: string;\n agentName: string;\n agentAvatarUrl?: string;\n}\n\nexport interface WorkspaceAgentMessageCenterPromptFallbackLabels {\n constraintHeader: string;\n inputHeader: string;\n question: string;\n title: string;\n}\n\nconst EMPTY_COUNTS: WorkspaceAgentMessageCenterCounts = {\n all: 0,\n working: 0,\n waiting: 0,\n completed: 0,\n failed: 0\n};\n\nexport function buildWorkspaceAgentMessageCenterModel(\n snapshot: AgentActivitySnapshot,\n options: BuildWorkspaceAgentMessageCenterOptions = {}\n): WorkspaceAgentMessageCenterModel {\n const needsAttentionBySessionId = latestNeedsAttentionBySessionId(\n selectNeedsAttentionItems(snapshot)\n );\n const displayStatuses = selectSessionDisplayStatuses(snapshot);\n const items = snapshot.sessions\n .filter((session) => session.visible !== false)\n .map((session) => {\n const messages = resolveSessionMessages(snapshot, session);\n const needsAttention =\n needsAttentionBySessionId.get(session.agentSessionId) ?? null;\n const pendingPrompt =\n pendingPromptFromMessages(messages) ??\n fallbackPromptFromNeedsAttention(\n needsAttention,\n options.promptFallbackLabels\n );\n const status = displayStatuses.get(session.agentSessionId) ?? \"idle\";\n const lastAgentMessage = latestAgentMessage(messages);\n const title = resolveSessionTitle(session, messages);\n const sortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(\n session,\n {\n messages\n }\n );\n\n return {\n id: `message-center-${session.agentSessionId}`,\n agentSessionId: session.agentSessionId,\n provider: session.provider,\n title,\n identity: resolveMessageCenterIdentity(\n session.agentSessionId,\n options.identityBySessionId\n ),\n cwd: session.cwd,\n status,\n lastAgentMessageSummary:\n lastAgentMessage?.summary ?? needsAttention?.summary ?? title,\n lastAgentMessageAtUnixMs: lastAgentMessage?.occurredAtUnixMs ?? null,\n pendingPrompt,\n needsAttentionKind: needsAttention?.kind ?? null,\n needsAttentionSummary: needsAttention?.summary ?? null,\n sortTimeUnixMs\n } satisfies WorkspaceAgentMessageCenterItem;\n });\n\n return {\n waitingCount: items.filter(isWaitingMessageCenterItem).length,\n items: items.sort(compareMessageCenterItems),\n counts: countMessageCenterItems(items)\n };\n}\n\nfunction resolveMessageCenterIdentity(\n agentSessionId: string,\n identityBySessionId:\n | Record<string, WorkspaceAgentMessageCenterIdentity>\n | undefined\n): WorkspaceAgentMessageCenterIdentity | null {\n const identity = identityBySessionId?.[agentSessionId];\n if (!identity) {\n return null;\n }\n const userName = identity.userName.trim();\n const agentName = identity.agentName.trim();\n if (!userName || !agentName) {\n return null;\n }\n const userAvatarUrl = identity.userAvatarUrl?.trim() ?? \"\";\n const agentAvatarUrl = identity.agentAvatarUrl?.trim() ?? \"\";\n return {\n userName,\n ...(userAvatarUrl ? { userAvatarUrl } : {}),\n agentName,\n ...(agentAvatarUrl ? { agentAvatarUrl } : {})\n };\n}\n\nexport function isWaitingMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return item.pendingPrompt !== null || item.needsAttentionKind !== null;\n}\n\nexport function isCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem\n): boolean {\n return (\n item.status === \"completed\" ||\n item.status === \"canceled\" ||\n item.status === \"idle\"\n );\n}\n\nfunction latestNeedsAttentionBySessionId(\n items: readonly AgentActivityNeedsAttentionItem[]\n): Map<string, AgentActivityNeedsAttentionItem> {\n const bySessionId = new Map<string, AgentActivityNeedsAttentionItem>();\n for (const item of items) {\n const previous = bySessionId.get(item.agentSessionId);\n if (!previous || item.occurredAtUnixMs > previous.occurredAtUnixMs) {\n bySessionId.set(item.agentSessionId, item);\n }\n }\n return bySessionId;\n}\n\nfunction resolveSessionMessages(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): AgentActivityMessage[] {\n for (const sessionId of [session.agentSessionId, session.providerSessionId]) {\n const normalized = sessionId?.trim() ?? \"\";\n if (normalized && snapshot.sessionMessagesById[normalized]) {\n return snapshot.sessionMessagesById[normalized];\n }\n }\n return [];\n}\n\nfunction resolveSessionTitle(\n session: AgentActivitySession,\n messages: readonly AgentActivityMessage[]\n): string {\n const title = session.title.trim();\n if (title) {\n return title;\n }\n return (\n firstUserMessageText(messages) || session.provider || session.agentSessionId\n );\n}\n\nfunction firstUserMessageText(\n messages: readonly AgentActivityMessage[]\n): string {\n for (const message of messages) {\n if (message.role.trim().toLowerCase() !== \"user\") {\n continue;\n }\n const summary = messageSummary(message);\n if (summary) {\n return summary;\n }\n }\n return \"\";\n}\n\nfunction pendingPromptFromMessages(\n messages: readonly AgentActivityMessage[]\n): AgentConversationPromptVM | null {\n for (const message of [...messages].sort(compareMessagesByRecentTime)) {\n if (isTerminalMessageStatus(message.status)) {\n continue;\n }\n const approval = approvalPromptFromMessage(message);\n if (approval) {\n return approval;\n }\n const askUser = askUserPromptFromMessage(message);\n if (askUser) {\n return askUser;\n }\n const exitPlan = exitPlanPromptFromMessage(message);\n if (exitPlan) {\n return exitPlan;\n }\n }\n return null;\n}\n\nfunction approvalPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!isPermissionMessage(message)) {\n return null;\n }\n const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n const requestId =\n stringValue(input.requestId) ??\n stringValue(payload.requestId) ??\n stringValue(payload.approvalRequestId) ??\n message.messageId;\n const options = [\n ...arrayValue(input.options),\n ...arrayValue(payload.options)\n ].flatMap((option) => {\n const record = recordValue(option);\n const id =\n stringValue(record.optionId) ??\n stringValue(record.id) ??\n stringValue(record.kind);\n if (!id) {\n return [];\n }\n return [\n {\n id,\n label:\n stringValue(record.name) ??\n stringValue(record.label) ??\n stringValue(record.title) ??\n id,\n kind: stringValue(record.kind) ?? id,\n ...(stringValue(record.description)\n ? { description: stringValue(record.description) as string }\n : {})\n }\n ];\n });\n if (options.length === 0) {\n return null;\n }\n return {\n kind: \"approval\",\n id: `approval:${requestId}`,\n turnId: message.turnId ?? \"turn:unknown\",\n requestId,\n callId: stringValue(payload.callId) ?? message.messageId,\n title: firstNonEmptyString(\n 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 const questions = arrayValue(payload.questions).flatMap((value, index) => {\n const question = recordValue(value);\n const id = stringValue(question.id) ?? `question-${index + 1}`;\n const label =\n stringValue(question.question) ??\n stringValue(question.header) ??\n stringValue(question.label);\n if (!label) {\n return [];\n }\n return [\n {\n id,\n header: stringValue(question.header) ?? label,\n question: label,\n options: arrayValue(question.options).flatMap((optionValue) => {\n const option = recordValue(optionValue);\n const optionLabel = stringValue(option.label);\n return optionLabel\n ? [\n {\n label: optionLabel,\n description: stringValue(option.description) ?? \"\"\n }\n ]\n : [];\n }),\n multiSelect: Boolean(question.multiSelect),\n answer: null\n }\n ];\n });\n if (questions.length === 0) {\n return null;\n }\n return {\n kind: \"ask-user\",\n requestId:\n stringValue(payload.requestId) ??\n stringValue(payload.interactiveRequestId) ??\n message.messageId,\n title:\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message),\n questions\n };\n}\n\nfunction exitPlanPromptFromMessage(\n message: AgentActivityMessage\n): AgentConversationPromptVM | null {\n if (!includesAny(normalizedMetadataValues(message), [\"exitplanmode\"])) {\n return null;\n }\n const payload = recordValue(message.payload);\n return {\n kind: \"exit-plan\",\n requestId: stringValue(payload.requestId) ?? message.messageId,\n title:\n stringValue(payload.title) ??\n stringValue(payload.summary) ??\n messageSummary(message)\n };\n}\n\nfunction latestAgentMessage(\n messages: readonly AgentActivityMessage[]\n): { summary: string; occurredAtUnixMs: number } | null {\n return messages.reduce<{ summary: string; occurredAtUnixMs: number } | null>(\n (latest, message) => {\n if (!isAgentMessageRole(message.role)) {\n return latest;\n }\n const summary = messageSummary(message);\n if (!summary) {\n return latest;\n }\n const occurredAtUnixMs = messageTimeUnixMs(message);\n if (!latest || occurredAtUnixMs >= latest.occurredAtUnixMs) {\n return { summary, occurredAtUnixMs };\n }\n return latest;\n },\n null\n );\n}\n\nfunction fallbackPromptFromNeedsAttention(\n item: AgentActivityNeedsAttentionItem | null,\n labels: WorkspaceAgentMessageCenterPromptFallbackLabels | undefined\n): AgentConversationPromptVM | null {\n if (!item || item.kind === \"permission\" || !labels) {\n return null;\n }\n return {\n kind: \"ask-user\",\n requestId: requestIdFromNeedsAttentionItem(item),\n title: item.summary || item.title || labels.title,\n questions: [\n {\n id: \"response\",\n header:\n item.kind === \"constraint\"\n ? labels.constraintHeader\n : labels.inputHeader,\n question: item.summary || item.title || labels.question,\n options: [],\n multiSelect: false,\n answer: null\n }\n ]\n };\n}\n\nfunction requestIdFromNeedsAttentionItem(\n item: AgentActivityNeedsAttentionItem\n): string {\n const [, messageId] = item.id.split(\":\", 2);\n return messageId?.trim() || item.id;\n}\n\nfunction countMessageCenterItems(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): WorkspaceAgentMessageCenterCounts {\n return items.reduce<WorkspaceAgentMessageCenterCounts>(\n (counts, item) => {\n counts.all += 1;\n if (isWaitingMessageCenterItem(item)) {\n counts.waiting += 1;\n return counts;\n }\n if (isCompletedMessageCenterItem(item)) {\n counts.completed += 1;\n return counts;\n }\n switch (item.status) {\n case \"working\":\n counts.working += 1;\n break;\n case \"failed\":\n counts.failed += 1;\n break;\n default:\n break;\n }\n return counts;\n },\n { ...EMPTY_COUNTS }\n );\n}\n\nfunction compareMessageCenterItems(\n left: WorkspaceAgentMessageCenterItem,\n right: WorkspaceAgentMessageCenterItem\n): number {\n const leftWaiting = isWaitingMessageCenterItem(left);\n const rightWaiting = isWaitingMessageCenterItem(right);\n if (leftWaiting !== rightWaiting) {\n return leftWaiting ? -1 : 1;\n }\n return (\n right.sortTimeUnixMs - left.sortTimeUnixMs ||\n left.agentSessionId.localeCompare(right.agentSessionId)\n );\n}\n\nfunction isAgentMessageRole(role: string): boolean {\n const normalized = role.trim().toLowerCase();\n return normalized === \"assistant\" || normalized === \"agent\";\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n switch (status?.trim().toLowerCase()) {\n case \"answered\":\n case \"canceled\":\n case \"cancelled\":\n case \"completed\":\n case \"failed\":\n case \"rejected\":\n case \"resolved\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isPermissionMessage(message: AgentActivityMessage): boolean {\n return includesAny(normalizedMetadataValues(message), [\n \"permission\",\n \"approval\"\n ]);\n}\n\nfunction isQuestionMessage(message: AgentActivityMessage): boolean {\n return includesAny(normalizedMetadataValues(message), [\n \"ask_user\",\n \"ask-user\",\n \"askuserquestion\",\n \"question\"\n ]);\n}\n\nfunction normalizedMetadataValues(message: AgentActivityMessage): string {\n const payload = recordValue(message.payload);\n const input = recordValue(payload.input);\n return [\n message.kind,\n message.status ?? \"\",\n stringValue(payload.type) ?? \"\",\n stringValue(payload.action) ?? \"\",\n stringValue(payload.requestType) ?? \"\",\n stringValue(payload.callType) ?? \"\",\n stringValue(payload.toolName) ?? \"\",\n stringValue(payload.name) ?? \"\",\n stringValue(payload.status) ?? \"\",\n stringValue(input.type) ?? \"\",\n stringValue(input.action) ?? \"\",\n stringValue(input.requestType) ?? \"\",\n stringValue(input.callType) ?? \"\",\n stringValue(input.toolName) ?? \"\",\n stringValue(input.name) ?? \"\",\n stringValue(input.status) ?? \"\"\n ]\n .join(\" \")\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nfunction compareMessagesByRecentTime(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n messageTimeUnixMs(right) - messageTimeUnixMs(left) ||\n right.version - left.version ||\n right.messageId.localeCompare(left.messageId)\n );\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) =>\n value.includes(needle.replace(/[_\\s-]+/g, \"\").toLowerCase())\n );\n}\n\nfunction messageSummary(message: AgentActivityMessage): string {\n return firstNonEmptyString(\n stringValue(message.payload.summary),\n stringValue(message.payload.text),\n stringValue(message.payload.content),\n stringValue(message.payload.message),\n stringValue(message.payload.body),\n stringValue(message.payload.title)\n );\n}\n\nfunction messageTimeUnixMs(message: AgentActivityMessage): number {\n return (\n positiveNumber(message.occurredAtUnixMs) ??\n positiveNumber(message.completedAtUnixMs) ??\n positiveNumber(message.startedAtUnixMs) ??\n positiveNumber(message.version) ??\n 0\n );\n}\n\nfunction firstNonEmptyString(...values: Array<string | null>): string {\n return values.find((value) => value !== null && value.length > 0) ?? \"\";\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n","import type { TranslateFn } from \"../i18n/index\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport {\n isWaitingMessageCenterItem,\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 label: string;\n items: WorkspaceAgentMessageCenterItem[];\n}\n\nexport interface MessageCenterProviderStack {\n provider: string;\n items: WorkspaceAgentMessageCenterItem[];\n}\n\nexport function partitionMessageCenterItemsByProvider(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): MessageCenterProviderStack[] {\n const stacks = new Map<string, MessageCenterProviderStack>();\n for (const item of items) {\n const stack = stacks.get(item.provider);\n if (stack) {\n stack.items.push(item);\n } else {\n stacks.set(item.provider, { provider: item.provider, items: [item] });\n }\n }\n return [...stacks.values()];\n}\n\nexport function buildMessageCenterStatusOptions(\n counts: WorkspaceAgentMessageCenterModel[\"counts\"],\n t: MessageCenterTranslate\n): MessageCenterStatusOption[] {\n return [\n {\n count: counts.waiting,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWaiting\"),\n value: \"waiting\"\n },\n {\n count: counts.failed,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterFailed\"),\n value: \"failed\"\n },\n {\n count: counts.working,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n value: \"working\"\n },\n {\n count: counts.completed,\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n value: \"completed\"\n }\n ];\n}\n\nexport function buildMessageCenterProviderOptions(\n items: readonly WorkspaceAgentMessageCenterItem[]\n): MessageCenterProviderOption[] {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.provider, (counts.get(item.provider) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([value, count]) => ({\n count,\n label: workspaceAgentProviderLabel(value),\n value\n }))\n .sort((left, right) => left.label.localeCompare(right.label));\n}\n\nexport function itemMatchesViewFilters({\n item,\n providerFilters,\n statusFilters\n}: {\n item: WorkspaceAgentMessageCenterItem;\n providerFilters: Set<string> | null;\n statusFilters: Set<MessageCenterStatusFilter> | null;\n}): boolean {\n if (\n statusFilters &&\n !statusFilters.has(messageCenterStatusFilterValue(item))\n ) {\n return false;\n }\n if (providerFilters && !providerFilters.has(item.provider)) {\n return false;\n }\n return true;\n}\n\nexport function messageCenterStatusFilterValue(\n item: WorkspaceAgentMessageCenterItem\n): MessageCenterStatusFilter {\n if (isWaitingMessageCenterItem(item)) {\n return \"waiting\";\n }\n if (item.status === \"failed\") {\n return \"failed\";\n }\n if (item.status === \"working\") {\n return \"working\";\n }\n return \"completed\";\n}\n\nexport function groupMessageCenterItems(\n items: readonly WorkspaceAgentMessageCenterItem[],\n groupBy: MessageCenterGroupBy,\n t: MessageCenterTranslate\n): MessageCenterGroup[] {\n switch (groupBy) {\n case \"status\":\n return groupByFixedDefinitions(items, [\n {\n id: \"waiting\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWaiting\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"waiting\"\n },\n {\n id: \"failed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterFailed\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"failed\"\n },\n {\n id: \"working\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"working\"\n },\n {\n id: \"completed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"completed\"\n }\n ]);\n case \"agent\":\n return groupByDynamicKey(items, (item) => ({\n id: `agent:${item.provider}`,\n label: workspaceAgentProviderLabel(item.provider)\n }));\n case \"time\":\n return groupByFixedDefinitions(items, [\n {\n id: \"today\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupToday\"),\n match: (item) => messageCenterTimeGroup(item) === \"today\"\n },\n {\n id: \"yesterday\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupYesterday\"),\n match: (item) => messageCenterTimeGroup(item) === \"yesterday\"\n },\n {\n id: \"previous-seven-days\",\n label: t(\n \"agentHost.workspaceAgentMessageCenterGroupPreviousSevenDays\"\n ),\n match: (item) =>\n messageCenterTimeGroup(item) === \"previous-seven-days\"\n },\n {\n id: \"older\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupOlder\"),\n match: (item) => messageCenterTimeGroup(item) === \"older\"\n }\n ]);\n case \"priority\":\n default: {\n const nowUnixMs = Date.now();\n return groupByFixedDefinitions(items, [\n {\n id: \"needs-attention\",\n label: t(\"agentHost.workspaceAgentMessageCenterGroupNeedsAttention\"),\n match: (item) =>\n messageCenterStatusFilterValue(item) === \"waiting\" ||\n messageCenterStatusFilterValue(item) === \"failed\"\n },\n {\n id: \"working\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterWorking\"),\n match: (item) => messageCenterStatusFilterValue(item) === \"working\"\n },\n {\n id: \"recently-completed\",\n label: t(\n \"agentHost.workspaceAgentMessageCenterGroupRecentlyCompleted\"\n ),\n match: (item) => isRecentlyCompletedMessageCenterItem(item, nowUnixMs)\n },\n {\n id: \"completed\",\n label: t(\"agentHost.workspaceAgentMessageCenterFilterCompleted\"),\n match: (item) =>\n messageCenterStatusFilterValue(item) === \"completed\" &&\n !isRecentlyCompletedMessageCenterItem(item, nowUnixMs)\n }\n ]);\n }\n }\n}\n\nconst RECENTLY_COMPLETED_WINDOW_MS = 10 * 60 * 1000;\n\nexport function isRecentlyCompletedMessageCenterItem(\n item: WorkspaceAgentMessageCenterItem,\n nowUnixMs: number\n): boolean {\n if (messageCenterStatusFilterValue(item) !== \"completed\") {\n return false;\n }\n const completedAtUnixMs =\n item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;\n if (completedAtUnixMs <= 0) {\n return false;\n }\n return completedAtUnixMs >= nowUnixMs - RECENTLY_COMPLETED_WINDOW_MS;\n}\n\nexport function messageCenterGroupLabel(\n groupBy: MessageCenterGroupBy,\n t: MessageCenterTranslate\n): string {\n switch (groupBy) {\n case \"status\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupStatus\");\n case \"agent\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupAgent\");\n case \"time\":\n return t(\"agentHost.workspaceAgentMessageCenterGroupTime\");\n case \"priority\":\n default:\n return t(\"agentHost.workspaceAgentMessageCenterGroupPriority\");\n }\n}\n\nexport function statusFilterSummary(\n statusFilters: Set<MessageCenterStatusFilter> | null,\n statusOptions: readonly MessageCenterStatusOption[]\n): string {\n if (statusFilters === null || statusFilters.size === statusOptions.length) {\n return statusOptions.map((option) => option.label).join(\", \");\n }\n return statusOptions\n .filter((option) => statusFilters.has(option.value))\n .map((option) => option.label)\n .join(\", \");\n}\n\nfunction groupByFixedDefinitions(\n items: readonly WorkspaceAgentMessageCenterItem[],\n definitions: Array<{\n id: string;\n label: string;\n match: (item: WorkspaceAgentMessageCenterItem) => boolean;\n }>\n): MessageCenterGroup[] {\n return definitions\n .map((definition) => ({\n id: definition.id,\n label: definition.label,\n items: items.filter(definition.match)\n }))\n .filter((group) => group.items.length > 0);\n}\n\nfunction groupByDynamicKey(\n items: readonly WorkspaceAgentMessageCenterItem[],\n keyForItem: (item: WorkspaceAgentMessageCenterItem) => {\n id: string;\n label: string;\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 } 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 {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type AnimationEvent as ReactAnimationEvent,\n type JSX,\n type PointerEvent as ReactPointerEvent,\n type ReactNode\n} from \"react\";\nimport { ChevronDown, ChevronUp, ExternalLink, Info } from \"lucide-react\";\nimport {\n Button,\n cn,\n StatusDot,\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\nimport { useTranslation } from \"../i18n/index\";\nimport { normalizeAgentTitleText } from \"../shared/utils/agentTitleText\";\nimport { AgentInteractivePromptSurface } from \"../shared/agentConversation/components/AgentInteractivePromptSurface\";\nimport { AgentMessageMarkdown } from \"../shared/AgentMessageMarkdown\";\nimport { AgentVerticalScrollArea } from \"../shared/AgentVerticalScrollArea\";\nimport { managedAgentRoundedIconUrl } from \"../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../shared/workspaceAgentActivityStatusLabel\";\nimport { workspaceAgentProviderLabel } from \"../shared/workspaceAgentProviderLabel\";\nimport userAvatarPlaceholderUrl from \"../app/renderer/assets/icons/user-avatar-placeholder.png\";\nimport type { WorkspaceLinkAction } from \"../actions/workspaceLinkActions\";\nimport {\n isWaitingMessageCenterItem,\n type WorkspaceAgentMessageCenterIdentity,\n type WorkspaceAgentMessageCenterItem\n} from \"./workspaceAgentMessageCenterModel\";\n\nexport interface WorkspaceAgentMessageCenterCardProps {\n item: WorkspaceAgentMessageCenterItem;\n cardRef?: (node: HTMLElement | null) => void;\n highlighted?: boolean;\n isSubmitting: boolean;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n onSubmitPrompt: (input: {\n action?: string;\n optionId?: string;\n payload?: Record<string, unknown>;\n requestId: string;\n }) => void;\n}\n\nfunction stopMessageCenterTextPointerPropagation(\n event: ReactPointerEvent<HTMLElement>\n): void {\n event.stopPropagation();\n}\n\nexport function WorkspaceAgentMessageCenterCard({\n cardRef,\n highlighted = false,\n item,\n isSubmitting,\n onLinkAction,\n onOpenChat,\n onSubmitPrompt\n}: WorkspaceAgentMessageCenterCardProps): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n const prompt = item.pendingPrompt;\n const displayTitle = normalizeAgentTitleText(item.title);\n const summary = messageCenterVisibleSummary(item);\n const displayStatus = statusClass(item);\n const statusLabel = workspaceAgentActivityStatusLabel(displayStatus, t);\n\n return (\n <article\n ref={cardRef}\n className={cn(\n \"workspace-agent-message-center__card group/message-card flex min-w-0 flex-col gap-2.5 rounded-lg border border-[var(--line-2)] bg-[var(--background-fronted)] p-3.5 outline outline-0 outline-offset-2 outline-transparent transition-[background-color,border-color,outline-color]\",\n isWaitingMessageCenterItem(item) &&\n \"agent-gui-edge-glow border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)]\",\n highlighted && \"outline-2 outline-[var(--accent)]\"\n )}\n data-highlighted={highlighted ? \"true\" : undefined}\n data-message-center-item-id={item.id}\n data-waiting={isWaitingMessageCenterItem(item) ? \"true\" : undefined}\n data-status={displayStatus}\n tabIndex={highlighted ? -1 : undefined}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2.5\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <h3\n className=\"workspace-agent-message-center__copy-text min-w-0 truncate text-[13px] font-bold leading-5 text-[var(--text-secondary)]\"\n onPointerDown={stopMessageCenterTextPointerPropagation}\n >\n {displayTitle}\n </h3>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-[min(360px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n >\n {displayTitle}\n </TooltipContent>\n </Tooltip>\n {item.cwd ? <ProjectPathInfo path={item.cwd} /> : null}\n </div>\n <span\n className=\"workspace-agent-message-center__status inline-flex shrink-0 items-center gap-1.5 text-[11px] font-semibold leading-4 text-[var(--text-secondary)]\"\n data-status={displayStatus}\n title={statusLabel}\n >\n <StatusDot\n tone={messageCenterStatusTone(item)}\n pulse={\n isWaitingMessageCenterItem(item) || item.status === \"working\"\n }\n size=\"sm\"\n title={statusLabel}\n />\n <span>{statusLabel}</span>\n </span>\n </div>\n\n {summary ? (\n <MessageCenterSummary\n item={item}\n onLinkAction={onLinkAction}\n summary={summary}\n emptyLabel={t(\"agentHost.workspaceAgentMessageCenterNoSummary\")}\n />\n ) : null}\n\n {prompt ? (\n <div className=\"min-w-0\">\n <AgentInteractivePromptSurface\n embedded\n keyboardShortcuts={false}\n prompt={prompt}\n isSubmitting={isSubmitting}\n onSubmit={onSubmitPrompt}\n labels={buildWorkspaceAgentInteractivePromptLabels(\n t,\n item.provider\n )}\n />\n </div>\n ) : null}\n\n <MessageCenterOpenChatButton\n provider={item.provider}\n item={item}\n label={t(\"agentHost.workspaceAgentMessageCenterOpenChat\")}\n onOpenChat={onOpenChat}\n />\n </article>\n );\n}\n\nconst STACK_PRESENCE_FALLBACK_MS = 380;\n\nfunction useStackRegionPresence(visible: boolean): {\n closing: boolean;\n mounted: boolean;\n onAnimationEnd: (event: ReactAnimationEvent<HTMLDivElement>) => void;\n} {\n const [mounted, setMounted] = useState(visible);\n const closing = mounted && !visible;\n\n useLayoutEffect(() => {\n if (visible) {\n setMounted(true);\n }\n }, [visible]);\n\n useEffect(() => {\n if (!closing) {\n return undefined;\n }\n const timeoutId = window.setTimeout(() => {\n setMounted(false);\n }, STACK_PRESENCE_FALLBACK_MS);\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [closing]);\n\n const onAnimationEnd = useCallback(\n (event: ReactAnimationEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget && closing) {\n setMounted(false);\n }\n },\n [closing]\n );\n\n return { closing, mounted, onAnimationEnd };\n}\n\nexport function WorkspaceAgentMessageCenterStack({\n className,\n expanded,\n groupId,\n items,\n renderCard,\n onCollapse,\n onExpand\n}: {\n className?: string;\n expanded: boolean;\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n renderCard: (\n item: WorkspaceAgentMessageCenterItem,\n options?: { stackedIndex?: number }\n ) => ReactNode;\n onCollapse: () => void;\n onExpand: () => void;\n}): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const summaryRegion = useStackRegionPresence(!expanded);\n const cardsRegion = useStackRegionPresence(expanded);\n if (items.length < 2) {\n return null;\n }\n const collapseLabel = t(\n \"agentHost.workspaceAgentMessageCenterCollapseStackAria\"\n );\n\n return (\n <div\n className={cn(\"relative flex min-w-0 flex-col\", className)}\n data-stack-count={items.length}\n data-stack-motion=\"smooth\"\n data-stack-state={expanded ? \"expanded\" : \"collapsed\"}\n data-stack-top-item-id={items[0]?.id}\n data-testid={`workspace-agent-message-stack-${groupId}`}\n >\n {summaryRegion.mounted ? (\n <div\n className={cn(\n \"workspace-agent-message-center__stack-rest min-w-0\",\n summaryRegion.closing\n ? \"workspace-agent-message-center__stack-rest--closing\"\n : \"workspace-agent-message-center__stack-rest--opening\"\n )}\n onAnimationEnd={summaryRegion.onAnimationEnd}\n >\n <div\n className=\"min-h-0 min-w-0 overflow-hidden\"\n aria-hidden={summaryRegion.closing ? true : undefined}\n inert={summaryRegion.closing ? true : undefined}\n >\n <MessageCenterStackSummary\n groupId={groupId}\n items={items}\n onExpand={onExpand}\n />\n </div>\n </div>\n ) : null}\n\n {cardsRegion.mounted ? (\n <div\n className={cn(\n \"workspace-agent-message-center__stack-rest min-w-0\",\n cardsRegion.closing\n ? \"workspace-agent-message-center__stack-rest--closing\"\n : \"workspace-agent-message-center__stack-rest--opening\"\n )}\n onAnimationEnd={cardsRegion.onAnimationEnd}\n >\n <div\n className=\"min-h-0 min-w-0 overflow-hidden\"\n aria-hidden={cardsRegion.closing ? true : undefined}\n inert={cardsRegion.closing ? true : undefined}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-2 px-0.5 pb-1.5\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-[13px] font-semibold leading-4 text-[var(--text-tertiary)]\">\n <img\n src={managedAgentRoundedIconUrl(items[0]?.provider ?? \"\")}\n alt=\"\"\n className=\"size-4 shrink-0 rounded-full\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n aria-hidden=\"true\"\n />\n <span className=\"min-w-0 truncate\">\n {t(\"agentHost.workspaceAgentMessageCenterStackSummaryCount\", {\n count: items.length\n })}\n </span>\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={collapseLabel}\n className=\"size-6 text-[var(--text-tertiary)] hover:text-[var(--text-primary)]\"\n onClick={onCollapse}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" align=\"center\">\n {collapseLabel}\n </TooltipContent>\n </Tooltip>\n </div>\n <div className=\"flex min-w-0 flex-col gap-2.5\">\n {items.map((item, stackedIndex) =>\n renderCard(item, { stackedIndex })\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MessageCenterStackSummary({\n groupId,\n items,\n onExpand\n}: {\n groupId: string;\n items: WorkspaceAgentMessageCenterItem[];\n onExpand: () => void;\n}): JSX.Element | null {\n \"use memo\";\n const { t } = useTranslation();\n const firstItem = items[0];\n const hasWaiting = items.some((item) => isWaitingMessageCenterItem(item));\n if (!firstItem) {\n return null;\n }\n\n return (\n <button\n type=\"button\"\n aria-label={t(\"agentHost.workspaceAgentMessageCenterExpandStackAria\", {\n count: items.length\n })}\n className={cn(\n \"group/stack-peek relative block w-full min-w-0 rounded-lg text-left outline-none focus-visible:ring-2 focus-visible:ring-[var(--accent)]\",\n items.length > 2 ? \"pb-[18px]\" : \"pb-[10px]\"\n )}\n data-stack-summary-count={items.length}\n data-stack-provider={firstItem.provider}\n data-testid={`workspace-agent-message-stack-summary-${groupId}`}\n onClick={onExpand}\n >\n <span\n className={cn(\n \"relative z-10 flex min-w-0 flex-col gap-2 rounded-lg border border-[var(--line-2)] bg-[var(--background-fronted)] p-3.5 transition-[background-color,border-color] duration-200 group-hover/stack-peek:bg-[var(--transparency-hover)]\",\n items.length > 2\n ? \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2),0_14px_0_-8px_var(--background-fronted),0_14px_0_-7px_var(--line-2)]\"\n : \"shadow-[0_7px_0_-4px_var(--background-fronted),0_7px_0_-3px_var(--line-2)]\",\n hasWaiting &&\n \"border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)]\"\n )}\n >\n <span className=\"flex min-w-0 items-center justify-between gap-2.5\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <img\n src={managedAgentRoundedIconUrl(firstItem.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 <span className=\"min-w-0 truncate text-[13px] font-bold leading-5 text-[var(--text-secondary)]\">\n {t(\"agentHost.workspaceAgentMessageCenterStackSummaryCount\", {\n count: items.length\n })}\n </span>\n </span>\n <ChevronDown\n className=\"size-4 shrink-0 text-[var(--text-tertiary)] transition-transform duration-200 group-hover/stack-peek:translate-y-0.5 motion-reduce:transition-none\"\n aria-hidden=\"true\"\n />\n </span>\n <span className=\"min-w-0 rounded-md bg-transparency-block p-2.5 text-[13px] leading-[1.45] text-[var(--text-primary)]\">\n <span className=\"line-clamp-2 min-w-0 [overflow-wrap:anywhere]\">\n {messageCenterStackPreviewText(firstItem)}\n </span>\n </span>\n </span>\n </button>\n );\n}\n\nfunction messageCenterStackPreviewText(\n item: WorkspaceAgentMessageCenterItem\n): string {\n return (\n item.lastAgentMessageSummary.trim() || normalizeAgentTitleText(item.title)\n );\n}\n\nexport function resolveMessageCenterNotificationAction(\n item: WorkspaceAgentMessageCenterItem,\n input: {\n action?: string;\n optionId?: string;\n }\n): string | null {\n if (input.action) {\n return normalizeMessageCenterNotificationAction(input.action);\n }\n\n if (!input.optionId) {\n return null;\n }\n\n const prompt = item.pendingPrompt;\n const option =\n prompt && \"options\" in prompt\n ? prompt.options.find((candidate) => candidate.id === input.optionId)\n : null;\n const optionToken = `${option?.kind ?? \"\"}:${input.optionId}`.toLowerCase();\n if (optionToken.includes(\"allow\") || optionToken.includes(\"accept\")) {\n return \"accept\";\n }\n if (\n optionToken.includes(\"deny\") ||\n optionToken.includes(\"reject\") ||\n optionToken.includes(\"disallow\")\n ) {\n return \"reject\";\n }\n return input.optionId;\n}\n\nexport function buildWorkspaceAgentInteractivePromptLabels(\n t: ReturnType<typeof useTranslation>[\"t\"],\n provider?: string\n) {\n return {\n approvalLead: t(\"agentHost.agentGui.approvalRequired\", {\n provider: provider\n ? workspaceAgentProviderLabel(provider)\n : t(\"agentHost.workspaceAgentsGenericAgentName\")\n }),\n planLead: t(\"agentHost.agentGui.planLead\"),\n planModes: [\n {\n id: \"acceptEdits\",\n label: t(\"agentHost.agentGui.planModes.acceptEdits.label\"),\n description: t(\"agentHost.agentGui.planModes.acceptEdits.description\")\n },\n {\n id: \"default\",\n label: t(\"agentHost.agentGui.planModes.askFirst.label\"),\n description: t(\"agentHost.agentGui.planModes.askFirst.description\")\n },\n {\n id: \"bypassPermissions\",\n label: t(\"agentHost.agentGui.planModes.allowAll.label\"),\n description: t(\"agentHost.agentGui.planModes.allowAll.description\")\n }\n ],\n stayInPlan: t(\"agentHost.agentGui.stayInPlan\"),\n sendFeedback: t(\"agentHost.agentGui.sendFeedback\"),\n feedbackPlaceholder: t(\"agentHost.agentGui.feedbackPlaceholder\"),\n previousQuestion: t(\"agentHost.agentGui.previousQuestion\"),\n nextQuestion: t(\"agentHost.agentGui.nextQuestion\"),\n submitAnswers: t(\"agentHost.agentGui.submitAnswers\"),\n answerPlaceholder: t(\"agentHost.agentGui.answerPlaceholder\"),\n waitingForAnswer: t(\"agentHost.agentGui.waitingForAnswer\")\n };\n}\n\nfunction normalizeMessageCenterNotificationAction(action: string): string {\n switch (action) {\n case \"allow\":\n return \"accept\";\n case \"deny\":\n return \"reject\";\n default:\n return action;\n }\n}\n\nfunction messageCenterVisibleSummary(\n item: WorkspaceAgentMessageCenterItem\n): string {\n const summary = item.lastAgentMessageSummary.trim();\n if (\n item.pendingPrompt?.kind === \"approval\" &&\n isGenericApprovalSummary(summary)\n ) {\n return \"\";\n }\n return summary;\n}\n\nfunction isGenericApprovalSummary(summary: string): boolean {\n const normalized = summary.trim().toLowerCase();\n return normalized === \"approval\";\n}\n\nfunction MessageCenterSummary({\n emptyLabel,\n item,\n onLinkAction,\n summary\n}: {\n emptyLabel: string;\n item: WorkspaceAgentMessageCenterItem;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n summary: string;\n}): JSX.Element {\n \"use memo\";\n const summaryRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const handleLinkAction = useCallback(\n (action: WorkspaceLinkAction): void => {\n onLinkAction?.(\n action.type === \"open-agent-session\" && !action.provider\n ? { ...action, provider: item.provider }\n : action\n );\n },\n [item.provider, onLinkAction]\n );\n\n useLayoutEffect(() => {\n const element = summaryRef.current;\n if (!element) {\n return;\n }\n\n const updateOverflowState = () => {\n setIsOverflowing(element.scrollHeight > element.clientHeight + 1);\n };\n\n updateOverflowState();\n const resizeObserver = new ResizeObserver(updateOverflowState);\n resizeObserver.observe(element);\n return () => {\n resizeObserver.disconnect();\n };\n }, [summary]);\n\n return (\n <AgentVerticalScrollArea\n ref={summaryRef}\n className={cn(\n \"workspace-agent-message-center__summary workspace-agent-message-center__copy-text max-h-[160px] min-w-0 rounded-md bg-transparency-block text-[13px] leading-[1.45] text-[var(--text-primary)] [overflow-wrap:anywhere]\",\n isOverflowing && \"workspace-agent-message-center__summary--overflowing\"\n )}\n viewportClassName=\"workspace-agent-message-center__copy-text max-h-[160px] p-2.5 pr-4\"\n onPointerDown={stopMessageCenterTextPointerPropagation}\n scrollbarClassName=\"top-2 bottom-2 right-1.5\"\n syncKey={summary}\n >\n {summary ? (\n <AgentMessageMarkdown\n content={summary}\n className=\"[&_a]:text-[var(--tutti-purple)] [&_code]:text-[var(--text-secondary)] [&_hr]:border-t-[color-mix(in_srgb,var(--text-primary)_14%,transparent)] [&_ol]:!bg-transparent [&_p]:m-0 [&_th]:bg-[color-mix(in_srgb,var(--background-panel)_94%,var(--text-primary))] [&_th]:text-[var(--text-primary)] [&_ul]:!bg-transparent text-[var(--text-primary)]\"\n onLinkAction={handleLinkAction}\n workspaceLinkContext={{\n workspaceRoot: item.cwd || null,\n basePath: item.cwd,\n source: \"agent-markdown\"\n }}\n enableImageZoom\n />\n ) : (\n emptyLabel\n )}\n </AgentVerticalScrollArea>\n );\n}\n\nfunction MessageCenterOpenChatButton({\n item,\n label,\n onOpenChat,\n provider\n}: {\n item: WorkspaceAgentMessageCenterItem;\n label: string;\n onOpenChat: (input: { agentSessionId: string; provider: string }) => void;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n return (\n <div className=\"workspace-agent-message-center__footer flex min-w-0 items-center justify-between gap-2\">\n <MessageCenterIdentityLabel\n identity={item.identity}\n provider={provider}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"default\"\n className=\"workspace-agent-message-center__open-chat-button invisible h-auto gap-1.5 border-0 bg-transparent p-0 text-[var(--agent-gui-accent)] opacity-0 shadow-none transition-[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-transparent hover:text-[var(--agent-gui-accent)] focus-visible:bg-transparent focus-visible:text-[var(--agent-gui-accent)] active:bg-transparent\"\n onClick={() =>\n onOpenChat({\n agentSessionId: item.agentSessionId,\n provider: item.provider\n })\n }\n >\n <ExternalLink\n className=\"size-[15px]\"\n strokeWidth={2.2}\n aria-hidden=\"true\"\n />\n {label}\n </Button>\n </div>\n );\n}\n\nfunction MessageCenterIdentityLabel({\n identity,\n provider\n}: {\n identity: WorkspaceAgentMessageCenterIdentity | null;\n provider: string;\n}): JSX.Element {\n \"use memo\";\n\n if (!identity) {\n return <AgentProviderLabel provider={provider} />;\n }\n\n const agentAvatarUrl =\n identity.agentAvatarUrl?.trim() || managedAgentRoundedIconUrl(provider);\n const title = `${identity.userName} & ${identity.agentName}`;\n\n return (\n <span\n className=\"workspace-agent-message-center__identity inline-flex min-w-0 max-w-full items-center gap-2\"\n title={title}\n >\n <MessageCenterIdentityAvatarStack\n userAvatarUrl={identity.userAvatarUrl}\n userName={identity.userName}\n agentAvatarUrl={agentAvatarUrl}\n />\n <span className=\"workspace-agent-message-center__identity-names flex min-w-0 items-center gap-1 truncate text-[var(--text-secondary)]\">\n <span className=\"min-w-0 truncate\">{identity.userName}</span>\n <span className=\"shrink-0 text-[var(--text-tertiary)]\">&</span>\n <span className=\"min-w-0 truncate\">{identity.agentName}</span>\n </span>\n </span>\n );\n}\n\nfunction MessageCenterIdentityAvatarStack({\n agentAvatarUrl,\n userAvatarUrl: rawUserAvatarUrl,\n userName\n}: {\n agentAvatarUrl: string;\n userAvatarUrl?: string;\n userName: string;\n}): JSX.Element {\n \"use memo\";\n const [userAvatarFailed, setUserAvatarFailed] = useState(false);\n const userAvatarUrl = rawUserAvatarUrl?.trim() ?? \"\";\n const userImageUrl =\n userAvatarUrl.length > 0 && !userAvatarFailed\n ? userAvatarUrl\n : userAvatarPlaceholderUrl;\n\n useEffect(() => {\n setUserAvatarFailed(false);\n }, [userAvatarUrl]);\n\n return (\n <span\n className=\"workspace-agent-message-center__identity-avatar-stack inline-flex w-9 shrink-0 items-center\"\n aria-hidden=\"true\"\n >\n <span className=\"inline-flex size-5 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)] ring-2 ring-[var(--background-fronted)]\">\n <img\n src={userImageUrl}\n alt={userName}\n className=\"size-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={() => {\n setUserAvatarFailed(true);\n }}\n />\n </span>\n <span className=\"-ml-1.5 inline-flex size-5 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)] ring-2 ring-[var(--background-fronted)]\">\n <img\n src={agentAvatarUrl}\n alt=\"\"\n className=\"size-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n}\n\nfunction ProjectPathInfo({ path }: { path: string }): JSX.Element {\n \"use memo\";\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"workspace-agent-message-center__project-info-button invisible inline-flex size-5 shrink-0 items-center justify-center rounded-sm text-[var(--text-secondary)] opacity-0 transition-[background-color,color,opacity,visibility] group-hover/message-card:visible group-hover/message-card:opacity-100 group-focus-within/message-card:visible group-focus-within/message-card:opacity-100 hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] focus-visible:bg-[var(--transparency-hover)] focus-visible:text-[var(--text-primary)] focus-visible:outline-none\"\n aria-label={path}\n >\n <Info className=\"size-3.5\" strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"start\"\n className=\"max-w-[320px] text-[11px] [overflow-wrap:anywhere]\"\n >\n {path}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction AgentProviderLabel({ provider }: { provider: string }): JSX.Element {\n \"use memo\";\n const label = workspaceAgentProviderLabel(provider);\n\n return (\n <span className=\"workspace-agent-message-center__provider inline-flex min-w-0 max-w-full items-center gap-1.5\">\n <img\n src={managedAgentRoundedIconUrl(provider)}\n alt=\"\"\n className=\"workspace-agent-message-center__provider-icon size-5 shrink-0 rounded-full\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n aria-hidden=\"true\"\n />\n <span className=\"workspace-agent-message-center__provider-name min-w-0 truncate text-[var(--text-secondary)]\">\n {label}\n </span>\n </span>\n );\n}\n\nfunction statusClass(item: WorkspaceAgentMessageCenterItem): string {\n if (isWaitingMessageCenterItem(item)) {\n return \"waiting\";\n }\n if (item.status === \"idle\") {\n return \"completed\";\n }\n return item.status;\n}\n\nfunction messageCenterStatusTone(\n item: WorkspaceAgentMessageCenterItem\n): \"amber\" | \"blue\" | \"green\" | \"neutral\" | \"red\" {\n if (isWaitingMessageCenterItem(item)) {\n return \"amber\";\n }\n if (item.status === \"completed\" || item.status === \"idle\") {\n return \"green\";\n }\n if (item.status === \"canceled\") {\n return \"amber\";\n }\n if (item.status === \"failed\") {\n return \"red\";\n }\n if (item.status === \"working\") {\n return \"blue\";\n }\n return \"neutral\";\n}\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useRef","useState","Button","cn","AgentVerticalScrollArea","cn","jsx","cn","Button","cn","jsx","jsxs","cn","Button","jsx","jsxs","WorkspaceAgentMessageCenterPanel","useState","useRef","useCallback","useLayoutEffect","useEffect","cn","Button"]}
@@ -0,0 +1,49 @@
1
+ declare const AGENT_GUI_MENTION_PROVIDER_IDS: {
2
+ readonly agentGeneratedFile: "agent-generated-file";
3
+ readonly agentSession: "agent-session";
4
+ readonly file: "file";
5
+ readonly workspaceApp: "workspace-app";
6
+ readonly workspaceIssue: "workspace-issue";
7
+ };
8
+ type AgentGUIMentionProviderId = (typeof AGENT_GUI_MENTION_PROVIDER_IDS)[keyof typeof AGENT_GUI_MENTION_PROVIDER_IDS];
9
+ interface AgentRichTextAtProviderContext {
10
+ metadata?: Readonly<Record<string, unknown>>;
11
+ }
12
+ interface AgentRichTextAtQueryInput {
13
+ keyword: string;
14
+ maxResults?: number;
15
+ abortSignal?: AbortSignal;
16
+ context: AgentRichTextAtProviderContext;
17
+ }
18
+ interface AgentRichTextMentionInsert {
19
+ entityId: string;
20
+ label: string;
21
+ href?: string | null;
22
+ kind?: string | null;
23
+ meta?: Readonly<Record<string, string>> | null;
24
+ }
25
+ interface AgentRichTextMentionInsertResult {
26
+ kind: "mention";
27
+ mention: AgentRichTextMentionInsert;
28
+ }
29
+ interface AgentRichTextMarkdownLinkInsertResult {
30
+ kind: "markdown-link";
31
+ label: string;
32
+ href: string;
33
+ }
34
+ interface AgentRichTextTextInsertResult {
35
+ kind: "text";
36
+ text: string;
37
+ }
38
+ type AgentRichTextAtInsertResult = AgentRichTextMentionInsertResult | AgentRichTextMarkdownLinkInsertResult | AgentRichTextTextInsertResult;
39
+ interface AgentRichTextAtProvider<TItem = any> {
40
+ id: string;
41
+ query: (input: AgentRichTextAtQueryInput) => Promise<readonly TItem[]> | readonly TItem[];
42
+ getItemKey: (item: TItem) => string;
43
+ getItemLabel: (item: TItem) => string;
44
+ getItemSubtitle?: (item: TItem) => string | null | undefined;
45
+ getItemThumbnailUrl?: (item: TItem) => string | null | undefined | Promise<string | null | undefined>;
46
+ toInsertResult: (item: TItem) => AgentRichTextAtInsertResult;
47
+ }
48
+
49
+ export { AGENT_GUI_MENTION_PROVIDER_IDS, type AgentGUIMentionProviderId, type AgentRichTextAtInsertResult, type AgentRichTextAtProvider, type AgentRichTextAtProviderContext, type AgentRichTextAtQueryInput, type AgentRichTextMarkdownLinkInsertResult, type AgentRichTextMentionInsert, type AgentRichTextMentionInsertResult, type AgentRichTextTextInsertResult };
@@ -0,0 +1,7 @@
1
+ import {
2
+ AGENT_GUI_MENTION_PROVIDER_IDS
3
+ } from "./chunk-KCC3GNPB.js";
4
+ export {
5
+ AGENT_GUI_MENTION_PROVIDER_IDS
6
+ };
7
+ //# sourceMappingURL=agent-rich-text-at-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function normalizeAgentTitleText(value: string | null | undefined): string;
2
+
3
+ export { normalizeAgentTitleText };
@@ -0,0 +1,7 @@
1
+ import {
2
+ normalizeAgentTitleText
3
+ } from "./chunk-GCBDIQDX.js";
4
+ export {
5
+ normalizeAgentTitleText
6
+ };
7
+ //# sourceMappingURL=agent-title-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}