@tutti-os/agent-gui 0.0.233 → 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.
- package/README.md +49 -0
- package/dist/{AgentRichTextReadonly-U3XUJYCW.js → AgentRichTextReadonly-CCELQPHE.js} +5 -5
- package/dist/agent-conversation/index.d.ts +17 -4
- package/dist/agent-conversation/index.js +13 -9
- package/dist/agent-conversation/index.js.map +1 -1
- package/dist/agent-gui.d.ts +19 -3
- package/dist/agent-gui.js +22 -16
- package/dist/agent-message-center/index.d.ts +1 -1
- package/dist/agent-message-center/index.js +10 -7
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentGuiNodeTypes-DW7T--Y8.d.ts → agentGuiNodeTypes-Dgl7kQHA.d.ts} +2 -2
- package/dist/agents.d.ts +1 -1
- package/dist/app/renderer/agentactivity.css +17 -0
- package/dist/{chunk-M6WEFXPL.js → chunk-2MCNNB2P.js} +2 -24
- package/dist/chunk-2MCNNB2P.js.map +1 -0
- package/dist/{chunk-CQFT3MI5.js → chunk-3YYI6RXA.js} +7 -5
- package/dist/{chunk-CQFT3MI5.js.map → chunk-3YYI6RXA.js.map} +1 -1
- package/dist/{chunk-EDP4D42H.js → chunk-45KN5Z5F.js} +877 -871
- package/dist/chunk-45KN5Z5F.js.map +1 -0
- package/dist/{chunk-T57ZZWTC.js → chunk-4HAG3FOY.js} +2 -2
- package/dist/{chunk-ZBI6R46N.js → chunk-5DN5N2XS.js} +2 -2
- package/dist/{chunk-BCBB4HOV.js → chunk-634MNSI5.js} +2 -2
- package/dist/chunk-A4KKC324.js +4768 -0
- package/dist/chunk-A4KKC324.js.map +1 -0
- package/dist/chunk-ALAGL6VL.js +48 -0
- package/dist/chunk-ALAGL6VL.js.map +1 -0
- package/dist/{chunk-2STAUA73.js → chunk-AYTUAZE3.js} +5 -2
- package/dist/chunk-AYTUAZE3.js.map +1 -0
- package/dist/{chunk-SWO67UWQ.js → chunk-CZOZBUIM.js} +7 -7
- package/dist/{chunk-SWO67UWQ.js.map → chunk-CZOZBUIM.js.map} +1 -1
- package/dist/{chunk-2L2LVSOD.js → chunk-EHNPHZE4.js} +881 -5812
- package/dist/chunk-EHNPHZE4.js.map +1 -0
- package/dist/{chunk-N5356722.js → chunk-EKQ7UX2B.js} +13 -319
- package/dist/chunk-EKQ7UX2B.js.map +1 -0
- package/dist/{chunk-ZXEICU6J.js → chunk-KK7YXPTS.js} +3 -1
- package/dist/chunk-KK7YXPTS.js.map +1 -0
- package/dist/{chunk-WGCDSA7P.js → chunk-MBM7PJIF.js} +27 -506
- package/dist/chunk-MBM7PJIF.js.map +1 -0
- package/dist/chunk-RMC2MGL4.js +557 -0
- package/dist/chunk-RMC2MGL4.js.map +1 -0
- package/dist/{chunk-JA6XAKKE.js → chunk-TWF6JXPC.js} +2 -2
- package/dist/{chunk-7AYFKNLD.js → chunk-TWMV6YTX.js} +4 -4
- package/dist/chunk-VV3YIU5W.js +25 -0
- package/dist/chunk-VV3YIU5W.js.map +1 -0
- package/dist/{chunk-GLVENTN6.js → chunk-WXLO33YP.js} +2 -2
- package/dist/chunk-XWPHTXEM.js +529 -0
- package/dist/chunk-XWPHTXEM.js.map +1 -0
- package/dist/chunk-YEXRTXTE.js +315 -0
- package/dist/chunk-YEXRTXTE.js.map +1 -0
- package/dist/{chunk-WMJDOMG6.js → chunk-ZELGKLW5.js} +4 -4
- package/dist/composer-projection.d.ts +37 -0
- package/dist/composer-projection.js +21 -0
- package/dist/composer-projection.js.map +1 -0
- package/dist/context-mention-palette/index.js +9 -7
- package/dist/conversation-projection.d.ts +551 -0
- package/dist/conversation-projection.js +42 -0
- package/dist/conversation-projection.js.map +1 -0
- package/dist/conversation-rail-projection.js +3 -3
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +32 -13
- package/dist/index.js +22 -16
- package/dist/index.js.map +1 -1
- package/dist/mention-search.js +7 -5
- package/dist/{types-CHAMK2g7.d.ts → types-DtXXsISB.d.ts} +1 -1
- package/dist/workbench/contribution.js +4 -4
- package/dist/workbench/index.js +4 -4
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workspace-agent-generated-files.d.ts +1 -12
- package/dist/workspaceAgentActivityListTypes-BUKNyMbh.d.ts +48 -0
- package/dist/{workspaceLinkActions-CzsbvGmC.d.ts → workspaceLinkActions-DxyzMy10.d.ts} +13 -12
- package/package.json +31 -17
- package/dist/chunk-2L2LVSOD.js.map +0 -1
- package/dist/chunk-2STAUA73.js.map +0 -1
- package/dist/chunk-EDP4D42H.js.map +0 -1
- package/dist/chunk-M6WEFXPL.js.map +0 -1
- package/dist/chunk-N5356722.js.map +0 -1
- package/dist/chunk-WGCDSA7P.js.map +0 -1
- package/dist/chunk-ZXEICU6J.js.map +0 -1
- /package/dist/{AgentRichTextReadonly-U3XUJYCW.js.map → AgentRichTextReadonly-CCELQPHE.js.map} +0 -0
- /package/dist/{chunk-T57ZZWTC.js.map → chunk-4HAG3FOY.js.map} +0 -0
- /package/dist/{chunk-ZBI6R46N.js.map → chunk-5DN5N2XS.js.map} +0 -0
- /package/dist/{chunk-BCBB4HOV.js.map → chunk-634MNSI5.js.map} +0 -0
- /package/dist/{chunk-JA6XAKKE.js.map → chunk-TWF6JXPC.js.map} +0 -0
- /package/dist/{chunk-7AYFKNLD.js.map → chunk-TWMV6YTX.js.map} +0 -0
- /package/dist/{chunk-GLVENTN6.js.map → chunk-WXLO33YP.js.map} +0 -0
- /package/dist/{chunk-WMJDOMG6.js.map → chunk-ZELGKLW5.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/AgentMessageMarkdown.tsx","../actions/workspaceLinkActions.ts","../shared/streamingMarkdownTailStabilizer.ts","../shared/useStreamingVisibleText.ts","../shared/agentMessageMarkdownRuntime.ts","../shared/agentMessageMarkdownLinks.ts","../shared/agentMessageMarkdownContext.ts","../shared/AgentMessageMarkdownRenderers.tsx","../shared/AgentMessageMarkdownMedia.tsx","../app/renderer/components/ZoomableImage.tsx","../shared/agentConversation/components/ConversationImageContextMenu.tsx","../shared/agentConversation/lib/copyImageToClipboard.ts","../app/renderer/components/zoomableImageDownload.ts","../shared/remarkLiteralAutolinkBoundary.ts","../shared/cachedMarkdownParser.ts","../app/renderer/components/ui/custom-scroll-area.tsx","../app/renderer/components/icons/MessageSquareMoreIcon.tsx","../agent-gui/agentGuiNode/AgentGUIConversation.styles.ts"],"sourcesContent":["import {\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type JSX,\n type MouseEvent,\n useCallback,\n memo,\n useMemo,\n useState\n} from \"react\";\nimport { useTranslation } from \"../i18n/index\";\nimport { cn } from \"../app/renderer/lib/utils\";\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize, {\n defaultSchema,\n type Options as RehypeSanitizeOptions\n} from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\nimport { workspaceFileName as basenameWorkspacePath } from \"@tutti-os/workspace-file-manager/services\";\nimport { resolveWorkspaceFileExtension } from \"@tutti-os/workspace-file-preview\";\nimport { MentionPill } from \"@tutti-os/ui-system/components\";\nimport { useResolvedRichTextMention } from \"@tutti-os/ui-rich-text/editor\";\nimport {\n resolveWorkspaceLinkAction,\n type WorkspaceLinkAction,\n type WorkspaceLinkActionSource\n} from \"../actions/workspaceLinkActions\";\nimport { resolveAgentWorkspaceFileVisualKind } from \"./workspaceFileVisualKind\";\nimport { stabilizeStreamingMarkdownTail } from \"./streamingMarkdownTailStabilizer\";\nimport { useStreamingVisibleText } from \"./useStreamingVisibleText\";\nimport {\n useAgentTargetPresentations,\n type AgentMessageMarkdownAgentTarget\n} from \"./AgentTargetPresentationContext\";\nimport {\n activateMarkdownLink,\n activateMarkdownLinkFromKey,\n activateMarkdownLinkFromPointer,\n hashMarkdownProfilerContent,\n isLikelyLongerThanLineLimit,\n resolveMarkdownAnchorHref,\n splitStreamingMarkdownBlocks\n} from \"./agentMessageMarkdownRuntime\";\nimport {\n isClickableMarkdownHref,\n isLocalAbsolutePath,\n isMentionOnlyMarkdownContent,\n markdownUrlTransform,\n normalizeMentionMarkdownLinks,\n normalizeLocalPathMarkdownLinks,\n normalizePlainIssueMentionTitleContent,\n normalizePlainSessionMentionTitle,\n parseMentionLink,\n type ParsedMentionLink\n} from \"./agentMessageMarkdownLinks\";\nimport { MarkdownLinkContext } from \"./agentMessageMarkdownContext\";\nimport {\n MarkdownCode,\n MarkdownListItem,\n MarkdownOrderedList,\n MarkdownParagraph,\n MarkdownPre,\n MarkdownUnorderedList,\n textFromReactNode\n} from \"./AgentMessageMarkdownRenderers\";\nimport { MarkdownMedia } from \"./AgentMessageMarkdownMedia\";\nimport { remarkLiteralAutolinkBoundary } from \"./remarkLiteralAutolinkBoundary\";\nimport { cachedMarkdownParser } from \"./cachedMarkdownParser\";\nexport { resetCachedMarkdownImagesForTests } from \"./AgentMessageMarkdownMedia\";\nexport type { StreamingMarkdownBlock } from \"./agentMessageMarkdownRuntime\";\nexport { splitStreamingMarkdownBlocks } from \"./agentMessageMarkdownRuntime\";\n\nconst STREAMING_MARKDOWN_FRAME_MS = 24;\nconst STREAMING_MARKDOWN_MAX_CHARS_PER_SECOND = 6_000;\nconst STREAMING_MARKDOWN_TAIL_FLUSH_CHARS = 0;\nconst STANDARD_MARKDOWN_LINK_PROTOCOLS = [\n \"http\",\n \"https\",\n \"irc\",\n \"ircs\",\n \"mailto\",\n \"tel\",\n \"xmpp\"\n] as const;\nconst WINDOWS_DRIVE_HREF_PROTOCOLS =\n \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\nexport const AGENT_MARKDOWN_PLAIN_TITLE_CLASSNAME =\n \"[font-size:inherit] [line-height:inherit] text-inherit [&_a]:text-inherit [&_a]:font-inherit [&_a]:no-underline [&_a:hover]:no-underline [&_a:focus-visible]:no-underline [&_strong]:font-inherit [&_strong]:text-inherit\";\n\nconst MARKDOWN_SANITIZE_SCHEMA: RehypeSanitizeOptions = {\n ...defaultSchema,\n protocols: {\n ...defaultSchema.protocols,\n href: [\n ...(defaultSchema.protocols?.href ?? []),\n \"mention\",\n ...STANDARD_MARKDOWN_LINK_PROTOCOLS,\n ...WINDOWS_DRIVE_HREF_PROTOCOLS\n ]\n }\n};\n\nexport interface AgentMessageMarkdownWorkspaceLinkContext {\n workspaceRoot?: string | null;\n basePath?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\ninterface AgentMessageMarkdownProps {\n content: string;\n documentCacheKey?: string;\n onLinkClick?: (href: string) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n workspaceLinkContext?: AgentMessageMarkdownWorkspaceLinkContext | null;\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n agentTargets?: readonly AgentMessageMarkdownAgentTarget[];\n collapsible?: boolean;\n expandLabel?: string;\n className?: string;\n inline?: boolean;\n normalizePlainIssueMentionTitle?: boolean;\n enableImageZoom?: boolean;\n streaming?: boolean;\n}\n\nexport interface AgentMessageMarkdownWorkspaceAppIcon {\n appId: string;\n iconUrl: string | null;\n workspaceId?: string | null;\n}\n\nconst EMPTY_WORKSPACE_APP_ICONS: readonly AgentMessageMarkdownWorkspaceAppIcon[] =\n [];\nconst EMPTY_AGENT_TARGETS: readonly AgentMessageMarkdownAgentTarget[] = [];\n\nexport type MarkdownDomProps<Tag extends keyof JSX.IntrinsicElements> =\n ComponentPropsWithoutRef<Tag> & {\n node?: unknown;\n };\n\ntype ReactMarkdownComponents = ComponentPropsWithoutRef<\n typeof ReactMarkdown\n>[\"components\"];\ntype ReactMarkdownRemarkPlugins = NonNullable<\n ComponentPropsWithoutRef<typeof ReactMarkdown>[\"remarkPlugins\"]\n>;\n\nexport function AgentMessageMarkdown({\n content,\n documentCacheKey,\n onLinkClick,\n onLinkAction,\n workspaceLinkContext = null,\n workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS,\n agentTargets,\n collapsible = false,\n expandLabel,\n className,\n inline = false,\n normalizePlainIssueMentionTitle = false,\n enableImageZoom = false,\n streaming = false\n}: AgentMessageMarkdownProps): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n const contextAgentTargets = useAgentTargetPresentations();\n const effectiveAgentTargets = agentTargets ?? contextAgentTargets;\n const visibleContent = useStreamingVisibleText(content, {\n enabled: streaming,\n frameMs: STREAMING_MARKDOWN_FRAME_MS,\n maxCharsPerSecond: STREAMING_MARKDOWN_MAX_CHARS_PER_SECOND,\n trailingFlushChars: STREAMING_MARKDOWN_TAIL_FLUSH_CHARS\n });\n const stabilizedContent = useMemo(\n () =>\n stabilizeStreamingMarkdownTail(visibleContent, {\n streaming\n }).content,\n [streaming, visibleContent]\n );\n const workspaceRoot = workspaceLinkContext?.workspaceRoot ?? null;\n const basePath = workspaceLinkContext?.basePath ?? null;\n const workspaceLinkSource = workspaceLinkContext?.source ?? null;\n const [isExpanded, setIsExpanded] = useState(false);\n const resolvedExpandLabel =\n expandLabel ?? t(\"agentHost.workspaceAgentMessageExpand\");\n const shouldCollapse =\n collapsible && isLikelyLongerThanLineLimit(stabilizedContent);\n const isCollapsed = shouldCollapse && !isExpanded;\n const ContainerTag = inline ? \"span\" : \"div\";\n const normalizedContent = useMemo(\n () =>\n normalizeLocalPathMarkdownLinks(\n normalizeMentionMarkdownLinks(\n normalizePlainIssueMentionTitle\n ? normalizePlainIssueMentionTitleContent(\n normalizePlainSessionMentionTitle(stabilizedContent)\n )\n : normalizePlainSessionMentionTitle(stabilizedContent)\n )\n ),\n [normalizePlainIssueMentionTitle, stabilizedContent]\n );\n const settledRemarkPlugins = useMemo<ReactMarkdownRemarkPlugins>(\n () => [\n remarkGfm,\n remarkLiteralAutolinkBoundary,\n [\n cachedMarkdownParser,\n {\n cacheKey: documentCacheKey?.trim() || \"content\",\n content: normalizedContent\n }\n ]\n ],\n [documentCacheKey, normalizedContent]\n );\n const isMentionOnly = isMentionOnlyMarkdownContent(normalizedContent);\n const handleLinkClick = useCallback(\n (href: string): void => {\n if (workspaceLinkSource && onLinkAction && (workspaceRoot || basePath)) {\n const action = resolveWorkspaceLinkAction({\n href,\n workspaceRoot,\n basePath,\n source: workspaceLinkSource\n });\n if (action) {\n onLinkAction(action);\n return;\n }\n }\n onLinkClick?.(href);\n },\n [basePath, onLinkAction, onLinkClick, workspaceLinkSource, workspaceRoot]\n );\n const handleAnchorClickCapture = useCallback(\n (event: MouseEvent<HTMLElement>): void => {\n const href = resolveMarkdownAnchorHref(event.target);\n if (!href) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n handleLinkClick(href);\n },\n [handleLinkClick]\n );\n const markdownComponents = useMemo(\n () => ({\n a: (props: MarkdownDomProps<\"a\">) => (\n <MarkdownLink\n {...props}\n onLinkClick={handleLinkClick}\n workspaceAppIcons={workspaceAppIcons}\n agentTargets={effectiveAgentTargets}\n />\n ),\n code: (props: MarkdownDomProps<\"code\">) => <MarkdownCode {...props} />,\n img: (props: MarkdownDomProps<\"img\">) => (\n <MarkdownMedia {...props} enableZoom={enableImageZoom} />\n ),\n p: (props: MarkdownDomProps<\"p\">) => (\n <MarkdownParagraph {...props} inline={inline} />\n ),\n ul: MarkdownUnorderedList,\n ol: MarkdownOrderedList,\n li: MarkdownListItem,\n pre: MarkdownPre\n }),\n [\n effectiveAgentTargets,\n enableImageZoom,\n handleLinkClick,\n inline,\n workspaceAppIcons\n ]\n );\n\n return (\n <ContainerTag\n className=\"flex w-full min-w-0 flex-col items-start gap-1\"\n data-workspace-agent-markdown-shell=\"true\"\n >\n <ContainerTag\n className={cn(\n \"relative w-full min-w-0 overflow-x-auto text-[13px] leading-[1.5] text-[var(--text-primary)] [overflow-wrap:anywhere]\",\n \"[&_>table:first-child]:mt-0 [&_p]:mb-2 [&_pre]:mb-2 [&_blockquote]:mb-2\",\n \"[&_hr]:my-4 [&_hr]:h-0 [&_hr]:border-0 [&_hr]:border-t [&_hr]:border-t-[color-mix(in_srgb,var(--text-primary)_14%,transparent)]\",\n \"[&_ul]:my-2 [&_ul]:max-w-full [&_ul]:rounded-[8px] [&_ul]:border [&_ul]:border-[var(--line-2)] [&_ul]:bg-[var(--background-panel)] [&_ul]:px-4 [&_ul]:py-2\",\n \"[&_ol]:my-2 [&_ol]:max-w-full [&_ol]:rounded-[8px] [&_ol]:border [&_ol]:border-[var(--line-2)] [&_ol]:bg-[var(--background-panel)] [&_ol]:px-4 [&_ol]:py-2\",\n \"[&_li>ul]:mt-1.5 [&_li>ul]:mb-0.5 [&_li>ul]:border-0 [&_li>ul]:px-0 [&_li>ul]:py-1\",\n \"[&_li>ol]:mt-1.5 [&_li>ol]:mb-0.5 [&_li>ol]:border-0 [&_li>ol]:px-0 [&_li>ol]:py-1\",\n \"[&_table]:my-2 [&_table]:w-max [&_table]:min-w-full [&_table]:max-w-full [&_table]:border-separate [&_table]:border-spacing-0 [&_table]:overflow-hidden [&_table]:rounded-[8px] [&_table]:border [&_table]:border-[var(--line-2)] [&_table]:text-[13px] [&_table]:leading-[1.45]\",\n \"[&_th]:max-w-[280px] [&_th]:border-r [&_th]:border-b [&_th]:border-[var(--line-2)] [&_th]:px-2 [&_th]:py-1.5 [&_th]:align-top [&_th]:font-semibold [&_th]:text-[var(--text-primary)] [&_th]:[overflow-wrap:anywhere] [&_th]:bg-[color-mix(in_srgb,var(--background-panel)_94%,var(--text-primary))]\",\n \"[&_td]:max-w-[280px] [&_td]:border-r [&_td]:border-b [&_td]:border-[var(--line-2)] [&_td]:px-2 [&_td]:py-1.5 [&_td]:align-top [&_td]:[overflow-wrap:anywhere]\",\n \"[&_tr:last-child_th]:border-b-0 [&_tr:last-child_td]:border-b-0 [&_th:last-child]:border-r-0 [&_td:last-child]:border-r-0\",\n \"[&_a]:cursor-pointer [&_a]:font-semibold [&_a]:text-[var(--tutti-purple)] [&_a]:no-underline [&_a:hover]:underline [&_a:focus-visible]:underline\",\n \"[&_strong]:font-semibold\",\n \"[&_code]:inline [&_code]:rounded-[2px] [&_code]:bg-[var(--transparency-block)] [&_code]:px-1 [&_code]:py-[1px] [&_code]:font-[var(--tsh-font-mono)] [&_code]:text-[11px] [&_code]:leading-[1.35] [&_code]:text-[var(--text-primary)] [&_code]:[box-decoration-break:clone] [&_code]:[-webkit-box-decoration-break:clone] [&_code]:[overflow-wrap:anywhere] [&_code]:[word-break:break-word]\",\n \"[&_pre]:box-border [&_pre]:overflow-auto [&_pre]:rounded-[6px] [&_pre]:bg-[var(--transparency-block)] [&_pre]:px-2.5 [&_pre]:py-2\",\n \"[&_pre_code]:inline [&_pre_code]:h-auto [&_pre_code]:items-normal [&_pre_code]:rounded-none [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:text-[inherit] [&_pre_code]:leading-[inherit] [&_pre_code]:[white-space:pre-wrap] [&_pre_code]:[overflow-wrap:anywhere] [&_pre_code]:[word-break:break-word]\",\n \"[&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n inline &&\n \"inline min-w-0 overflow-hidden align-baseline [&_p]:inline [&_p]:m-0\",\n shouldCollapse &&\n \"overflow-hidden transition-[max-height] duration-220 ease-out\",\n isCollapsed &&\n \"max-h-[calc(13px*1.5*8)] overflow-hidden [mask-image:linear-gradient(180deg,black_0%,black_calc(100%_-_36px),transparent_100%)] [-webkit-mask-image:linear-gradient(180deg,black_0%,black_calc(100%_-_36px),transparent_100%)] [&_pre]:overflow-hidden\",\n shouldCollapse && !isCollapsed && \"max-h-[72rem]\",\n className\n )}\n data-workspace-agent-markdown=\"true\"\n data-agent-mention-only={isMentionOnly ? \"true\" : undefined}\n data-collapsed={isCollapsed ? \"true\" : \"false\"}\n onClickCapture={handleAnchorClickCapture}\n >\n {streaming ? (\n <StreamingMarkdownBlocks\n content={normalizedContent}\n components={markdownComponents}\n />\n ) : (\n <ReactMarkdown\n remarkPlugins={settledRemarkPlugins}\n rehypePlugins={[[rehypeSanitize, MARKDOWN_SANITIZE_SCHEMA]]}\n urlTransform={markdownUrlTransform}\n components={markdownComponents}\n >\n {normalizedContent}\n </ReactMarkdown>\n )}\n </ContainerTag>\n {shouldCollapse && !isExpanded ? (\n <button\n type=\"button\"\n className=\"m-0 border-0 bg-transparent p-0 text-[11px] leading-[1.4] font-semibold text-[var(--tutti-purple)] hover:underline focus-visible:underline focus-visible:outline-none\"\n onClick={() => setIsExpanded(true)}\n >\n {resolvedExpandLabel}\n </button>\n ) : null}\n </ContainerTag>\n );\n}\n\nfunction StreamingMarkdownBlocks({\n content,\n components\n}: {\n content: string;\n components: ReactMarkdownComponents;\n}): JSX.Element {\n const blocks = useMemo(\n () => splitStreamingMarkdownBlocks(content),\n [content]\n );\n return (\n <>\n {blocks.map((block, index) => (\n <MemoizedMarkdownBlock\n key={`${index}:${hashMarkdownProfilerContent(block.initialKeyContent)}`}\n content={block.content}\n components={components}\n />\n ))}\n </>\n );\n}\n\nconst MemoizedMarkdownBlock = memo(function MemoizedMarkdownBlock({\n content,\n components\n}: {\n content: string;\n components: ReactMarkdownComponents;\n}): JSX.Element {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkLiteralAutolinkBoundary]}\n rehypePlugins={[[rehypeSanitize, MARKDOWN_SANITIZE_SCHEMA]]}\n urlTransform={markdownUrlTransform}\n components={components}\n >\n {content}\n </ReactMarkdown>\n );\n});\n\nfunction MarkdownLink({\n node: _node,\n onClick: _onClick,\n onLinkClick,\n workspaceAppIcons,\n agentTargets,\n href,\n ...props\n}: MarkdownDomProps<\"a\"> & {\n onLinkClick?: (href: string) => void;\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n agentTargets?: readonly AgentMessageMarkdownAgentTarget[];\n}): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n const targetHref = href?.trim() ?? \"\";\n const mention = targetHref\n ? parseMentionLink(\n targetHref,\n textFromReactNode(props.children),\n workspaceAppIcons ?? [],\n agentTargets ?? EMPTY_AGENT_TARGETS,\n t(\"agentHost.agentGui.workspaceAppFactoryMentionFallback\")\n )\n : null;\n if (mention) {\n return (\n <MentionLink\n {...props}\n href={targetHref}\n mention={mention}\n onLinkClick={onLinkClick}\n />\n );\n }\n const fileMention = targetHref\n ? parseWorkspaceFileMentionLink(\n targetHref,\n textFromReactNode(props.children)\n )\n : null;\n if (fileMention) {\n return (\n <WorkspaceFileMentionLink\n {...props}\n href={targetHref}\n mention={fileMention}\n onLinkClick={onLinkClick}\n />\n );\n }\n if (!isClickableMarkdownHref(targetHref)) {\n return (\n <MarkdownLinkContext.Provider value={true}>\n <span className={props.className} title={props.title}>\n {props.children}\n </span>\n </MarkdownLinkContext.Provider>\n );\n }\n\n return (\n <MarkdownLinkContext.Provider value={true}>\n <a\n {...props}\n data-agent-link-href={targetHref}\n role=\"link\"\n tabIndex={0}\n onClick={(event) => {\n activateMarkdownLink(event, targetHref, onLinkClick);\n }}\n onPointerDown={(event) => {\n activateMarkdownLinkFromPointer(event, targetHref, onLinkClick);\n }}\n onKeyDown={(event) => {\n activateMarkdownLinkFromKey(event, targetHref, onLinkClick);\n }}\n />\n </MarkdownLinkContext.Provider>\n );\n}\n\ninterface ParsedWorkspaceFileMentionLink {\n label: string;\n href: string;\n entryKind: \"file\" | \"directory\";\n visualKind: string;\n}\n\ninterface ParsedWorkspaceFileMentionTarget {\n path: string;\n explicitKind: \"file\" | \"directory\" | null;\n}\n\nfunction parseWorkspaceFileMentionTarget(\n href: string\n): ParsedWorkspaceFileMentionTarget | null {\n const target = href.trim();\n if (!isLocalAbsolutePath(target)) {\n return null;\n }\n\n let url: URL;\n try {\n url = new URL(target, \"https://tsh.local\");\n } catch {\n return null;\n }\n const explicitKindValue =\n url.searchParams.get(\"kind\") ??\n url.searchParams.get(\"refType\") ??\n url.searchParams.get(\"entryKind\") ??\n \"\";\n const normalizedKind = explicitKindValue.trim().toLowerCase();\n const explicitKind =\n normalizedKind === \"folder\" || normalizedKind === \"directory\"\n ? \"directory\"\n : normalizedKind === \"file\"\n ? \"file\"\n : null;\n const path = url.pathname.replace(/\\/+$/, \"\");\n if (!path || path === \"/\") {\n return null;\n }\n\n return {\n path,\n explicitKind:\n explicitKind ?? (url.pathname.endsWith(\"/\") ? \"directory\" : null)\n };\n}\n\nfunction resolveWorkspaceFileMentionEntryKind(\n path: string,\n label: string,\n explicitKind: \"file\" | \"directory\" | null\n): \"file\" | \"directory\" {\n if (explicitKind) {\n return explicitKind;\n }\n if (resolveWorkspaceFileExtension(path)) {\n return \"file\";\n }\n\n const basename = basenameWorkspacePath(path);\n return basename === label ? \"directory\" : \"file\";\n}\n\nfunction parseWorkspaceFileMentionLink(\n href: string,\n rawLabel: string\n): ParsedWorkspaceFileMentionLink | null {\n const label = rawLabel.trim();\n const target = parseWorkspaceFileMentionTarget(href);\n if (!target || !label.startsWith(\"@\")) {\n return null;\n }\n const fileLabel = label.replace(/^@+/, \"\").trim();\n if (!fileLabel) {\n return null;\n }\n const entryKind = resolveWorkspaceFileMentionEntryKind(\n target.path,\n fileLabel,\n target.explicitKind\n );\n return {\n label: fileLabel,\n href: target.path,\n entryKind,\n visualKind: resolveAgentWorkspaceFileVisualKind(target.path, {\n refType: entryKind === \"directory\" ? \"folder\" : \"file\"\n })\n };\n}\n\nfunction WorkspaceFileMentionLink({\n onClick: _onClick,\n onLinkClick,\n href: _href,\n mention,\n ...props\n}: AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string;\n mention: ParsedWorkspaceFileMentionLink;\n onLinkClick?: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n return (\n <a\n {...props}\n className={cn(\n \"tsh-workspace-file-link tsh-agent-object-token tsh-agent-object-token--file\",\n props.className\n )}\n data-agent-file-mention=\"true\"\n data-agent-mention-kind=\"file\"\n data-agent-file-entry-kind={mention.entryKind}\n data-agent-file-visual-kind={mention.visualKind}\n data-agent-link-href={mention.href}\n data-agent-mention-href={mention.href}\n aria-label={mention.label}\n role=\"link\"\n tabIndex={0}\n onClick={(event) => {\n activateMarkdownLink(event, mention.href, onLinkClick);\n }}\n onPointerDown={(event) => {\n activateMarkdownLinkFromPointer(event, mention.href, onLinkClick);\n }}\n onKeyDown={(event) => {\n activateMarkdownLinkFromKey(event, mention.href, onLinkClick);\n }}\n >\n <span className=\"tsh-agent-object-token__icon\" aria-hidden=\"true\" />\n <span className=\"tsh-agent-object-token__main\">{mention.label}</span>\n </a>\n );\n}\n\nfunction MentionLink({\n onClick: _onClick,\n onLinkClick,\n href,\n mention,\n ...props\n}: AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string;\n mention: ParsedMentionLink;\n onLinkClick?: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n const snapshot = useResolvedRichTextMention({\n providerId: mention.providerId,\n entityId: mention.entityId,\n label: mention.label,\n scope: mention.scope\n });\n const resolved = snapshot.state === \"ready\" ? snapshot.resolved : undefined;\n const label = resolved?.label?.trim() || mention.label;\n const presentation = resolved?.presentation;\n const iconUrl =\n presentation?.iconUrl?.trim() ||\n presentation?.thumbnailUrl?.trim() ||\n presentation?.agentIconUrl?.trim() ||\n mention.iconUrl;\n const pillKind =\n mention.kind === \"workspace-issue\" || mention.referenceSource === \"task\"\n ? \"issue\"\n : mention.kind === \"session\" || mention.kind === \"agent-target\"\n ? \"session\"\n : mention.kind === \"pasted-text\"\n ? \"file\"\n : \"app\";\n const usesSessionIcon = mention.kind === \"session\";\n\n return (\n <a\n {...props}\n className={cn(\n \"tsh-agent-object-token tsh-agent-object-token--entity\",\n props.className\n )}\n data-agent-file-mention=\"true\"\n data-agent-link-href={href}\n data-agent-mention-icon-url={iconUrl}\n data-agent-mention-href={href}\n data-agent-mention-kind={mention.kind}\n data-agent-reference-source={mention.referenceSource}\n aria-label={label}\n role=\"link\"\n tabIndex={0}\n onClick={(event) => {\n activateMarkdownLink(event, href, onLinkClick);\n }}\n onPointerDown={(event) => {\n activateMarkdownLinkFromPointer(event, href, onLinkClick);\n }}\n onKeyDown={(event) => {\n activateMarkdownLinkFromKey(event, href, onLinkClick);\n }}\n >\n <MentionPill\n className=\"top-0 max-w-full\"\n iconUrl={iconUrl}\n iconContainerProps={{\n className: \"h-4 w-4\",\n \"data-agent-mention-app-icon\": usesSessionIcon ? undefined : \"true\",\n \"data-agent-mention-session-icon\": usesSessionIcon\n ? \"true\"\n : undefined,\n \"data-workspace-app-icon\": usesSessionIcon ? undefined : \"true\"\n }}\n fallbackIconProps={{\n \"data-agent-mention-fallback-icon\": \"true\"\n }}\n kind={pillKind}\n label={<span className=\"tsh-agent-object-token__main\">{label}</span>}\n removable={false}\n tooltipEnabled\n withTooltipProvider\n />\n </a>\n );\n}\n","import type { WorkspaceIssueMentionMode } from \"@tutti-os/workspace-issue-manager/core\";\nimport { parseRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\nimport { getAgentCustomMentionKind } from \"../shared/agentCustomMentionKinds\";\nimport {\n resolveAgentSessionMentionLinkAction,\n resolveWorkspaceUrlLinkAction,\n type OpenAgentSessionLinkAction,\n type OpenWorkspaceUrlLinkAction,\n type WorkspaceLinkActionSource\n} from \"./portableWorkspaceNavigationActions\";\nimport {\n decodeWorkspaceLinkPath,\n isInsideOrEqualWorkspaceFilePath,\n isUrlLikeWorkspaceFilePath,\n normalizeWorkspaceFilePath,\n resolveWorkspaceFilePathCandidate,\n workspaceFilePathBasename\n} from \"./workspaceFilePathCandidate\";\n\nexport { resolveWorkspaceUrlLinkAction };\nexport {\n isDirectAgentGeneratedMediaPath,\n resolveWorkspaceFilePathCandidate\n} from \"./workspaceFilePathCandidate\";\nexport type {\n OpenAgentSessionLinkAction,\n OpenWorkspaceUrlLinkAction,\n ResolveWorkspaceUrlLinkActionInput,\n WorkspaceLinkActionSource\n} from \"./portableWorkspaceNavigationActions\";\nexport type {\n ResolvedWorkspaceFilePathCandidate,\n ResolveWorkspaceFilePathCandidateInput\n} from \"./workspaceFilePathCandidate\";\n\nexport interface ResolveWorkspaceFileLinkActionInput {\n path: string;\n workspaceRoot?: string | null;\n basePath?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface OpenWorkspaceFileLinkAction {\n type: \"open-workspace-file\";\n mode?: \"select\" | \"open\";\n path: string;\n directoryPath: string;\n workspaceRoot: string;\n source: WorkspaceLinkActionSource;\n prefetchedDirectoryListing?: WorkspaceFileLinkDirectoryListing | null;\n}\n\nexport interface OpenLocalAssetPreviewLinkAction {\n type: \"open-local-asset-preview\";\n path: string;\n name: string;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface WorkspaceFileLinkDirectoryEntry {\n path: string;\n name: string;\n kind: \"file\" | \"directory\" | \"unknown\";\n hasChildren: boolean | null;\n sizeBytes: number | null;\n mtimeMs: number | null;\n}\n\nexport interface WorkspaceFileLinkDirectoryListing {\n workspaceId: string;\n root: string;\n directoryPath: string;\n entries: WorkspaceFileLinkDirectoryEntry[];\n}\n\nexport interface OpenWorkspaceIssueLinkAction {\n type: \"open-workspace-issue\";\n workspaceId: string;\n issueId: string | null;\n mode?: WorkspaceIssueMentionMode;\n outputDir?: string | null;\n runId?: string | null;\n taskId?: string | null;\n topicId?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface OpenWorkspaceAppLinkAction {\n type: \"open-workspace-app\";\n workspaceId: string;\n appId: string;\n conversationId?: string | null;\n messageId?: string | null;\n summaryTaskId?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface ResolveWorkspaceMentionLinkActionInput {\n href: string;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface ResolveWorkspaceLinkActionInput {\n href: string;\n workspaceRoot?: string | null;\n basePath?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\n// 宿主注册的自定义 mention(shared/agentCustomMentionKinds,clickable=true)的点击动作:\n// 携带原始 href 原样上抛,由宿主自行二次解析(包内不理解业务语义)。\nexport interface OpenCustomMentionLinkAction {\n type: \"open-custom-mention\";\n /** 注册表里的 kind(= mention:// providerId)。 */\n kind: string;\n href: string;\n source: WorkspaceLinkActionSource;\n}\n\nexport type WorkspaceLinkAction =\n | OpenWorkspaceFileLinkAction\n | OpenLocalAssetPreviewLinkAction\n | OpenWorkspaceUrlLinkAction\n | OpenAgentSessionLinkAction\n | OpenWorkspaceIssueLinkAction\n | OpenWorkspaceAppLinkAction\n | OpenCustomMentionLinkAction;\n\nconst LOCAL_ASSET_ROOT = \"/var/cache/tsh/local-assets\";\n\nexport function resolveWorkspaceFileLinkAction({\n path,\n workspaceRoot,\n basePath,\n source\n}: ResolveWorkspaceFileLinkActionInput): OpenWorkspaceFileLinkAction | null {\n const candidate = resolveWorkspaceFilePathCandidate({\n path,\n workspaceRoot,\n basePath\n });\n if (!candidate) {\n return null;\n }\n\n return {\n type: \"open-workspace-file\",\n path: candidate.path,\n directoryPath: candidate.directoryPath,\n workspaceRoot: candidate.workspaceRoot,\n source\n };\n}\n\nexport function resolveLocalAssetPreviewLinkAction({\n path,\n source\n}: {\n path: string;\n source: WorkspaceLinkActionSource;\n}): OpenLocalAssetPreviewLinkAction | null {\n const rawPath = decodeWorkspaceLinkPath(path.trim());\n if (!rawPath || isUrlLikeWorkspaceFilePath(rawPath)) {\n return null;\n }\n\n const resolvedPath = normalizeWorkspaceFilePath(rawPath);\n if (\n resolvedPath === LOCAL_ASSET_ROOT ||\n !isInsideOrEqualWorkspaceFilePath(resolvedPath, LOCAL_ASSET_ROOT)\n ) {\n return null;\n }\n if (resolvedPath.endsWith(\".metadata.json\")) {\n return null;\n }\n\n return {\n type: \"open-local-asset-preview\",\n path: resolvedPath,\n name: workspaceFilePathBasename(resolvedPath),\n source\n };\n}\n\nexport function resolveWorkspaceMentionLinkAction({\n href,\n source\n}: ResolveWorkspaceMentionLinkActionInput):\n | OpenAgentSessionLinkAction\n | OpenWorkspaceIssueLinkAction\n | OpenWorkspaceAppLinkAction\n | OpenCustomMentionLinkAction\n | null {\n const mention = parseRichTextMentionHref(href, \"\");\n if (!mention) {\n return null;\n }\n\n // 注册的自定义 kind 的 scope 键由宿主约定(未必带 workspaceId),\n // 必须在下面的 workspaceId 必填检查之前处理。\n const customDefinition = getAgentCustomMentionKind(mention.providerId);\n if (customDefinition) {\n if (!customDefinition.clickable) {\n return null;\n }\n return {\n type: \"open-custom-mention\",\n kind: mention.providerId.trim().toLowerCase(),\n href: href.trim(),\n source\n };\n }\n\n const agentSessionAction = resolveAgentSessionMentionLinkAction({\n href,\n source\n });\n if (agentSessionAction) {\n return agentSessionAction;\n }\n\n const workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n const targetId = mention.entityId.trim();\n if (!workspaceId || !targetId) {\n return null;\n }\n\n if (mention.providerId === \"workspace-issue\") {\n const mode = parseWorkspaceIssueMentionMode(mention.scope?.mode ?? null);\n const outputDir = mention.scope?.outputDir?.trim() || \"\";\n const runId = mention.scope?.runId?.trim() || \"\";\n const taskId = mention.scope?.taskId?.trim() || \"\";\n const topicId = mention.scope?.topicId?.trim() || \"\";\n return {\n type: \"open-workspace-issue\",\n workspaceId,\n issueId: targetId,\n ...(mode ? { mode } : {}),\n ...(outputDir ? { outputDir } : {}),\n ...(runId ? { runId } : {}),\n ...(taskId ? { taskId } : {}),\n ...(topicId ? { topicId } : {}),\n source\n };\n }\n\n if (mention.providerId === \"workspace-app\") {\n const messageId = mention.scope?.messageId?.trim() || null;\n const summaryTaskId = mention.scope?.summaryTaskId?.trim() || null;\n const conversationId = mention.scope?.conversationId?.trim() || null;\n return {\n type: \"open-workspace-app\",\n workspaceId,\n appId: targetId,\n ...(messageId ? { messageId } : {}),\n ...(summaryTaskId ? { summaryTaskId } : {}),\n ...(conversationId ? { conversationId } : {}),\n source\n };\n }\n\n if (\n mention.providerId === \"workspace-reference\" &&\n mention.scope?.source?.trim() === \"app\"\n ) {\n return {\n type: \"open-workspace-app\",\n workspaceId,\n appId: targetId,\n source\n };\n }\n\n return null;\n}\n\nfunction parseWorkspaceIssueMentionMode(\n value: string | null\n): WorkspaceIssueMentionMode | null {\n const trimmed = value?.trim();\n return trimmed === \"breakdown\" || trimmed === \"execute\" ? trimmed : null;\n}\n\nexport function resolveWorkspaceLinkAction({\n href,\n workspaceRoot,\n basePath,\n source\n}: ResolveWorkspaceLinkActionInput): WorkspaceLinkAction | null {\n return (\n resolveWorkspaceMentionLinkAction({ href, source }) ??\n resolveLocalAssetPreviewLinkAction({\n path: href,\n source\n }) ??\n resolveWorkspaceFileLinkAction({\n path: href,\n workspaceRoot,\n basePath,\n source\n }) ??\n resolveWorkspaceUrlLinkAction({ url: href, source })\n );\n}\n","export interface StreamingMarkdownTailStabilizerOptions {\n streaming: boolean;\n maxTailChars?: number;\n}\n\nexport interface StreamingMarkdownTailStabilizerResult {\n content: string;\n changed: boolean;\n reason?: string;\n}\n\nconst DEFAULT_MAX_TAIL_CHARS = 4096;\n\nexport function stabilizeStreamingMarkdownTail(\n content: string,\n options: StreamingMarkdownTailStabilizerOptions\n): StreamingMarkdownTailStabilizerResult {\n if (!options.streaming || content.length === 0) {\n return { content, changed: false };\n }\n\n const maxTailChars = Math.max(\n 256,\n options.maxTailChars ?? DEFAULT_MAX_TAIL_CHARS\n );\n const tailStart = Math.max(0, content.length - maxTailChars);\n const tail = content.slice(tailStart);\n\n const fence = findOpenFence(tail);\n if (fence) {\n return {\n content: `${content}\\n${fence.marker.repeat(fence.length)}`,\n changed: true,\n reason: \"open-fence\"\n };\n }\n\n const incompleteLink = stabilizeIncompleteTailLink(content);\n if (incompleteLink) {\n return incompleteLink;\n }\n\n const listMarker = stabilizeDanglingListMarker(content);\n if (listMarker) {\n return listMarker;\n }\n\n const tableRow = stabilizePartialTableRow(content);\n if (tableRow) {\n return tableRow;\n }\n\n const inlineCode = findOpenInlineCodeSpan(tail);\n if (inlineCode) {\n return {\n content: `${content}${\"`\".repeat(inlineCode.length)}`,\n changed: true,\n reason: \"open-inline-code\"\n };\n }\n\n const emphasis = stabilizeTrailingEmphasisMarker(content);\n if (emphasis) {\n return emphasis;\n }\n\n return { content, changed: false };\n}\n\nfunction findOpenFence(\n tail: string\n): { marker: \"`\" | \"~\"; length: number } | null {\n let openFence: { marker: \"`\" | \"~\"; length: number } | null = null;\n for (const line of tail.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\")) {\n const fence = parseFenceLine(line);\n if (!fence) {\n continue;\n }\n if (!openFence) {\n openFence = fence;\n continue;\n }\n if (fence.marker === openFence.marker && fence.length >= openFence.length) {\n openFence = null;\n }\n }\n return openFence;\n}\n\nfunction parseFenceLine(\n line: string\n): { marker: \"`\" | \"~\"; length: number } | null {\n let index = 0;\n while (index < line.length && line[index] === \" \" && index < 4) {\n index += 1;\n }\n const marker = line[index];\n if (marker !== \"`\" && marker !== \"~\") {\n return null;\n }\n\n let length = 0;\n while (line[index + length] === marker) {\n length += 1;\n }\n return length >= 3 ? { marker, length } : null;\n}\n\nfunction stabilizeIncompleteTailLink(\n content: string\n): StreamingMarkdownTailStabilizerResult | null {\n const lineStart = content.lastIndexOf(\"\\n\") + 1;\n const line = content.slice(lineStart);\n const linkStart = line.lastIndexOf(\"[\");\n const imageStart = line.lastIndexOf(\"![\");\n const openBracketIndex =\n imageStart >= 0 && imageStart + 1 === linkStart ? imageStart : linkStart;\n if (openBracketIndex < 0) {\n return null;\n }\n\n const absoluteOpenIndex = lineStart + openBracketIndex;\n const suffix = content.slice(absoluteOpenIndex);\n const closeLabelIndex = suffix.indexOf(\"]\");\n if (closeLabelIndex < 0) {\n const label = suffix.startsWith(\"![\") ? suffix.slice(2) : suffix.slice(1);\n return {\n content: `${content.slice(0, absoluteOpenIndex)}${label}`,\n changed: true,\n reason: \"incomplete-link-label\"\n };\n }\n\n if (suffix[closeLabelIndex + 1] !== \"(\" || suffix.includes(\")\")) {\n return null;\n }\n\n const label = suffix.startsWith(\"![\")\n ? suffix.slice(2, closeLabelIndex)\n : suffix.slice(1, closeLabelIndex);\n return {\n content: `${content.slice(0, absoluteOpenIndex)}${label}`,\n changed: true,\n reason: \"incomplete-link-target\"\n };\n}\n\nfunction stabilizeDanglingListMarker(\n content: string\n): StreamingMarkdownTailStabilizerResult | null {\n const lineStart = content.lastIndexOf(\"\\n\") + 1;\n const line = content.slice(lineStart);\n const trimmed = line.trim();\n const isBullet = trimmed === \"-\" || trimmed === \"*\" || trimmed === \"+\";\n const isOrdered =\n trimmed.length >= 2 &&\n trimmed.endsWith(\".\") &&\n [...trimmed.slice(0, -1)].every((char) => char >= \"0\" && char <= \"9\");\n if (!isBullet && !isOrdered) {\n return null;\n }\n return {\n content: content.slice(0, lineStart),\n changed: true,\n reason: \"dangling-list-marker\"\n };\n}\n\nfunction stabilizePartialTableRow(\n content: string\n): StreamingMarkdownTailStabilizerResult | null {\n if (content.endsWith(\"\\n\")) {\n return null;\n }\n const lines = content.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const currentLine = lines.at(-1) ?? \"\";\n const previousLine = lines.at(-2) ?? \"\";\n if (!currentLine.includes(\"|\") || !previousLine.includes(\"|\")) {\n return null;\n }\n if (currentLine.trimEnd().endsWith(\"|\")) {\n return null;\n }\n if (countChar(previousLine, \"|\") < 2) {\n return null;\n }\n return {\n content: `${content} |`,\n changed: true,\n reason: \"partial-table-row\"\n };\n}\n\nfunction findOpenInlineCodeSpan(tail: string): { length: number } | null {\n const lastParagraph = tail.slice(tail.lastIndexOf(\"\\n\\n\") + 2);\n let openLength = 0;\n for (let index = 0; index < lastParagraph.length; index += 1) {\n if (lastParagraph[index] !== \"`\") {\n continue;\n }\n let length = 1;\n while (lastParagraph[index + length] === \"`\") {\n length += 1;\n }\n if (length >= 3) {\n index += length - 1;\n continue;\n }\n openLength = openLength === length ? 0 : length;\n index += length - 1;\n }\n return openLength > 0 ? { length: openLength } : null;\n}\n\nfunction stabilizeTrailingEmphasisMarker(\n content: string\n): StreamingMarkdownTailStabilizerResult | null {\n const marker = content.at(-1);\n if (marker !== \"*\" && marker !== \"_\") {\n return null;\n }\n const previous = content.at(-2);\n const nextContent =\n previous === marker ? content.slice(0, -2) : content.slice(0, -1);\n return {\n content: nextContent,\n changed: true,\n reason: \"trailing-emphasis-marker\"\n };\n}\n\nfunction countChar(value: string, char: string): number {\n let count = 0;\n for (const current of value) {\n if (current === char) {\n count += 1;\n }\n }\n return count;\n}\n","import {\n startTransition,\n useEffect,\n useRef,\n useState,\n type MutableRefObject\n} from \"react\";\n\nexport interface StreamingVisibleTextOptions {\n enabled: boolean;\n frameMs?: number;\n maxCharsPerSecond?: number;\n trailingFlushChars?: number;\n}\n\nconst DEFAULT_FRAME_MS = 24;\nconst DEFAULT_MAX_CHARS_PER_SECOND = 6_000;\nconst DEFAULT_TRAILING_FLUSH_CHARS = 0;\n\nexport function useStreamingVisibleText(\n sourceText: string,\n options: StreamingVisibleTextOptions\n): string {\n const {\n enabled,\n frameMs = DEFAULT_FRAME_MS,\n maxCharsPerSecond = DEFAULT_MAX_CHARS_PER_SECOND,\n trailingFlushChars = DEFAULT_TRAILING_FLUSH_CHARS\n } = options;\n const [visibleText, setVisibleText] = useState(sourceText);\n const sourceRef = useRef(sourceText);\n const visibleRef = useRef(visibleText);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n visibleRef.current = visibleText;\n }, [visibleText]);\n\n useEffect(\n () => () => {\n clearStreamingVisibleTextTimer(timerRef);\n },\n []\n );\n\n useEffect(() => {\n sourceRef.current = sourceText;\n\n if (!enabled) {\n clearStreamingVisibleTextTimer(timerRef);\n visibleRef.current = sourceText;\n setVisibleText(sourceText);\n return;\n }\n\n if (sourceText === visibleRef.current || timerRef.current !== null) {\n return;\n }\n\n timerRef.current = setTimeout(\n () => {\n timerRef.current = null;\n const nextVisibleText = advanceStreamingVisibleText({\n visibleText: visibleRef.current,\n sourceText: sourceRef.current,\n frameMs,\n maxCharsPerSecond,\n trailingFlushChars\n });\n\n if (nextVisibleText === visibleRef.current) {\n return;\n }\n\n visibleRef.current = nextVisibleText;\n startTransition(() => {\n setVisibleText(nextVisibleText);\n });\n },\n Math.max(1, frameMs)\n );\n\n return undefined;\n }, [\n enabled,\n frameMs,\n maxCharsPerSecond,\n sourceText,\n trailingFlushChars,\n visibleText\n ]);\n\n return enabled ? visibleText : sourceText;\n}\n\nexport function advanceStreamingVisibleText({\n visibleText,\n sourceText,\n frameMs = DEFAULT_FRAME_MS,\n maxCharsPerSecond = DEFAULT_MAX_CHARS_PER_SECOND,\n trailingFlushChars = DEFAULT_TRAILING_FLUSH_CHARS\n}: {\n visibleText: string;\n sourceText: string;\n frameMs?: number;\n maxCharsPerSecond?: number;\n trailingFlushChars?: number;\n}): string {\n if (visibleText === sourceText) {\n return visibleText;\n }\n\n const prefixLength = sourceText.startsWith(visibleText)\n ? visibleText.length\n : commonPrefixLength(visibleText, sourceText);\n const stablePrefix = sourceText.slice(0, prefixLength);\n const remainingLength = sourceText.length - prefixLength;\n if (remainingLength <= trailingFlushChars) {\n return sourceText;\n }\n\n const charsPerFrame = Math.max(\n 1,\n Math.ceil((Math.max(1, maxCharsPerSecond) * Math.max(1, frameMs)) / 1000)\n );\n return sourceText.slice(\n 0,\n Math.min(sourceText.length, stablePrefix.length + charsPerFrame)\n );\n}\n\nfunction commonPrefixLength(left: string, right: string): number {\n const maxLength = Math.min(left.length, right.length);\n for (let index = 0; index < maxLength; index += 1) {\n if (left.charCodeAt(index) !== right.charCodeAt(index)) {\n return index;\n }\n }\n return maxLength;\n}\n\nfunction clearStreamingVisibleTextTimer(\n timerRef: MutableRefObject<ReturnType<typeof setTimeout> | null>\n): void {\n if (timerRef.current === null) {\n return;\n }\n clearTimeout(timerRef.current);\n timerRef.current = null;\n}\n","import type { KeyboardEvent, MouseEvent, PointerEvent } from \"react\";\n\nconst COLLAPSED_LINE_LIMIT = 8;\nconst APPROX_CHARS_PER_LINE = 34;\n\nexport interface StreamingMarkdownBlock {\n content: string;\n initialKeyContent: string;\n}\n\nexport function splitStreamingMarkdownBlocks(\n content: string\n): StreamingMarkdownBlock[] {\n const normalized = content.replace(/\\r\\n?/g, \"\\n\");\n if (!normalized) {\n return [{ content: \"\", initialKeyContent: \"\" }];\n }\n\n const lines = normalized.split(\"\\n\");\n const blocks: StreamingMarkdownBlock[] = [];\n const current: string[] = [];\n let fence: { marker: string; length: number } | null = null;\n\n for (const line of lines) {\n current.push(line);\n const lineFence = parseStreamingFence(line);\n if (lineFence) {\n if (!fence) {\n fence = lineFence;\n } else if (\n lineFence.marker === fence.marker &&\n lineFence.length >= fence.length\n ) {\n fence = null;\n }\n continue;\n }\n if (!fence && line.trim() === \"\") {\n pushStreamingMarkdownBlock(blocks, current);\n }\n }\n pushStreamingMarkdownBlock(blocks, current);\n return blocks.length > 0\n ? blocks\n : [{ content: normalized, initialKeyContent: normalized }];\n}\n\nexport function pushStreamingMarkdownBlock(\n blocks: StreamingMarkdownBlock[],\n lines: string[]\n): void {\n if (lines.length === 0) {\n return;\n }\n const content = lines.join(\"\\n\");\n if (!content) {\n lines.length = 0;\n return;\n }\n blocks.push({\n content,\n initialKeyContent: content\n });\n lines.length = 0;\n}\n\nexport function parseStreamingFence(\n line: string\n): { marker: string; length: number } | null {\n const trimmed = line.trimStart();\n const marker = trimmed[0];\n if (marker !== \"`\" && marker !== \"~\") {\n return null;\n }\n let length = 0;\n while (trimmed[length] === marker) {\n length += 1;\n }\n return length >= 3 ? { marker, length } : null;\n}\n\nexport function resolveMarkdownAnchorHref(\n target: EventTarget | null\n): string | null {\n if (!(target instanceof Element)) {\n return null;\n }\n const link = target.closest(\"[data-agent-link-href],a[href]\");\n if (!(link instanceof HTMLElement)) {\n return null;\n }\n const dataHref = link.dataset.agentLinkHref?.trim();\n if (dataHref) {\n return dataHref;\n }\n if (link instanceof HTMLAnchorElement) {\n return link.getAttribute(\"href\")?.trim() || null;\n }\n return null;\n}\n\nexport function activateMarkdownLink(\n event:\n | KeyboardEvent<HTMLElement>\n | MouseEvent<HTMLElement>\n | PointerEvent<HTMLElement>,\n href: string,\n onLinkClick?: (href: string) => void\n): void {\n const target = href.trim();\n if (!target) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n onLinkClick?.(target);\n}\n\nexport function activateMarkdownLinkFromKey(\n event: KeyboardEvent<HTMLElement>,\n href: string,\n onLinkClick?: (href: string) => void\n): void {\n if (event.key !== \"Enter\" && event.key !== \" \") {\n return;\n }\n activateMarkdownLink(event, href, onLinkClick);\n}\n\nexport function activateMarkdownLinkFromPointer(\n event: PointerEvent<HTMLElement>,\n href: string,\n onLinkClick?: (href: string) => void\n): void {\n if (event.button !== 0) {\n return;\n }\n activateMarkdownLink(event, href, onLinkClick);\n}\n\nexport function hashMarkdownProfilerContent(content: string): string {\n let hash = 0;\n for (let index = 0; index < content.length; index += 1) {\n hash = (hash * 31 + content.charCodeAt(index)) | 0;\n }\n return `${content.length}:${Math.abs(hash)}`;\n}\n\nexport function isLikelyLongerThanLineLimit(content: string): boolean {\n const normalizedLines = content.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n if (normalizedLines.length > COLLAPSED_LINE_LIMIT) {\n return true;\n }\n const estimatedLineCount = normalizedLines.reduce((total, line) => {\n const trimmed = line.trim();\n const blockSpacing = /^(#{1,6}\\s|\\s*[-*+]\\s|\\s*\\d+\\.\\s|>)/.test(trimmed)\n ? 1\n : 0;\n return (\n total +\n Math.max(1, Math.ceil(trimmed.length / APPROX_CHARS_PER_LINE)) +\n blockSpacing\n );\n }, 0);\n return estimatedLineCount > COLLAPSED_LINE_LIMIT;\n}\n","import { defaultUrlTransform } from \"react-markdown\";\nimport {\n resolveWorkspaceImageMimeType,\n resolveWorkspaceVideoMimeType\n} from \"@tutti-os/workspace-file-preview\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\nimport { managedAgentRoundedIconUrl } from \"./managedAgentIcons\";\nimport { isDirectAgentGeneratedMediaPath } from \"../actions/workspaceFilePathCandidate\";\nimport {\n resolveAgentTargetPresentation,\n type AgentMessageMarkdownAgentTarget\n} from \"./AgentTargetPresentationContext\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"./AgentMessageMarkdown\";\n\nconst PLAIN_SESSION_MENTION_AGENT_LABELS = [\n \"Claude Code\",\n \"Nexight\",\n \"Codex\"\n] as const;\nconst STANDARD_MARKDOWN_LINK_PROTOCOLS = [\n \"http\",\n \"https\",\n \"irc\",\n \"ircs\",\n \"mailto\",\n \"tel\",\n \"xmpp\"\n] as const;\nconst EMPTY_AGENT_TARGETS: readonly AgentMessageMarkdownAgentTarget[] = [];\n\nexport type MarkdownMediaKind = \"image\" | \"video\";\nexport type MarkdownMediaState =\n | { status: \"loading\" }\n | { kind: MarkdownMediaKind; status: \"ready\"; src: string }\n | {\n status: \"error\";\n reason: \"unsupported\" | \"read-failed\";\n detail?: string;\n };\ninterface CachedMarkdownMedia {\n kind: MarkdownMediaKind;\n objectUrl: string;\n refCount: number;\n revokeTimer: ReturnType<typeof setTimeout> | null;\n}\nconst cachedMarkdownMedia = new Map<string, CachedMarkdownMedia>();\nconst CACHED_MARKDOWN_MEDIA_REVOKE_DELAY_MS = 250;\n\nexport function resetCachedMarkdownMediaForTests(): void {\n if (process.env.NODE_ENV !== \"test\") return;\n for (const [path, entry] of cachedMarkdownMedia) {\n if (entry.revokeTimer) clearTimeout(entry.revokeTimer);\n URL.revokeObjectURL(entry.objectUrl);\n cachedMarkdownMedia.delete(path);\n }\n}\n\nexport function isLocalAbsolutePath(path: string): boolean {\n const candidate = path.trim();\n return (\n candidate.length > 1 &&\n candidate.startsWith(\"/\") &&\n !candidate.startsWith(\"//\") &&\n !candidate.includes(\"://\") &&\n !/\\s/.test(candidate)\n );\n}\n\nexport function isHomeRelativePath(path: string): boolean {\n const candidate = path.trim();\n return (\n candidate.length > 0 &&\n !/\\s/.test(candidate) &&\n (candidate === \"~\" ||\n candidate.startsWith(\"~/\") ||\n candidate.startsWith(\"~\\\\\"))\n );\n}\n\nexport function isWindowsAbsolutePath(path: string): boolean {\n const candidate = path.trim();\n return /^[A-Za-z]:[\\\\/]/.test(candidate) && !/\\s/.test(candidate);\n}\n\nexport function isExplicitWorkspaceFilePath(path: string): boolean {\n const candidate = path.trim();\n if (!candidate || candidate.includes(\"://\")) {\n return false;\n }\n return (\n isLocalAbsolutePath(candidate) ||\n isHomeRelativePath(candidate) ||\n isWindowsAbsolutePath(candidate)\n );\n}\n\nexport function isClickableMarkdownHref(href: string): boolean {\n const target = href.trim();\n return Boolean(\n target &&\n (isStandardMarkdownLinkHref(target) ||\n isRichTextMentionHref(target) ||\n isExplicitWorkspaceFilePath(target))\n );\n}\n\nexport function isStandardMarkdownLinkHref(href: string): boolean {\n const target = href.trim();\n if (!target || isExplicitWorkspaceFilePath(target)) {\n return false;\n }\n if (target.startsWith(\"#\")) {\n return target.length > 1;\n }\n let url: URL;\n try {\n url = new URL(target);\n } catch {\n return false;\n }\n const protocol = url.protocol.replace(/:$/, \"\").toLowerCase();\n return STANDARD_MARKDOWN_LINK_PROTOCOLS.includes(\n protocol as (typeof STANDARD_MARKDOWN_LINK_PROTOCOLS)[number]\n );\n}\n\nexport function resolveRenderableMarkdownMediaSrc(src: string): string {\n const trimmed = src.trim();\n if (!trimmed) {\n return src;\n }\n if (!isLocalAbsolutePath(trimmed) || trimmed.startsWith(\"/workspace/\")) {\n return src;\n }\n return new URL(trimmed, \"file://\").toString();\n}\n\nexport function canRenderMarkdownVideoFallback(src: unknown): boolean {\n if (typeof src !== \"string\") {\n return false;\n }\n const trimmed = src.trim();\n if (!isLocalAbsolutePath(trimmed) || trimmed.startsWith(\"/workspace/\")) {\n return true;\n }\n return isDirectAgentGeneratedMediaPath(trimmed);\n}\n\nexport function resolveMarkdownMediaKind(\n pathOrName: string\n): MarkdownMediaKind | null {\n return resolveMarkdownMediaType(pathOrName)?.kind ?? null;\n}\n\nexport function resolveMarkdownMediaType(\n pathOrName: string\n): { kind: MarkdownMediaKind; mimeType: string } | null {\n const imageMimeType = resolveWorkspaceImageMimeType(pathOrName);\n if (imageMimeType) {\n return { kind: \"image\", mimeType: imageMimeType };\n }\n const videoMimeType = resolveWorkspaceVideoMimeType(pathOrName);\n if (videoMimeType) {\n return { kind: \"video\", mimeType: videoMimeType };\n }\n return null;\n}\n\nexport function peekCachedMarkdownMediaState(\n path: string\n): MarkdownMediaState | null {\n const entry = cachedMarkdownMedia.get(path);\n return entry\n ? { kind: entry.kind, status: \"ready\", src: entry.objectUrl }\n : null;\n}\n\nexport function retainCachedMarkdownMedia(\n path: string\n): { kind: MarkdownMediaKind; src: string } | null {\n const entry = cachedMarkdownMedia.get(path);\n if (!entry) {\n return null;\n }\n entry.refCount += 1;\n if (entry.revokeTimer) {\n clearTimeout(entry.revokeTimer);\n entry.revokeTimer = null;\n }\n return { kind: entry.kind, src: entry.objectUrl };\n}\n\nexport function cacheMarkdownMedia(\n path: string,\n kind: MarkdownMediaKind,\n blob: Blob\n): string {\n const entry = cachedMarkdownMedia.get(path);\n if (entry) {\n entry.refCount += 1;\n if (entry.revokeTimer) {\n clearTimeout(entry.revokeTimer);\n entry.revokeTimer = null;\n }\n return entry.objectUrl;\n }\n const objectUrl = URL.createObjectURL(blob);\n cachedMarkdownMedia.set(path, {\n kind,\n objectUrl,\n refCount: 1,\n revokeTimer: null\n });\n return objectUrl;\n}\n\nexport function releaseCachedMarkdownMedia(\n path: string,\n objectUrl: string\n): void {\n const entry = cachedMarkdownMedia.get(path);\n if (!entry || entry.objectUrl !== objectUrl) {\n URL.revokeObjectURL(objectUrl);\n return;\n }\n entry.refCount = Math.max(0, entry.refCount - 1);\n if (entry.refCount > 0 || entry.revokeTimer) {\n return;\n }\n // timing: grace period before revoking, so a quick remount can reuse the object URL\n entry.revokeTimer = setTimeout(() => {\n const current = cachedMarkdownMedia.get(path);\n if (!current || current.objectUrl !== objectUrl || current.refCount > 0) {\n return;\n }\n cachedMarkdownMedia.delete(path);\n URL.revokeObjectURL(objectUrl);\n }, CACHED_MARKDOWN_MEDIA_REVOKE_DELAY_MS);\n}\n\nexport function normalizeLocalPathMarkdownLinks(content: string): string {\n let out = \"\";\n for (let index = 0; index < content.length; ) {\n const codeSpanEnd = codeSpanEndIndex(content, index);\n if (codeSpanEnd > index) {\n out += content.slice(index, codeSpanEnd);\n index = codeSpanEnd;\n continue;\n }\n const normalized = normalizeLocalPathMarkdownLinkAt(content, index);\n if (normalized) {\n out += normalized.markdown;\n index = normalized.end;\n continue;\n }\n out += content[index];\n index += 1;\n }\n return out;\n}\n\nfunction normalizeLocalPathMarkdownLinkAt(\n content: string,\n index: number\n): { markdown: string; end: number } | null {\n if (content[index] !== \"[\") return null;\n const labelEnd = content.indexOf(\"]\", index + 1);\n if (labelEnd < 0 || content[labelEnd + 1] !== \"(\") return null;\n const hrefStart = labelEnd + 2;\n if (content[hrefStart] === \"<\") return null;\n let hrefEnd = hrefStart;\n while (hrefEnd < content.length) {\n const current = content[hrefEnd];\n if (current === \"\\\\\" && hrefEnd + 1 < content.length) {\n hrefEnd += 2;\n continue;\n }\n if (current === \"\\n\" || current === \"\\r\") return null;\n if (current === \")\") break;\n hrefEnd += 1;\n }\n if (content[hrefEnd] !== \")\") return null;\n const target = content.slice(hrefStart, hrefEnd).trim();\n if (\n !target ||\n !/\\s/.test(target) ||\n /[<>]/.test(target) ||\n !isPotentialLocalMarkdownPathHref(target)\n ) {\n return null;\n }\n return {\n markdown: `${content.slice(index, hrefStart)}<${target}>)`,\n end: hrefEnd + 1\n };\n}\n\nfunction isPotentialLocalMarkdownPathHref(href: string): boolean {\n const target = href.trim();\n if (!target || target.includes(\"://\")) return false;\n return (\n (target.startsWith(\"/\") && !target.startsWith(\"//\")) ||\n target.startsWith(\"~/\") ||\n target.startsWith(\"~\\\\\") ||\n /^[A-Za-z]:[\\\\/]/.test(target)\n );\n}\n\nexport function normalizePlainIssueMentionTitleContent(\n content: string\n): string {\n const trimmed = content.trim();\n if (\n trimmed !== content ||\n !trimmed.startsWith(\"@\") ||\n trimmed.includes(\"\\n\") ||\n markdownLinkEndIndex(trimmed, 0) === trimmed.length\n ) {\n return content;\n }\n\n const label = trimmed.replace(/^@+/, \"\").trim();\n if (!label) {\n return content;\n }\n\n return content;\n}\n\nexport function normalizeMentionMarkdownLinks(content: string): string {\n return content\n .replace(/\\]([\\t ]*\\r?\\n[\\t ]*)+\\((mention:\\/\\/)/g, \"]($2\")\n .replace(/\\]\\((mention:\\/\\/[A-Za-z0-9.-]+)\\)\\?([^\\s)]+)/g, \"]($1?$2)\");\n}\n\nexport function isMentionOnlyMarkdownContent(content: string): boolean {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return false;\n }\n if (markdownLinkEndIndex(trimmed, 0) !== trimmed.length) {\n return false;\n }\n const labelEnd = trimmed.indexOf(\"]\");\n return isRichTextMentionHref(trimmed.slice(labelEnd + 2));\n}\n\nexport function normalizePlainSessionMentionTitle(content: string): string {\n const trimmed = content.trim();\n if (\n trimmed !== content ||\n !trimmed.startsWith(\"@\") ||\n trimmed.includes(\"\\n\")\n ) {\n return content;\n }\n\n for (const agentLabel of PLAIN_SESSION_MENTION_AGENT_LABELS) {\n const separator = ` & ${agentLabel}`;\n const separatorIndex = trimmed.indexOf(separator);\n if (separatorIndex <= 1) {\n continue;\n }\n\n const userLabel = trimmed.slice(1, separatorIndex).trim();\n if (!userLabel) {\n continue;\n }\n\n return content;\n }\n\n return content;\n}\n\nexport function markdownUrlTransform(value: string): string {\n const target = value.trim();\n return isRichTextMentionHref(target) ||\n isExplicitWorkspaceFilePath(target) ||\n isStandardMarkdownLinkHref(target)\n ? target\n : defaultUrlTransform(value);\n}\n\ntype MentionKind =\n | \"session\"\n | \"agent-target\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\"\n | \"pasted-text\";\n\nexport interface ParsedMentionLink {\n agentProviderId?: string;\n appId?: string;\n entityId: string;\n kind: MentionKind;\n label: string;\n iconUrl?: string;\n providerId: string;\n referenceSource?: string;\n scope?: Readonly<Record<string, string>>;\n /** 引用文件数量(workspace-reference 专用,来自 href 的 count 参数)。 */\n fileCount?: number;\n}\n\nexport function parseMentionLink(\n href: string,\n rawLabel: string,\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[] = [],\n agentTargets: readonly AgentMessageMarkdownAgentTarget[] = EMPTY_AGENT_TARGETS,\n appFactoryFallbackLabel = \"Create app\"\n): ParsedMentionLink | null {\n const mention = parseRichTextMentionHref(href, rawLabel);\n if (!mention) {\n return null;\n }\n const resource = mention.providerId.trim().toLowerCase();\n const kind =\n resource === \"agent-session\"\n ? \"session\"\n : resource === \"workspace-app\"\n ? \"workspace-app\"\n : resource === \"workspace-reference\"\n ? \"workspace-reference\"\n : resource === \"workspace-app-factory\"\n ? \"workspace-app-factory\"\n : resource === \"workspace-issue\"\n ? \"workspace-issue\"\n : resource === \"agent-target\"\n ? \"agent-target\"\n : resource === \"pasted-text\"\n ? \"pasted-text\"\n : resource;\n if (\n kind !== \"session\" &&\n kind !== \"agent-target\" &&\n kind !== \"workspace-app\" &&\n kind !== \"workspace-reference\" &&\n kind !== \"workspace-app-factory\" &&\n kind !== \"workspace-issue\" &&\n kind !== \"pasted-text\"\n ) {\n return null;\n }\n const entityId = mention.entityId.trim();\n if (!entityId) {\n return null;\n }\n const label =\n rawLabel.trim().replace(/^@+/, \"\").trim() ||\n (kind === \"workspace-app-factory\" ? appFactoryFallbackLabel : \"\");\n const identity = {\n entityId,\n providerId: mention.providerId,\n ...(mention.scope ? { scope: mention.scope } : {})\n };\n if (kind === \"pasted-text\") {\n return { ...identity, kind, label };\n }\n if (kind === \"workspace-app\" || kind === \"workspace-app-factory\") {\n const appId = kind === \"workspace-app\" ? entityId : \"\";\n const workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n return {\n ...identity,\n kind,\n ...(kind === \"workspace-app\" ? { appId } : {}),\n label,\n ...(kind === \"workspace-app\"\n ? {\n iconUrl: resolveWorkspaceAppMentionIconUrl({\n appId,\n workspaceAppIcons,\n workspaceId\n })\n }\n : {})\n };\n }\n if (kind === \"agent-target\") {\n const workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n const target = resolveAgentTargetPresentation({\n agentTargetId: entityId,\n agentTargets,\n workspaceId\n });\n const agentProviderId = target?.provider?.trim() || undefined;\n const targetLabel = target?.name?.trim() || label;\n return {\n ...identity,\n agentProviderId,\n kind,\n label: targetLabel,\n iconUrl:\n target?.iconUrl?.trim() || managedAgentRoundedIconUrl(agentProviderId)\n };\n }\n if (kind === \"session\") {\n const workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n const agentTargetId = mention.scope?.agentTargetId?.trim() || \"\";\n const target = resolveAgentTargetPresentation({\n agentTargetId,\n agentTargets,\n workspaceId\n });\n const localProvider = agentTargetId.startsWith(\"local:\")\n ? agentTargetId.slice(\"local:\".length).trim()\n : \"\";\n return {\n ...identity,\n kind,\n label,\n iconUrl:\n target?.iconUrl?.trim() ||\n (localProvider ? managedAgentRoundedIconUrl(localProvider) : undefined)\n };\n }\n if (kind === \"workspace-reference\") {\n const source = mention.scope?.source?.trim() ?? \"\";\n const workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n const appIconUrl =\n source === \"app\"\n ? resolveWorkspaceAppMentionIconUrl({\n appId: entityId,\n workspaceAppIcons,\n workspaceId\n })\n : undefined;\n return {\n ...identity,\n kind,\n label,\n iconUrl: mention.scope?.icon?.trim() || appIconUrl,\n fileCount: referenceFileCountFromParam(mention.scope?.count ?? null),\n referenceSource: source || undefined\n };\n }\n if (kind === \"workspace-issue\") {\n return {\n ...identity,\n kind,\n label\n };\n }\n return {\n ...identity,\n kind,\n label\n };\n}\n\nexport function referenceFileCountFromParam(\n value: string | null\n): number | undefined {\n if (!value) {\n return undefined;\n }\n const parsed = Number.parseInt(value.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nexport function resolveWorkspaceAppMentionIconUrl(input: {\n appId: string;\n workspaceId: string;\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n}): string | undefined {\n const appId = input.appId.trim();\n if (!appId) {\n return undefined;\n }\n const workspaceId = input.workspaceId.trim();\n const exactMatch = input.workspaceAppIcons.find(\n (icon) =>\n icon.appId.trim() === appId &&\n (icon.workspaceId?.trim() ?? \"\") === workspaceId &&\n icon.iconUrl?.trim()\n );\n const fallbackMatch = input.workspaceAppIcons.find(\n (icon) => icon.appId.trim() === appId && icon.iconUrl?.trim()\n );\n return (\n exactMatch?.iconUrl?.trim() || fallbackMatch?.iconUrl?.trim() || undefined\n );\n}\n\nexport function markdownLinkEndIndex(content: string, index: number): number {\n if (content[index] !== \"[\") {\n return -1;\n }\n const labelEnd = content.indexOf(\"]\", index + 1);\n if (labelEnd < 0 || content[labelEnd + 1] !== \"(\") {\n return -1;\n }\n const hrefEnd = content.indexOf(\")\", labelEnd + 2);\n return hrefEnd < 0 ? -1 : hrefEnd + 1;\n}\n\nexport function codeSpanEndIndex(content: string, index: number): number {\n if (content[index] !== \"`\") {\n return -1;\n }\n let tickCount = 1;\n while (content[index + tickCount] === \"`\") {\n tickCount += 1;\n }\n const fence = \"`\".repeat(tickCount);\n const end = content.indexOf(fence, index + tickCount);\n return end < 0 ? -1 : end + tickCount;\n}\n","import { createContext } from \"react\";\n\nexport const MarkdownLinkContext = createContext(false);\n","import {\n useCallback,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type ReactNode\n} from \"react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { translate } from \"../i18n/index\";\nimport { cn } from \"../app/renderer/lib/utils\";\nimport type { MarkdownDomProps } from \"./AgentMessageMarkdown\";\n\nexport function MarkdownCode({\n node: _node,\n children,\n className,\n ...props\n}: MarkdownDomProps<\"code\">): JSX.Element {\n \"use memo\";\n return (\n <code {...props} className={className}>\n {children}\n </code>\n );\n}\n\nconst MARKDOWN_ORDERED_LIST_STYLE: CSSProperties = {\n listStylePosition: \"outside\",\n margin: \"12px 0 8px\",\n paddingInlineStart: 34,\n paddingInlineEnd: 16\n};\n\nconst MARKDOWN_UNORDERED_LIST_STYLE: CSSProperties = {\n margin: \"12px 0 8px\",\n paddingInlineStart: 0\n};\n\nconst MARKDOWN_LIST_ITEM_STYLE: CSSProperties = {\n margin: \"4px 0\"\n};\n\nexport function MarkdownUnorderedList({\n node: _node,\n className,\n style,\n ...props\n}: MarkdownDomProps<\"ul\">): JSX.Element {\n \"use memo\";\n return (\n <ul\n {...props}\n className={cn(\n '[&_li]:relative [&_li]:list-none [&_li]:pl-[34px] [&_li::before]:absolute [&_li::before]:left-4 [&_li::before]:top-[0.78em] [&_li::before]:h-1.5 [&_li::before]:w-1.5 [&_li::before]:-translate-y-1/2 [&_li::before]:rounded-full [&_li::before]:bg-[var(--text-tertiary)] [&_li::before]:content-[\"\"]',\n className\n )}\n style={{ ...MARKDOWN_UNORDERED_LIST_STYLE, ...style }}\n />\n );\n}\n\nexport function MarkdownOrderedList({\n node: _node,\n style,\n ...props\n}: MarkdownDomProps<\"ol\">): JSX.Element {\n \"use memo\";\n return (\n <ol\n {...props}\n style={{\n ...MARKDOWN_ORDERED_LIST_STYLE,\n listStyleType: \"decimal\",\n ...style\n }}\n />\n );\n}\n\nexport function MarkdownListItem({\n node: _node,\n style,\n ...props\n}: MarkdownDomProps<\"li\">): JSX.Element {\n \"use memo\";\n return <li {...props} style={{ ...MARKDOWN_LIST_ITEM_STYLE, ...style }} />;\n}\n\nexport function MarkdownParagraph({\n node: _node,\n inline,\n ...props\n}: MarkdownDomProps<\"p\"> & {\n inline: boolean;\n}): JSX.Element {\n \"use memo\";\n if (inline) {\n return <span {...props} />;\n }\n return <p {...props} />;\n}\n\nexport function textFromReactNode(node: ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node);\n }\n if (Array.isArray(node)) {\n return node.map(textFromReactNode).join(\"\");\n }\n return \"\";\n}\n\nexport function MarkdownPre({\n children,\n ...props\n}: MarkdownDomProps<\"pre\">): JSX.Element {\n \"use memo\";\n const preRef = useRef<HTMLPreElement>(null);\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleCopy = useCallback(() => {\n const text = preRef.current?.textContent?.trim();\n if (!text) {\n return;\n }\n void navigator.clipboard?.writeText(text).then(() => {\n setCopied(true);\n if (copyResetRef.current) {\n clearTimeout(copyResetRef.current);\n }\n // timing: revert the \"copied\" affordance after the confirmation window\n copyResetRef.current = setTimeout(() => setCopied(false), 1500);\n });\n }, []);\n\n return (\n <div className=\"group relative\">\n <button\n type=\"button\"\n data-testid=\"markdown-code-copy\"\n className=\"absolute right-1.5 top-1.5 z-10 inline-flex size-5 items-center justify-center rounded-[4px] text-[var(--text-tertiary)] opacity-0 transition-opacity hover:bg-[var(--transparency-hover)] hover:text-[var(--text-secondary)] group-hover:opacity-100\"\n aria-label={translate(\"agentHost.agentGui.copyCode\")}\n title={translate(\"agentHost.agentGui.copyCode\")}\n onClick={handleCopy}\n >\n {copied ? (\n <Check size={13} strokeWidth={2} aria-hidden=\"true\" />\n ) : (\n <Copy size={13} strokeWidth={2} aria-hidden=\"true\" />\n )}\n </button>\n <pre {...props} ref={preRef}>\n {children}\n </pre>\n </div>\n );\n}\n","import { useContext, useEffect, useState, type JSX } from \"react\";\nimport { ZoomableImage } from \"../app/renderer/components/ZoomableImage\";\nimport { cn } from \"../app/renderer/lib/utils\";\nimport { useTranslation } from \"../i18n/index\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../agentActivityHost\";\nimport { workspaceFileName as basenameWorkspacePath } from \"@tutti-os/workspace-file-manager/services\";\nimport type { MarkdownDomProps } from \"./AgentMessageMarkdown\";\nimport { MarkdownLinkContext } from \"./agentMessageMarkdownContext\";\nimport {\n cacheMarkdownMedia,\n canRenderMarkdownVideoFallback,\n peekCachedMarkdownMediaState,\n releaseCachedMarkdownMedia,\n resetCachedMarkdownMediaForTests,\n resolveMarkdownMediaKind,\n resolveMarkdownMediaType,\n resolveRenderableMarkdownMediaSrc,\n retainCachedMarkdownMedia,\n isLocalAbsolutePath,\n type MarkdownMediaState\n} from \"./agentMessageMarkdownLinks\";\n\nexport function resetCachedMarkdownImagesForTests(): void {\n resetCachedMarkdownMediaForTests();\n}\n\nexport function MarkdownMedia({\n node: _node,\n src,\n alt,\n className,\n title,\n enableZoom = false,\n ...props\n}: MarkdownDomProps<\"img\"> & {\n enableZoom?: boolean;\n}): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\n const isInsideLink = useContext(MarkdownLinkContext);\n const agentHostApi = useOptionalAgentHostApi() ?? getOptionalAgentHostApi();\n const workspacePath =\n typeof src === \"string\" && isLocalAbsolutePath(src) ? src.trim() : null;\n const readWorkspaceImage = workspacePath\n ? agentHostApi?.workspace?.readFile\n : undefined;\n const canReadWorkspaceImage = Boolean(workspacePath && readWorkspaceImage);\n const shouldEnableZoom = enableZoom && !isInsideLink;\n const fallbackMediaKind =\n typeof src === \"string\" ? resolveMarkdownMediaKind(src) : null;\n const resolvedSrc =\n typeof src === \"string\" ? resolveRenderableMarkdownMediaSrc(src) : src;\n const [state, setState] = useState<MarkdownMediaState | null>(() =>\n canReadWorkspaceImage && workspacePath\n ? (peekCachedMarkdownMediaState(workspacePath) ?? { status: \"loading\" })\n : null\n );\n\n useEffect(() => {\n if (!workspacePath || !readWorkspaceImage) {\n setState(null);\n return;\n }\n\n const resolvedWorkspacePath = workspacePath;\n const resolvedReadWorkspaceImage = readWorkspaceImage;\n const cached = retainCachedMarkdownMedia(resolvedWorkspacePath);\n if (cached) {\n setState({ kind: cached.kind, status: \"ready\", src: cached.src });\n return () => {\n releaseCachedMarkdownMedia(resolvedWorkspacePath, cached.src);\n };\n }\n\n const mediaType = resolveMarkdownMediaType(resolvedWorkspacePath);\n if (!mediaType) {\n setState({\n status: \"error\",\n reason: \"unsupported\"\n });\n return;\n }\n const mediaKind = mediaType.kind;\n const mediaMimeType = mediaType.mimeType;\n\n let canceled = false;\n let objectUrl: string | null = null;\n setState({ status: \"loading\" });\n\n async function loadWorkspaceMedia(): Promise<void> {\n try {\n const result = await resolvedReadWorkspaceImage({\n path: resolvedWorkspacePath\n });\n if (canceled) {\n return;\n }\n const bytes =\n result.bytes instanceof Uint8Array\n ? result.bytes\n : new Uint8Array(result.bytes);\n const arrayBuffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n ) as ArrayBuffer;\n objectUrl = cacheMarkdownMedia(\n resolvedWorkspacePath,\n mediaKind,\n new Blob([arrayBuffer], { type: mediaMimeType })\n );\n setState({ kind: mediaKind, status: \"ready\", src: objectUrl });\n } catch (error) {\n if (!canceled) {\n setState({\n status: \"error\",\n reason: \"read-failed\",\n detail: error instanceof Error ? error.message : String(error)\n });\n }\n }\n }\n\n void loadWorkspaceMedia();\n\n return () => {\n canceled = true;\n if (objectUrl) {\n releaseCachedMarkdownMedia(resolvedWorkspacePath, objectUrl);\n }\n };\n }, [canReadWorkspaceImage, workspacePath]);\n\n if (!workspacePath || !readWorkspaceImage) {\n if (fallbackMediaKind === \"video\") {\n if (!canRenderMarkdownVideoFallback(src)) {\n return <UnsupportedMarkdownMediaPreview />;\n }\n return (\n <video\n src={resolvedSrc}\n aria-label={alt || undefined}\n title={typeof title === \"string\" ? title : undefined}\n controls\n playsInline\n preload=\"metadata\"\n className={cn(\n \"mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)]\",\n className\n )}\n />\n );\n }\n\n if (!shouldEnableZoom) {\n return (\n <img\n {...props}\n src={resolvedSrc}\n alt={alt}\n title={title}\n className={className}\n />\n );\n }\n\n return (\n <ZoomableImage\n {...props}\n src={resolvedSrc}\n alt={alt}\n title={title}\n downloadName={resolveMarkdownImageDownloadName(src, alt)}\n className={className}\n wrapElement=\"span\"\n />\n );\n }\n\n if (state?.status === \"ready\") {\n if (state.kind === \"video\") {\n return (\n <video\n src={state.src}\n aria-label={alt || undefined}\n title={typeof title === \"string\" ? title : undefined}\n controls\n playsInline\n preload=\"metadata\"\n className={cn(\n \"mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)]\",\n className\n )}\n />\n );\n }\n\n if (!shouldEnableZoom) {\n return (\n <img\n {...props}\n src={state.src}\n alt={alt}\n title={title}\n className={cn(\n \"mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)] object-contain\",\n className\n )}\n />\n );\n }\n\n return (\n <ZoomableImage\n {...props}\n src={state.src}\n alt={alt}\n title={title}\n downloadName={resolveMarkdownImageDownloadName(workspacePath, alt)}\n className={cn(\n \"mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)] object-contain\",\n className\n )}\n wrapElement=\"span\"\n />\n );\n }\n\n return (\n <span className=\"mt-2 flex min-h-[160px] w-full items-center justify-center rounded-[8px] bg-[var(--transparency-block)] px-5 py-5 text-center text-[13px] leading-5 text-[var(--text-tertiary)]\">\n {state?.status === \"error\"\n ? state.reason === \"unsupported\"\n ? t(\"agentHost.workspaceFileManager.previewUnsupported\")\n : t(\"agentHost.workspaceFileManager.previewReadFailed\", {\n message: state.detail ?? \"\"\n })\n : t(\"agentHost.workspaceFileManager.previewLoading\")}\n </span>\n );\n}\n\nfunction UnsupportedMarkdownMediaPreview(): JSX.Element {\n const { t } = useTranslation();\n return (\n <span className=\"mt-2 flex min-h-[160px] w-full items-center justify-center rounded-[8px] bg-[var(--transparency-block)] px-5 py-5 text-center text-[13px] leading-5 text-[var(--text-tertiary)]\">\n {t(\"agentHost.workspaceFileManager.previewUnsupported\")}\n </span>\n );\n}\n\nfunction resolveMarkdownImageDownloadName(\n src: unknown,\n alt: unknown\n): string | undefined {\n if (typeof src === \"string\") {\n const pathName = basenameWorkspacePath(src.trim());\n if (pathName) {\n return pathName;\n }\n }\n return typeof alt === \"string\" ? alt.trim() || undefined : undefined;\n}\n","import {\n type CSSProperties,\n type ComponentPropsWithoutRef,\n type JSX,\n type MouseEvent,\n type WheelEvent,\n useCallback,\n useEffect,\n useState\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Button,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n ToastViewport,\n CopyIcon,\n DownloadIcon,\n RestoreIcon\n} from \"@tutti-os/ui-system\";\nimport { RotateCcwIcon, ZoomInIcon, ZoomOutIcon } from \"lucide-react\";\nimport { useTranslation } from \"../../../i18n/index\";\nimport { cn } from \"../lib/utils\";\nimport { ConversationImageContextMenu } from \"../../../shared/agentConversation/components/ConversationImageContextMenu\";\nimport { copyImageToClipboard } from \"../../../shared/agentConversation/lib/copyImageToClipboard\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport {\n downloadImage,\n resolveImageDownloadName\n} from \"./zoomableImageDownload\";\n\ninterface ZoomableImageProps extends ComponentPropsWithoutRef<\"img\"> {\n downloadName?: string;\n wrapElement?: \"div\" | \"span\";\n}\n\ntype ImageCopyStatus = {\n busy: boolean;\n message: string;\n variant: \"destructive\" | \"success\";\n};\n\nconst IMAGE_PREVIEW_ZOOM_MIN = 0.5;\nconst IMAGE_PREVIEW_ZOOM_MAX = 3;\nconst IMAGE_PREVIEW_ZOOM_STEP = 0.25;\n\nexport function ZoomableImage({\n alt,\n className,\n downloadName,\n onContextMenu,\n src,\n wrapElement = \"div\",\n ...props\n}: ZoomableImageProps): JSX.Element {\n const { t } = useTranslation();\n const agentHostApi = useOptionalAgentHostApi();\n const actionSource =\n typeof src === \"string\" && src.trim() ? src.trim() : null;\n const hasImageActions = Boolean(actionSource && downloadName !== undefined);\n const [contextMenuPosition, setContextMenuPosition] = useState<{\n x: number;\n y: number;\n inZoomDialog: boolean;\n } | null>(null);\n const [copyStatus, setCopyStatus] = useState<ImageCopyStatus | null>(null);\n const [imagePreviewZoom, setImagePreviewZoom] = useState(1);\n const [isWheelZooming, setIsWheelZooming] = useState(false);\n const [isImagePreviewOpen, setIsImagePreviewOpen] = useState(false);\n const [isImagePreviewClosing, setIsImagePreviewClosing] = useState(false);\n const imagePreviewZoomPercent = Math.round(imagePreviewZoom * 100);\n const canZoomOut = imagePreviewZoom > IMAGE_PREVIEW_ZOOM_MIN;\n const canZoomIn = imagePreviewZoom < IMAGE_PREVIEW_ZOOM_MAX;\n\n const closeContextMenu = useCallback(() => {\n setContextMenuPosition(null);\n }, []);\n\n const finishClosePreviewImage = (): void => {\n setIsImagePreviewOpen(false);\n setIsImagePreviewClosing(false);\n setIsWheelZooming(false);\n setImagePreviewZoom(1);\n };\n\n const closePreviewImage = (): void => {\n if (!isImagePreviewOpen) {\n return;\n }\n setIsImagePreviewClosing(true);\n setIsWheelZooming(false);\n setImagePreviewZoom(1);\n closeContextMenu();\n };\n\n const openPreviewImage = (): void => {\n if (!actionSource) {\n return;\n }\n closeContextMenu();\n setIsImagePreviewClosing(false);\n setIsImagePreviewOpen(true);\n };\n\n useEffect(() => {\n const handleWindowKeyDown = (event: globalThis.KeyboardEvent): void => {\n if (!isImagePreviewOpen || event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n setIsImagePreviewClosing(true);\n setIsWheelZooming(false);\n setImagePreviewZoom(1);\n closeContextMenu();\n };\n\n if (contextMenuPosition) {\n document.addEventListener(\"click\", closeContextMenu);\n document.addEventListener(\"scroll\", closeContextMenu, true);\n }\n if (isImagePreviewOpen) {\n window.addEventListener(\"keydown\", handleWindowKeyDown, true);\n }\n return () => {\n document.removeEventListener(\"click\", closeContextMenu);\n document.removeEventListener(\"scroll\", closeContextMenu, true);\n window.removeEventListener(\"keydown\", handleWindowKeyDown, true);\n };\n }, [closeContextMenu, contextMenuPosition, isImagePreviewOpen]);\n\n const handleContextMenu = useCallback(\n (event: MouseEvent<HTMLElement>): void => {\n onContextMenu?.(event as MouseEvent<HTMLImageElement>);\n if (event.defaultPrevented || !actionSource || !hasImageActions) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n setContextMenuPosition({\n x: event.clientX,\n y: event.clientY,\n inZoomDialog: Boolean(event.currentTarget.closest(\".tsh-zoom-dialog\"))\n });\n },\n [actionSource, hasImageActions, onContextMenu]\n );\n\n const handleCopyImage = useCallback(async (): Promise<void> => {\n if (!actionSource) {\n return;\n }\n const copyingMessage = t(\"common.copying\");\n setCopyStatus({\n busy: true,\n message: copyingMessage,\n variant: \"success\"\n });\n closeContextMenu();\n const copied = await Promise.race([\n copyImageToClipboard(actionSource, agentHostApi?.clipboard),\n new Promise<boolean>((resolve) => {\n window.setTimeout(() => resolve(false), 5000);\n })\n ]);\n const message = t(\n copied ? \"agentHost.agentGui.messageCopied\" : \"common.copyFailed\"\n );\n setCopyStatus({\n busy: false,\n message,\n variant: copied ? \"success\" : \"destructive\"\n });\n }, [actionSource, agentHostApi?.clipboard, closeContextMenu, t]);\n\n const handleCopyImageAction = useCallback((): void => {\n void handleCopyImage().catch(() => undefined);\n }, [handleCopyImage]);\n\n const handleDownloadImage = useCallback((): void => {\n if (!actionSource) {\n return;\n }\n closeContextMenu();\n downloadImage(\n actionSource,\n resolveImageDownloadName(downloadName, actionSource, alt)\n );\n }, [actionSource, alt, closeContextMenu, downloadName]);\n const zoomOutPreviewImage = useCallback((): void => {\n setIsWheelZooming(false);\n setImagePreviewZoom((value) =>\n clampSteppedImagePreviewZoom(value - IMAGE_PREVIEW_ZOOM_STEP)\n );\n }, []);\n const zoomInPreviewImage = useCallback((): void => {\n setIsWheelZooming(false);\n setImagePreviewZoom((value) =>\n clampSteppedImagePreviewZoom(value + IMAGE_PREVIEW_ZOOM_STEP)\n );\n }, []);\n const resetPreviewImageZoom = useCallback((): void => {\n setIsWheelZooming(false);\n setImagePreviewZoom(1);\n }, []);\n const handlePreviewImageWheel = useCallback(\n (event: WheelEvent<HTMLElement>): void => {\n event.preventDefault();\n event.stopPropagation();\n if (event.deltaY === 0) {\n return;\n }\n setIsWheelZooming(true);\n setImagePreviewZoom((value) =>\n clampImagePreviewZoom(value * Math.pow(2, resolveWheelZoomDelta(event)))\n );\n },\n []\n );\n\n const actionButtons = hasImageActions ? (\n <ImageActionButtons\n copyLabel={t(\"common.copyImage\")}\n downloadLabel={t(\"common.downloadImage\")}\n onCopy={handleCopyImageAction}\n onDownload={handleDownloadImage}\n />\n ) : null;\n\n const previewImage =\n (isImagePreviewOpen || isImagePreviewClosing) && actionSource ? (\n <img\n alt={alt}\n data-rmiz-modal-img=\"\"\n data-tsh-image-zoom={formatImagePreviewZoom(imagePreviewZoom)}\n draggable={false}\n src={actionSource}\n title={typeof props.title === \"string\" ? props.title : undefined}\n className=\"tsh-zoom-dialog__image nodrag tsh-desktop-no-drag\"\n style={{\n transform: resolveZoomedImageTransform(\n undefined,\n imagePreviewZoom,\n null,\n null\n ),\n transition: isWheelZooming\n ? \"none\"\n : mergeImagePreviewTransition(undefined)\n }}\n onClick={(event) => {\n event.stopPropagation();\n closePreviewImage();\n }}\n onContextMenu={hasImageActions ? handleContextMenu : onContextMenu}\n onTransitionEnd={\n isImagePreviewClosing ? finishClosePreviewImage : undefined\n }\n onWheel={handlePreviewImageWheel}\n />\n ) : null;\n\n const previewContent =\n previewImage && !actionButtons && actionSource ? (\n <ConversationImageContextMenu\n src={actionSource}\n asChild\n contentStyle={{ zIndex: \"var(--z-dialog-popover)\" }}\n >\n {previewImage}\n </ConversationImageContextMenu>\n ) : (\n previewImage\n );\n\n const Wrapper = wrapElement;\n\n return (\n <>\n <Wrapper\n className={cn(\n \"tsh-zoomable-image nodrag tsh-desktop-no-drag\",\n wrapElement === \"div\" && \"tsh-zoomable-image--block\"\n )}\n >\n <img\n {...props}\n alt={alt}\n src={src}\n onClick={(event) => {\n props.onClick?.(event);\n if (!event.defaultPrevented) {\n openPreviewImage();\n }\n }}\n onContextMenu={hasImageActions ? handleContextMenu : onContextMenu}\n className={cn(\"nodrag tsh-desktop-no-drag cursor-zoom-in\", className)}\n />\n <button\n type=\"button\"\n aria-label={t(\"common.expandImage\")}\n className=\"tsh-zoomable-image__trigger nodrag tsh-desktop-no-drag\"\n onClick={openPreviewImage}\n onContextMenu={handleContextMenu}\n />\n </Wrapper>\n {contextMenuPosition && !contextMenuPosition.inZoomDialog && actionButtons\n ? createPortal(\n <div\n className=\"tsh-image-context-menu nodrag tsh-desktop-no-drag\"\n style={{\n left: contextMenuPosition.x,\n top: contextMenuPosition.y\n }}\n role=\"menu\"\n onClick={(event) => event.stopPropagation()}\n >\n <ImageActionButtons\n copyLabel={t(\"common.copyImage\")}\n downloadLabel={t(\"common.downloadImage\")}\n itemRole=\"menuitem\"\n onCopy={handleCopyImageAction}\n onDownload={handleDownloadImage}\n />\n </div>,\n document.body\n )\n : null}\n {(isImagePreviewOpen || isImagePreviewClosing) && actionSource\n ? createPortal(\n <div\n aria-modal=\"true\"\n autoFocus\n className=\"tsh-zoom-dialog nodrag tsh-desktop-no-drag\"\n data-closing={isImagePreviewClosing ? \"true\" : undefined}\n data-tsh-image-actions={hasImageActions ? \"true\" : undefined}\n data-rmiz-modal=\"\"\n role=\"dialog\"\n tabIndex={-1}\n onAnimationEnd={(event) => {\n if (\n isImagePreviewClosing &&\n event.currentTarget === event.target\n ) {\n finishClosePreviewImage();\n }\n }}\n >\n <div\n data-rmiz-modal-overlay=\"visible\"\n onClick={closePreviewImage}\n />\n <div data-rmiz-modal-content=\"true\">{previewContent}</div>\n <ImagePreviewZoomControls\n canZoomIn={canZoomIn}\n canZoomOut={canZoomOut}\n percent={imagePreviewZoomPercent}\n percentLabel={t(\"common.imageZoomPercent\", {\n percent: imagePreviewZoomPercent\n })}\n reportPercentStatus={!copyStatus}\n resetLabel={t(\"common.resetImageZoom\")}\n zoomInLabel={t(\"common.zoomInImage\")}\n zoomOutLabel={t(\"common.zoomOutImage\")}\n onReset={resetPreviewImageZoom}\n onZoomIn={zoomInPreviewImage}\n onZoomOut={zoomOutPreviewImage}\n onWheel={handlePreviewImageWheel}\n />\n <div className=\"tsh-zoom-dialog__toolbar-actions nodrag tsh-desktop-no-drag\">\n {actionButtons}\n <Button\n aria-label={t(\"common.minimizeImage\")}\n className=\"tsh-zoom-dialog__icon-button nodrag tsh-desktop-no-drag\"\n size=\"icon\"\n title={t(\"common.minimizeImage\")}\n onPointerDown={(event) => event.stopPropagation()}\n variant=\"chrome\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n closePreviewImage();\n }}\n >\n <RestoreIcon aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n </div>\n {contextMenuPosition?.inZoomDialog && actionButtons ? (\n <div\n className=\"tsh-image-context-menu nodrag tsh-desktop-no-drag\"\n style={{\n left: contextMenuPosition.x,\n top: contextMenuPosition.y\n }}\n role=\"menu\"\n onClick={(event) => event.stopPropagation()}\n >\n <ImageActionButtons\n copyLabel={t(\"common.copyImage\")}\n downloadLabel={t(\"common.downloadImage\")}\n itemRole=\"menuitem\"\n onCopy={handleCopyImageAction}\n onDownload={handleDownloadImage}\n />\n </div>\n ) : null}\n {copyStatus ? (\n <ImageCopyStatusToast\n busy={copyStatus.busy}\n message={copyStatus.message}\n variant={copyStatus.variant}\n onOpenChange={(open) => {\n if (!open) {\n setCopyStatus(null);\n }\n }}\n />\n ) : null}\n </div>,\n document.body\n )\n : null}\n {copyStatus && !isImagePreviewOpen\n ? createPortal(\n <ImageCopyStatusToast\n busy={copyStatus.busy}\n message={copyStatus.message}\n variant={copyStatus.variant}\n onOpenChange={(open) => {\n if (!open) {\n setCopyStatus(null);\n }\n }}\n />,\n document.body\n )\n : null}\n </>\n );\n}\n\nfunction ImageCopyStatusToast({\n busy,\n message,\n onOpenChange,\n variant\n}: {\n busy: boolean;\n message: string;\n onOpenChange: (open: boolean) => void;\n variant: ImageCopyStatus[\"variant\"];\n}): JSX.Element {\n return (\n <ToastProvider duration={1600} swipeDirection=\"right\">\n <ToastRoot\n open\n anchor=\"viewport\"\n busy={busy}\n variant={variant}\n data-tsh-image-copy-status=\"true\"\n style={{ zIndex: 100303 }}\n onOpenChange={onOpenChange}\n >\n <ToastTitle>{message}</ToastTitle>\n </ToastRoot>\n <ToastViewport\n className=\"nodrag tsh-desktop-no-drag\"\n style={{\n top: \"max(20px, calc(var(--cove-titlebar-reserve, 0px) + 10px))\",\n zIndex: 100303\n }}\n />\n </ToastProvider>\n );\n}\n\nfunction ImagePreviewZoomControls({\n canZoomIn,\n canZoomOut,\n percent,\n percentLabel,\n reportPercentStatus,\n resetLabel,\n zoomInLabel,\n zoomOutLabel,\n onReset,\n onZoomIn,\n onZoomOut,\n onWheel\n}: {\n canZoomIn: boolean;\n canZoomOut: boolean;\n percent: number;\n percentLabel: string;\n reportPercentStatus: boolean;\n resetLabel: string;\n zoomInLabel: string;\n zoomOutLabel: string;\n onReset: () => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onWheel: (event: WheelEvent<HTMLElement>) => void;\n}): JSX.Element {\n return (\n <div\n className=\"tsh-zoom-dialog__zoom-controls nodrag tsh-desktop-no-drag\"\n onWheel={onWheel}\n >\n <button\n type=\"button\"\n title={zoomOutLabel}\n aria-label={zoomOutLabel}\n disabled={!canZoomOut}\n onClick={onZoomOut}\n >\n <ZoomOutIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <span\n aria-label={percentLabel}\n role={reportPercentStatus ? \"status\" : undefined}\n >\n {percent}%\n </span>\n <button\n type=\"button\"\n title={resetLabel}\n aria-label={resetLabel}\n onClick={onReset}\n >\n <RotateCcwIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n title={zoomInLabel}\n aria-label={zoomInLabel}\n disabled={!canZoomIn}\n onClick={onZoomIn}\n >\n <ZoomInIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n}\n\nfunction ImageActionButtons({\n copyLabel,\n downloadLabel,\n itemRole,\n onCopy,\n onDownload\n}: {\n copyLabel: string;\n downloadLabel: string;\n itemRole?: \"menuitem\";\n onCopy: () => void;\n onDownload: () => void;\n}): JSX.Element {\n if (!itemRole) {\n return (\n <>\n <Button\n aria-label={copyLabel}\n className=\"tsh-zoom-dialog__icon-button\"\n size=\"icon\"\n title={copyLabel}\n onPointerDown={(event) => event.stopPropagation()}\n variant=\"chrome\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCopy();\n }}\n >\n <CopyIcon aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n <Button\n aria-label={downloadLabel}\n className=\"tsh-zoom-dialog__icon-button\"\n size=\"icon\"\n title={downloadLabel}\n onPointerDown={(event) => event.stopPropagation()}\n variant=\"chrome\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onDownload();\n }}\n >\n <DownloadIcon aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n </>\n );\n }\n\n return (\n <>\n <button\n type=\"button\"\n role={itemRole}\n title={copyLabel}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCopy();\n }}\n >\n <CopyIcon aria-hidden=\"true\" className=\"size-4\" />\n <span>{copyLabel}</span>\n </button>\n <button\n type=\"button\"\n role={itemRole}\n title={downloadLabel}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onDownload();\n }}\n >\n <DownloadIcon aria-hidden=\"true\" className=\"size-4\" />\n <span>{downloadLabel}</span>\n </button>\n </>\n );\n}\n\nfunction resolveWheelZoomDelta(event: WheelEvent<HTMLElement>): number {\n return (\n -event.deltaY *\n (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) *\n (event.ctrlKey ? 10 : 1)\n );\n}\n\nfunction resolveZoomedImageTransform(\n transform: CSSProperties[\"transform\"],\n zoom: number,\n width: number | null,\n height: number | null\n): CSSProperties[\"transform\"] {\n const baseTransform = typeof transform === \"string\" ? transform.trim() : \"\";\n const zoomTransform = resolveImagePreviewZoomTransform(zoom, width, height);\n if (!baseTransform) {\n return zoomTransform || undefined;\n }\n if (!zoomTransform) {\n return baseTransform;\n }\n return `${baseTransform} ${zoomTransform}`;\n}\n\nfunction resolveImagePreviewZoomTransform(\n zoom: number,\n width: number | null,\n height: number | null\n): string {\n if (zoom === 1) {\n return \"\";\n }\n\n const scale = `scale(${formatImagePreviewZoom(zoom)})`;\n if (width === null || height === null) {\n return scale;\n }\n\n const halfWidth = formatCssNumber(width / 2);\n const halfHeight = formatCssNumber(height / 2);\n return `translate(${halfWidth}px,${halfHeight}px) ${scale} translate(-${halfWidth}px,-${halfHeight}px)`;\n}\n\nfunction formatCssNumber(value: number): string {\n return Number(value.toFixed(3)).toString();\n}\n\nfunction mergeImagePreviewTransition(\n transition: CSSProperties[\"transition\"]\n): CSSProperties[\"transition\"] {\n const zoomTransition = \"transform 120ms ease-out\";\n if (typeof transition !== \"string\" || !transition.trim()) {\n return zoomTransition;\n }\n return transition.includes(\"transform\")\n ? transition\n : `${transition}, ${zoomTransition}`;\n}\n\nfunction clampSteppedImagePreviewZoom(value: number): number {\n const stepped =\n Math.round(value / IMAGE_PREVIEW_ZOOM_STEP) * IMAGE_PREVIEW_ZOOM_STEP;\n return clampImagePreviewZoom(stepped);\n}\n\nfunction clampImagePreviewZoom(value: number): number {\n return Math.min(\n IMAGE_PREVIEW_ZOOM_MAX,\n Math.max(IMAGE_PREVIEW_ZOOM_MIN, value)\n );\n}\n\nfunction formatImagePreviewZoom(value: number): string {\n return Number(value.toFixed(2)).toString();\n}\n","import {\n useCallback,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type ReactNode\n} from \"react\";\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger\n} from \"@tutti-os/ui-system\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport { copyImageToClipboard } from \"../lib/copyImageToClipboard\";\nimport { translate } from \"../../../i18n/index\";\n\nexport function ConversationImageContextMenu({\n src,\n children,\n asChild = false,\n contentStyle\n}: {\n src: string;\n children: ReactNode;\n /**\n * Attach the right-click listener directly to the child element instead of a\n * wrapper span. Used for the zoomed image, whose positioning the zoom library\n * manages and must not be disturbed by an extra wrapper element.\n */\n asChild?: boolean;\n /**\n * Override the menu content style. Used by the zoomed image to raise the\n * menu above the zoom modal (which sits above the default popover z-index).\n */\n contentStyle?: CSSProperties;\n}): JSX.Element {\n const agentHostApi = useOptionalAgentHostApi();\n const copyStartedRef = useRef(false);\n const [menuResetKey, setMenuResetKey] = useState(0);\n const copyAndClose = useCallback(() => {\n if (copyStartedRef.current) {\n return;\n }\n copyStartedRef.current = true;\n setMenuResetKey((key) => key + 1);\n void copyImageToClipboard(src, agentHostApi?.clipboard).finally(() => {\n copyStartedRef.current = false;\n });\n }, [agentHostApi?.clipboard, src]);\n return (\n <ContextMenu key={menuResetKey}>\n <ContextMenuTrigger asChild={asChild}>{children}</ContextMenuTrigger>\n <ContextMenuContent style={contentStyle}>\n <ContextMenuItem\n onClick={copyAndClose}\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n copyAndClose();\n }}\n onSelect={copyAndClose}\n >\n {translate(\"agentHost.agentGui.copyImage\")}\n </ContextMenuItem>\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n","// ClipboardItem reliably supports only image/png, so non-png sources are\n// rasterised to png via an offscreen canvas before writing.\nexport interface CopyImageClipboardHost {\n writeImage?: (input: {\n data: string;\n mimeType: \"image/png\";\n }) => Promise<void>;\n}\n\nasync function imageSrcToPngBlob(src: string): Promise<Blob | null> {\n const response = await fetch(src);\n const blob = await response.blob();\n if (blob.type === \"image/png\") {\n return blob;\n }\n const bitmap = await createImageBitmap(blob);\n const canvas = document.createElement(\"canvas\");\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return null;\n }\n ctx.drawImage(bitmap, 0, 0);\n return await new Promise<Blob | null>((resolve) =>\n canvas.toBlob((result) => resolve(result), \"image/png\")\n );\n}\n\n// FileReader-based (jsdom-compatible) blob-to-base64; also reused by the\n// conversation copy path to embed workspace image bytes as data URIs.\nexport async function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error ?? new Error(\"read failed\"));\n reader.onload = () => {\n const result = typeof reader.result === \"string\" ? reader.result : \"\";\n resolve(result.includes(\",\") ? (result.split(\",\").pop() ?? \"\") : result);\n };\n reader.readAsDataURL(blob);\n });\n}\n\nasync function pngBlobFromSrc(src: string): Promise<Blob> {\n const blob = await imageSrcToPngBlob(src);\n if (!blob) {\n throw new Error(\"image conversion failed\");\n }\n return blob;\n}\n\nasync function copyImageWithWebClipboard(\n data: Blob | Promise<Blob>\n): Promise<boolean> {\n if (\n typeof navigator === \"undefined\" ||\n typeof navigator.clipboard?.write !== \"function\" ||\n typeof ClipboardItem === \"undefined\"\n ) {\n return false;\n }\n try {\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": data })]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function copyImageToClipboard(\n src: string,\n hostClipboard?: CopyImageClipboardHost | null\n): Promise<boolean> {\n try {\n if (!hostClipboard?.writeImage) {\n return await copyImageWithWebClipboard(pngBlobFromSrc(src));\n }\n\n const blob = await imageSrcToPngBlob(src);\n if (!blob) {\n return false;\n }\n\n try {\n await hostClipboard.writeImage({\n data: await blobToBase64(blob),\n mimeType: \"image/png\"\n });\n return true;\n } catch {\n // Fall through to the browser clipboard path when a host exists but the\n // native clipboard write is denied or unavailable.\n }\n\n return copyImageWithWebClipboard(blob);\n } catch {\n return false;\n }\n}\n","export function downloadImage(src: string, name: string): void {\n const link = document.createElement(\"a\");\n link.href = src;\n link.download = name;\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n link.remove();\n}\n\nexport function resolveImageDownloadName(\n name: string | undefined,\n src: string | null,\n alt: string | undefined\n): string {\n const semanticName =\n resolveImageNameBase(name) ??\n resolveImageNameBase(alt) ??\n resolveImageNameBase(src) ??\n \"image\";\n const extension =\n resolveImageNameExtension(name) ??\n resolveImageNameExtension(src) ??\n resolveDataImageExtension(src) ??\n \"png\";\n return `${semanticName}-${formatImageDownloadTimestamp(new Date())}-${createDownloadRandomSuffix()}.${extension}`;\n}\n\nfunction resolveImageNameBase(value: string | null | undefined): string | null {\n const segment = imageNameSegment(value);\n if (!segment) {\n return null;\n }\n const base = segment.replace(/\\.[A-Za-z0-9]{2,8}$/u, \"\");\n const sanitized = stripControlCharacters(base)\n .replace(/[\\\\/:*?\"<>|#%&{}$!'@+`=]+/gu, \"-\")\n .replace(/\\s+/gu, \"-\")\n .replace(/-+/gu, \"-\")\n .replace(/^-|-$/gu, \"\")\n .slice(0, 80);\n return sanitized || null;\n}\n\nfunction stripControlCharacters(value: string): string {\n return Array.from(value)\n .filter((char) => char.charCodeAt(0) >= 32)\n .join(\"\");\n}\n\nfunction resolveImageNameExtension(\n value: string | null | undefined\n): string | null {\n const segment = imageNameSegment(value);\n const match = segment?.match(/\\.([A-Za-z0-9]{2,8})$/u);\n return match?.[1] ? normalizeImageExtension(match[1]) : null;\n}\n\nfunction imageNameSegment(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n const withoutQuery = decodeURIComponentSafe(\n trimmed.split(/[?#]/, 1)[0] ?? \"\"\n );\n return withoutQuery.split(/[\\\\/]/).pop()?.trim() || null;\n}\n\nfunction resolveDataImageExtension(src: string | null): string | null {\n const match = src?.match(/^data:image\\/([A-Za-z0-9.+-]+)[;,]/u);\n return match?.[1] ? normalizeImageExtension(match[1]) : null;\n}\n\nfunction normalizeImageExtension(extension: string): string {\n const normalized = extension.toLowerCase();\n if (normalized === \"jpeg\") return \"jpg\";\n if (normalized === \"svg+xml\") return \"svg\";\n return normalized.replace(/[^a-z0-9]/gu, \"\") || \"png\";\n}\n\nfunction formatImageDownloadTimestamp(date: Date): string {\n const pad = (value: number): string => String(value).padStart(2, \"0\");\n return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`;\n}\n\nfunction createDownloadRandomSuffix(): string {\n return Math.random().toString(36).slice(2, 6).padEnd(4, \"0\");\n}\n\nfunction decodeURIComponentSafe(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n","interface MarkdownPoint {\n line: number;\n column: number;\n offset?: number;\n}\n\ninterface MarkdownPosition {\n start: MarkdownPoint;\n end: MarkdownPoint;\n}\n\ninterface MarkdownNode {\n type: string;\n children?: MarkdownNode[];\n position?: MarkdownPosition;\n url?: string;\n value?: string;\n}\n\ninterface SplitAutolink {\n link: MarkdownNode;\n trailing: MarkdownNode;\n}\n\nconst LITERAL_AUTOLINK_BOUNDARY = /[\",。;:!?、…)】》」』〉〕]}”’]/u;\n\n/**\n * GFM literal autolinks do not stop at every boundary that is invalid inside a\n * raw URL. Repair product-facing CJK sentence boundaries and JSON string\n * boundaries without changing explicit Markdown links, angle autolinks, code,\n * or deliberately authored link destinations.\n */\nexport function remarkLiteralAutolinkBoundary() {\n return (tree: unknown, file: unknown): void => {\n if (!isMarkdownNode(tree)) {\n return;\n }\n const source = markdownSourceFromFile(file);\n if (source === null) {\n return;\n }\n splitCjkAutolinks(tree, source);\n };\n}\n\nfunction splitCjkAutolinks(parent: MarkdownNode, source: string): void {\n if (!parent.children) {\n return;\n }\n\n for (let index = 0; index < parent.children.length; index += 1) {\n const child = parent.children[index];\n if (!child) {\n continue;\n }\n const split = splitLiteralAutolink(child, source);\n if (split) {\n parent.children.splice(index, 1, split.link, split.trailing);\n index += 1;\n continue;\n }\n splitCjkAutolinks(child, source);\n }\n}\n\nfunction splitLiteralAutolink(\n node: MarkdownNode,\n source: string\n): SplitAutolink | null {\n const textNode = node.children?.[0];\n if (\n node.type !== \"link\" ||\n typeof node.url !== \"string\" ||\n node.children?.length !== 1 ||\n textNode?.type !== \"text\" ||\n typeof textNode.value !== \"string\" ||\n !node.position\n ) {\n return null;\n }\n\n const display = textNode.value;\n const sourceStart = node.position.start.offset;\n const sourceEnd = node.position.end.offset;\n if (\n sourceStart === undefined ||\n sourceEnd === undefined ||\n source.slice(sourceStart, sourceEnd) !== display\n ) {\n return null;\n }\n\n const boundaryIndex = display.search(LITERAL_AUTOLINK_BOUNDARY);\n if (boundaryIndex < 0) {\n return null;\n }\n\n const displayUrl = display.slice(0, boundaryIndex);\n const trailingText = display.slice(boundaryIndex);\n if (!node.url.endsWith(trailingText)) {\n return null;\n }\n const targetUrl = node.url.slice(0, -trailingText.length);\n if (!isHttpUrl(targetUrl)) {\n return null;\n }\n\n const boundaryPoint = advancePoint(node.position.start, displayUrl.length);\n return {\n link: {\n ...node,\n url: targetUrl,\n position: {\n start: node.position.start,\n end: boundaryPoint\n },\n children: [\n {\n ...textNode,\n value: displayUrl,\n position: textNode.position\n ? {\n start: textNode.position.start,\n end: boundaryPoint\n }\n : undefined\n }\n ]\n },\n trailing: {\n type: \"text\",\n value: trailingText,\n position: {\n start: boundaryPoint,\n end: node.position.end\n }\n }\n };\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction advancePoint(point: MarkdownPoint, characters: number): MarkdownPoint {\n return {\n line: point.line,\n column: point.column + characters,\n ...(point.offset === undefined ? {} : { offset: point.offset + characters })\n };\n}\n\nfunction markdownSourceFromFile(file: unknown): string | null {\n if (\n typeof file !== \"object\" ||\n file === null ||\n !(\"value\" in file) ||\n typeof file.value !== \"string\"\n ) {\n return null;\n }\n return file.value;\n}\n\nfunction isMarkdownNode(value: unknown): value is MarkdownNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"type\" in value &&\n typeof value.type === \"string\"\n );\n}\n","import { readParsedDocumentCache } from \"./parsedDocumentCache\";\n\ntype MarkdownParser = (...args: unknown[]) => unknown;\n\ninterface MarkdownProcessor {\n parser?: unknown;\n}\n\ninterface CachedMarkdownParserOptions {\n cacheKey: string;\n content: string;\n}\n\nexport function cachedMarkdownParser(\n this: MarkdownProcessor,\n options: CachedMarkdownParserOptions\n): void {\n if (typeof this.parser !== \"function\") {\n return;\n }\n const parse = this.parser as MarkdownParser;\n this.parser = (...args: unknown[]) =>\n structuredClone(\n readParsedDocumentCache({\n namespace: \"markdown\",\n identity: options.cacheKey,\n source: options.content,\n create: () => parse.apply(this, args)\n })\n );\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ForwardedRef,\n type MouseEvent as ReactMouseEvent,\n type MutableRefObject,\n type ReactNode\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nconst MIN_THUMB_HEIGHT = 24;\n\ninterface ScrollbarState {\n scrollable: boolean;\n thumbHeight: number;\n thumbTop: number;\n}\n\ninterface ScrollbarDragState {\n maxScrollTop: number;\n maxThumbTop: number;\n startClientY: number;\n startScrollTop: number;\n}\n\nexport interface CustomScrollbarProps {\n getViewport: () => HTMLElement | null;\n className?: string;\n thumbClassName?: string;\n testId?: string;\n thumbTestId?: string;\n syncKey?: unknown;\n}\n\nexport function CustomScrollbar({\n getViewport,\n className,\n thumbClassName,\n testId,\n thumbTestId,\n syncKey\n}: CustomScrollbarProps): React.JSX.Element {\n \"use memo\";\n const trackRef = useRef<HTMLDivElement | null>(null);\n const dragStateRef = useRef<ScrollbarDragState | null>(null);\n const [scrollbarState, setScrollbarState] = useState<ScrollbarState>({\n scrollable: false,\n thumbHeight: 0,\n thumbTop: 0\n });\n const [dragging, setDragging] = useState(false);\n\n const syncScrollbarState = useCallback(() => {\n const viewport = getViewport();\n if (!viewport) {\n setScrollbarState({ scrollable: false, thumbHeight: 0, thumbTop: 0 });\n return;\n }\n\n const { clientHeight, scrollHeight, scrollTop } = viewport;\n const trackHeight = trackRef.current?.clientHeight ?? clientHeight;\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight);\n if (clientHeight <= 0 || trackHeight <= 0 || maxScrollTop <= 0) {\n setScrollbarState({ scrollable: false, thumbHeight: 0, thumbTop: 0 });\n return;\n }\n\n const thumbHeight = Math.max(\n MIN_THUMB_HEIGHT,\n Math.round((clientHeight / scrollHeight) * trackHeight)\n );\n const maxThumbTop = Math.max(0, trackHeight - thumbHeight);\n const thumbTop = Math.round((scrollTop / maxScrollTop) * maxThumbTop);\n setScrollbarState((previous) =>\n previous.scrollable &&\n previous.thumbHeight === thumbHeight &&\n previous.thumbTop === thumbTop\n ? previous\n : { scrollable: true, thumbHeight, thumbTop }\n );\n }, [getViewport]);\n\n const scrollViewportToThumbTop = useCallback(\n (thumbTop: number) => {\n const viewport = getViewport();\n const track = trackRef.current;\n if (!viewport || !track) {\n return;\n }\n\n const maxScrollTop = Math.max(\n 0,\n viewport.scrollHeight - viewport.clientHeight\n );\n const maxThumbTop = Math.max(\n 0,\n track.clientHeight - scrollbarState.thumbHeight\n );\n if (maxScrollTop <= 0 || maxThumbTop <= 0) {\n return;\n }\n\n viewport.scrollTop =\n (clamp(thumbTop, 0, maxThumbTop) / maxThumbTop) * maxScrollTop;\n syncScrollbarState();\n },\n [getViewport, scrollbarState.thumbHeight, syncScrollbarState]\n );\n\n const handleTrackMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLDivElement>) => {\n if (event.button !== 0 || !scrollbarState.scrollable) {\n return;\n }\n\n const track = trackRef.current;\n if (!track) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n const trackRect = track.getBoundingClientRect();\n scrollViewportToThumbTop(\n event.clientY - trackRect.top - scrollbarState.thumbHeight / 2\n );\n },\n [\n scrollViewportToThumbTop,\n scrollbarState.scrollable,\n scrollbarState.thumbHeight\n ]\n );\n\n const handleThumbMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLDivElement>) => {\n if (event.button !== 0 || !scrollbarState.scrollable) {\n return;\n }\n\n const viewport = getViewport();\n const track = trackRef.current;\n if (!viewport || !track) {\n return;\n }\n\n const maxScrollTop = Math.max(\n 0,\n viewport.scrollHeight - viewport.clientHeight\n );\n const maxThumbTop = Math.max(\n 0,\n track.clientHeight - scrollbarState.thumbHeight\n );\n if (maxScrollTop <= 0 || maxThumbTop <= 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragStateRef.current = {\n maxScrollTop,\n maxThumbTop,\n startClientY: event.clientY,\n startScrollTop: viewport.scrollTop\n };\n setDragging(true);\n },\n [getViewport, scrollbarState.scrollable, scrollbarState.thumbHeight]\n );\n\n useEffect(() => {\n if (!dragging) {\n return;\n }\n\n const handleMouseMove = (event: MouseEvent): void => {\n const dragState = dragStateRef.current;\n const viewport = getViewport();\n if (!dragState || !viewport) {\n return;\n }\n\n const nextThumbTop =\n (dragState.startScrollTop / dragState.maxScrollTop) *\n dragState.maxThumbTop +\n (event.clientY - dragState.startClientY);\n viewport.scrollTop =\n (clamp(nextThumbTop, 0, dragState.maxThumbTop) /\n dragState.maxThumbTop) *\n dragState.maxScrollTop;\n syncScrollbarState();\n };\n\n const handleMouseUp = (): void => {\n dragStateRef.current = null;\n setDragging(false);\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [dragging, getViewport, syncScrollbarState]);\n\n useEffect(() => {\n const viewport = getViewport();\n if (!viewport) {\n setScrollbarState({ scrollable: false, thumbHeight: 0, thumbTop: 0 });\n return;\n }\n\n syncScrollbarState();\n viewport.addEventListener(\"scroll\", syncScrollbarState, { passive: true });\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(syncScrollbarState)\n : null;\n resizeObserver?.observe(viewport);\n const animationFrameId = window.requestAnimationFrame(syncScrollbarState);\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n viewport.removeEventListener(\"scroll\", syncScrollbarState);\n resizeObserver?.disconnect();\n };\n }, [getViewport, syncKey, syncScrollbarState]);\n\n return (\n <div\n ref={trackRef}\n className={cn(\"tsh-custom-scrollbar\", className)}\n data-scrollable={scrollbarState.scrollable ? \"true\" : \"false\"}\n data-dragging={dragging ? \"true\" : \"false\"}\n data-testid={testId}\n aria-hidden=\"true\"\n onMouseDown={handleTrackMouseDown}\n >\n <div\n className={cn(\"tsh-custom-scrollbar__thumb\", thumbClassName)}\n data-testid={thumbTestId}\n onMouseDown={handleThumbMouseDown}\n style={{\n height: `${scrollbarState.thumbHeight}px`,\n transform: `translateY(${scrollbarState.thumbTop}px)`\n }}\n />\n </div>\n );\n}\n\nexport interface CustomScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n viewportClassName?: string;\n scrollbarClassName?: string;\n scrollbarThumbClassName?: string;\n scrollbarTestId?: string;\n scrollbarThumbTestId?: string;\n syncKey?: unknown;\n}\n\nexport const CustomScrollArea = forwardRef<\n HTMLDivElement,\n CustomScrollAreaProps\n>(function CustomScrollArea(\n {\n children,\n className,\n viewportClassName,\n scrollbarClassName,\n scrollbarThumbClassName,\n scrollbarTestId,\n scrollbarThumbTestId,\n syncKey,\n ...viewportProps\n },\n forwardedRef\n): React.JSX.Element {\n \"use memo\";\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const getViewport = useCallback(() => viewportRef.current, []);\n\n return (\n <div\n className={cn(\n \"tsh-custom-scroll-area relative min-h-0 min-w-0\",\n className\n )}\n >\n <div\n ref={setRefs(viewportRef, forwardedRef)}\n className={cn(\n \"overflow-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n viewportClassName\n )}\n {...viewportProps}\n >\n {children}\n </div>\n <CustomScrollbar\n getViewport={getViewport}\n className={scrollbarClassName}\n thumbClassName={scrollbarThumbClassName}\n testId={scrollbarTestId}\n thumbTestId={scrollbarThumbTestId}\n syncKey={syncKey ?? children}\n />\n </div>\n );\n});\n\nfunction setRefs<T>(\n localRef: MutableRefObject<T | null>,\n forwardedRef: ForwardedRef<T>\n): (node: T | null) => void {\n return (node) => {\n localRef.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n };\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n","\"use client\";\n\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef\n} from \"react\";\nimport {\n motion,\n useAnimation,\n useReducedMotion,\n type Variants\n} from \"framer-motion\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface MessageSquareMoreIconHandle {\n startAnimation: () => void;\n stopAnimation: () => void;\n}\n\ninterface MessageSquareMoreIconProps extends HTMLAttributes<HTMLDivElement> {\n size?: number;\n active?: boolean;\n}\n\nconst DOT_TRANSITION = {\n times: [0, 0.1, 0.1, 0.2, 0.5, 0.6, 0.6, 0.7],\n duration: 1.5\n};\n\nconst DOT_VARIANTS: Variants = {\n normal: {\n opacity: 1\n },\n animate: (custom: number) => ({\n opacity: [1, 0, 0, 1, 1, 0, 0, 1],\n transition: {\n opacity: {\n ...DOT_TRANSITION,\n times: DOT_TRANSITION.times.map((time, index) =>\n index === 2 || index === 3 || index === 6 || index === 7\n ? time + custom * 0.1\n : time\n )\n }\n }\n }),\n active: (custom: number) => ({\n opacity: [1, 0, 0, 1, 1, 0, 0, 1],\n transition: {\n opacity: {\n ...DOT_TRANSITION,\n repeat: Infinity,\n times: DOT_TRANSITION.times.map((time, index) =>\n index === 2 || index === 3 || index === 6 || index === 7\n ? time + custom * 0.1\n : time\n )\n }\n }\n })\n};\n\nconst MessageSquareMoreIcon = forwardRef<\n MessageSquareMoreIconHandle,\n MessageSquareMoreIconProps\n>(\n (\n {\n active = false,\n onMouseEnter,\n onMouseLeave,\n className,\n size = 28,\n ...props\n },\n ref\n ) => {\n const controls = useAnimation();\n const reduceMotion = useReducedMotion();\n const isControlledRef = useRef(false);\n\n const startAnimation = useCallback(() => {\n if (reduceMotion) {\n return;\n }\n void controls.start(active ? \"active\" : \"animate\");\n }, [active, controls, reduceMotion]);\n\n const stopAnimation = useCallback(() => {\n void controls.start(\"normal\");\n }, [controls]);\n\n useImperativeHandle(ref, () => {\n isControlledRef.current = true;\n\n return {\n startAnimation,\n stopAnimation\n };\n });\n\n useEffect(() => {\n if (active) {\n startAnimation();\n return;\n }\n stopAnimation();\n }, [active, startAnimation, stopAnimation]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseEnter?.(event);\n } else {\n startAnimation();\n }\n },\n [onMouseEnter, startAnimation]\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseLeave?.(event);\n } else {\n stopAnimation();\n }\n },\n [onMouseLeave, stopAnimation]\n );\n\n return (\n <div\n className={cn(\"inline-flex items-center justify-center\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <svg\n fill=\"none\"\n height={size}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n <motion.path\n animate={controls}\n custom={0}\n d=\"M8 10h.01\"\n variants={DOT_VARIANTS}\n />\n <motion.path\n animate={controls}\n custom={1}\n d=\"M12 10h.01\"\n variants={DOT_VARIANTS}\n />\n <motion.path\n animate={controls}\n custom={2}\n d=\"M16 10h.01\"\n variants={DOT_VARIANTS}\n />\n </svg>\n </div>\n );\n }\n);\n\nMessageSquareMoreIcon.displayName = \"MessageSquareMoreIcon\";\n\nexport { MessageSquareMoreIcon };\n","const styles = {\n interactivePrompt: \"agent-gui-conversation__interactive-prompt\",\n interactivePromptCard: \"agent-gui-conversation__interactive-prompt-card\",\n interactivePromptHeader: \"agent-gui-conversation__interactive-prompt-header\",\n interactivePromptLeadContent:\n \"agent-gui-conversation__interactive-prompt-lead-content\",\n interactivePromptLead: \"agent-gui-conversation__interactive-prompt-lead\",\n interactivePromptMeta: \"agent-gui-conversation__interactive-prompt-meta\",\n interactivePromptQuestion:\n \"agent-gui-conversation__interactive-prompt-question\",\n interactivePromptOptions:\n \"agent-gui-conversation__interactive-prompt-options\",\n interactiveOptionDisplay:\n \"agent-gui-conversation__interactive-option-display\",\n interactiveOptionButton: \"agent-gui-conversation__interactive-option-button\",\n interactiveOptionContent:\n \"agent-gui-conversation__interactive-option-content\",\n interactiveOptionTitle: \"agent-gui-conversation__interactive-option-title\",\n interactiveOptionDescription:\n \"agent-gui-conversation__interactive-option-description\",\n interactiveOptionCommandDescription:\n \"agent-gui-conversation__interactive-option-command-description\",\n interactiveOptionCommandTooltip:\n \"agent-gui-conversation__interactive-option-command-tooltip\",\n interactiveOptionShortcut:\n \"agent-gui-conversation__interactive-option-shortcut\",\n interactiveOptionSpinner:\n \"agent-gui-conversation__interactive-option-spinner\",\n interactiveFeedbackComposer:\n \"agent-gui-conversation__interactive-feedback-composer\",\n interactivePromptTextarea:\n \"agent-gui-conversation__interactive-prompt-textarea\",\n interactiveFeedbackSendButton:\n \"agent-gui-conversation__interactive-feedback-send-button\",\n interactivePromptFooter: \"agent-gui-conversation__interactive-prompt-footer\",\n interactivePromptActions:\n \"agent-gui-conversation__interactive-prompt-actions\",\n userMessageFlow: \"agent-gui-conversation__user-message-flow\",\n assistantMessageFlow: \"agent-gui-conversation__assistant-message-flow\",\n participantMessageLayout:\n \"agent-gui-conversation__participant-message-layout\",\n participantMessageHeader:\n \"agent-gui-conversation__participant-message-header\",\n participantName: \"agent-gui-conversation__participant-name\",\n participantMessageContent:\n \"agent-gui-conversation__participant-message-content\",\n participantAvatar: \"agent-gui-conversation__participant-avatar\",\n messageGroup: \"agent-gui-conversation__message-group\",\n messageFooter: \"agent-gui-conversation__message-footer\",\n messageTimestamp: \"agent-gui-conversation__message-timestamp\",\n messageCopyButton: \"agent-gui-conversation__message-copy-button\",\n userImageGrid: \"agent-gui-conversation__user-image-grid\",\n userImageThumbnail: \"agent-gui-conversation__user-image-thumbnail\",\n userMessageBubble: \"agent-gui-conversation__user-message-bubble\",\n assistantMarkdown: \"agent-gui-conversation__assistant-markdown\"\n} as const;\n\nexport default styles;\n"],"mappings":"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","names":["useCallback","useState","basenameWorkspacePath","label","parseRichTextMentionHref","parseRichTextMentionHref","useRef","useState","useRef","useState","useEffect","useState","useCallback","useEffect","useState","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useCallback","jsx","jsxs","useState","useCallback","useEffect","jsx","useState","useEffect","jsx","Fragment","jsx","jsxs","STANDARD_MARKDOWN_LINK_PROTOCOLS","STANDARD_MARKDOWN_LINK_PROTOCOLS","EMPTY_AGENT_TARGETS","useState","useCallback","jsx","jsxs","Fragment","MemoizedMarkdownBlock","basenameWorkspacePath","useCallback","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useEffect","CustomScrollArea","forwardRef","useCallback","useEffect","useRef","jsx","jsxs","forwardRef","useRef","useCallback","useEffect"]}
|