@tutti-os/agent-gui 0.0.228 → 0.0.230
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-conversation/index.js +2 -2
- package/dist/agent-gui.js +4 -4
- package/dist/agent-message-center/index.js +2 -2
- package/dist/app/renderer/agentactivity.css +31 -85
- package/dist/{chunk-KZIW5CCW.js → chunk-CQFT3MI5.js} +35 -25
- package/dist/chunk-CQFT3MI5.js.map +1 -0
- package/dist/{chunk-Z35E22WS.js → chunk-WGCDSA7P.js} +24 -22
- package/dist/{chunk-Z35E22WS.js.map → chunk-WGCDSA7P.js.map} +1 -1
- package/dist/{chunk-C7XGPXRW.js → chunk-Y5OBJINU.js} +2 -2
- package/dist/{chunk-IMHJ3J5X.js → chunk-ZVSKNM6D.js} +248 -235
- package/dist/chunk-ZVSKNM6D.js.map +1 -0
- package/dist/index.js +4 -4
- package/package.json +16 -16
- package/dist/chunk-IMHJ3J5X.js.map +0 -1
- package/dist/chunk-KZIW5CCW.js.map +0 -1
- /package/dist/{chunk-C7XGPXRW.js.map → chunk-Y5OBJINU.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/agentMcpToolTarget.ts","../shared/agentConversation/agentApprovalPurpose.ts","../shared/agentConversation/exitPlanOptions.ts","../shared/agentConversation/askUserQuestions.ts","../shared/AgentMessageMarkdown.tsx","../shared/utils/websiteUrl.ts","../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":["export interface AgentMcpToolTarget {\n server: string;\n tool: string;\n displayName: string;\n instruction: string | null;\n}\n\nexport interface ExtractAgentMcpToolTargetInput {\n input?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n name?: string | null;\n payload?: Record<string, unknown> | null;\n toolName?: string | null;\n}\n\nexport function extractAgentMcpToolTarget({\n input: rawInput,\n metadata: rawMetadata,\n payload: rawPayload,\n toolName\n}: ExtractAgentMcpToolTargetInput): AgentMcpToolTarget | null {\n const payload = objectValue(rawPayload);\n const input = objectValue(rawInput) ?? objectValue(payload?.input);\n const metadata = objectValue(rawMetadata) ?? objectValue(payload?.metadata);\n const toolCall = objectValue(input?.toolCall);\n const toolCallRawInput = objectValue(toolCall?.rawInput);\n const request = objectValue(input?.request) ?? objectValue(toolCall?.request);\n const requestMeta = objectValue(request?._meta);\n const parsedToolName = parseMcpToolName(\n firstString(toolName, stringValue(metadata?.toolName))\n );\n const server = firstString(\n stringValue(metadata?.server),\n stringValue(metadata?.serverName),\n stringValue(metadata?.mcpServer),\n stringValue(input?.server),\n stringValue(input?.server_name),\n stringValue(input?.serverName),\n stringValue(input?.mcpServer),\n stringValue(toolCall?.server),\n stringValue(toolCall?.server_name),\n stringValue(toolCall?.serverName),\n stringValue(toolCallRawInput?.server),\n stringValue(toolCallRawInput?.server_name),\n stringValue(toolCallRawInput?.serverName),\n parsedToolName?.server\n );\n const tool = firstString(\n stringValue(metadata?.toolName),\n stringValue(metadata?.tool),\n stringValue(input?.tool),\n stringValue(input?.toolName),\n stringValue(toolCall?.tool),\n stringValue(toolCall?.toolName),\n stringValue(toolCallRawInput?.tool),\n stringValue(toolCallRawInput?.toolName),\n parsedToolName?.tool\n );\n if (!server || !tool) {\n return null;\n }\n return {\n server,\n tool,\n displayName: formatAgentMcpToolTarget({ server, tool }),\n instruction:\n firstString(\n formatToolParamsDisplay(requestMeta?.tool_params_display),\n formatObjectInstruction(requestMeta?.tool_params),\n formatObjectInstruction(input?.arguments),\n formatObjectInstruction(toolCallRawInput?.arguments)\n ) ?? null\n };\n}\n\nexport function formatAgentMcpToolTarget({\n server,\n tool\n}: {\n server: string;\n tool: string;\n}): string {\n return `${server} / ${tool}`;\n}\n\nfunction parseMcpToolName(\n value: string | null\n): { server: string; tool: string } | null {\n const match = value?.match(/^mcp__([^_]+(?:_[^_]+)*)__(.+)$/i);\n if (!match) {\n return null;\n }\n const server = match[1]?.replace(/_/gu, \"-\").trim();\n const tool = match[2]?.trim();\n return server && tool ? { server, tool } : null;\n}\n\nfunction firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n return values.find((value) => value !== null && value !== undefined) ?? null;\n}\n\nfunction formatToolParamsDisplay(value: unknown): string | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const parts = value.flatMap((entry) => {\n const record = objectValue(entry);\n const name =\n stringValue(record?.display_name) ??\n stringValue(record?.displayName) ??\n stringValue(record?.name);\n const rawValue = record?.value;\n const formattedValue = formatInstructionValue(rawValue);\n return name && formattedValue ? [`${name}: ${formattedValue}`] : [];\n });\n return parts.length > 0 ? parts.join(\", \") : null;\n}\n\nfunction formatObjectInstruction(value: unknown): string | null {\n const record = objectValue(value);\n if (!record) {\n return stringValue(value);\n }\n const parts = Object.entries(record).flatMap(([key, rawValue]) => {\n const formattedValue = formatInstructionValue(rawValue);\n return formattedValue ? [`${key}: ${formattedValue}`] : [];\n });\n return parts.length > 0 ? parts.join(\", \") : null;\n}\n\nfunction formatInstructionValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n return String(value);\n }\n if (Array.isArray(value)) {\n const parts = value.flatMap((entry) => {\n const formattedValue = formatInstructionValue(entry);\n return formattedValue ? [formattedValue] : [];\n });\n return parts.length > 0 ? parts.join(\", \") : null;\n }\n if (objectValue(value)) {\n return stableJsonValue(value);\n }\n return null;\n}\n\nfunction stableJsonValue(value: unknown): string | null {\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n","export type AgentApprovalPurpose = \"edit-files\";\n\nexport function normalizeAgentApprovalPurpose(\n value: unknown\n): AgentApprovalPurpose | null {\n return value === \"edit-files\" ? value : null;\n}\n","import type { AgentApprovalOptionVM } from \"./contracts/agentApprovalItemVM\";\n\n// Shared exit-plan (Claude Code `switch_mode`) detection and option extraction.\n//\n// Claude Code surfaces \"exit plan mode\" as a permission/approval whose\n// `input.toolCall.kind` is `switch_mode` and whose options are the permission\n// modes to switch into (\"Yes, and bypass permissions\" / \"...auto\" / etc.) plus\n// a trailing `plan` option (\"No, keep planning\"). Both the conversation and the\n// message-center deck must classify and render these identically, so the\n// detection + option normalization live here instead of being re-implemented at\n// each projection site (which is how they drifted in the first place).\n//\n// The runtime is the source of truth for the option set: callers render exactly\n// the modes it sent (so newly added modes like `auto` appear automatically)\n// rather than a hand-maintained list. The `plan` option is the keep-planning /\n// deny action and is filtered out of the mode list — callers render it as a\n// dedicated \"keep planning\" affordance.\n\nexport const EXIT_PLAN_KEEP_PLANNING_OPTION_ID = \"plan\";\n\nexport function isExitPlanSwitchModeInput(input: unknown): boolean {\n const record = recordValue(input);\n const toolCall = recordValue(record.toolCall);\n if (normalizeToken(stringValue(toolCall.kind)) !== \"switchmode\") {\n return false;\n }\n return collectRawOptions(record).some(\n (option) =>\n normalizeToken(rawOptionId(option)) === EXIT_PLAN_KEEP_PLANNING_OPTION_ID\n );\n}\n\n// Normalized \"Yes, and ...\" mode options, in runtime order, with the\n// keep-planning (`plan`) option removed. Returns [] when the payload carries no\n// options (e.g. Codex plan or the legacy `exitplanmode` tool), letting callers\n// fall back to a curated default list.\nexport function extractExitPlanModeOptions(\n input: unknown,\n payload?: unknown\n): AgentApprovalOptionVM[] {\n const sources =\n payload === undefined\n ? [recordValue(input)]\n : [recordValue(input), recordValue(payload)];\n return sources.flatMap(collectRawOptions).flatMap((option) => {\n // The emitted id must be the runtime's exact value (e.g. \"acceptEdits\",\n // \"auto\") — it is submitted back as the permission mode. Only the\n // keep-planning comparison is case/format-insensitive.\n const id = rawOptionId(option);\n if (!id || normalizeToken(id) === EXIT_PLAN_KEEP_PLANNING_OPTION_ID) {\n return [];\n }\n return [\n {\n id,\n label:\n stringValue(option.name) ??\n stringValue(option.label) ??\n stringValue(option.title) ??\n stringValue(option.kind) ??\n id,\n kind: stringValue(option.kind) ?? id,\n ...(stringValue(option.description)\n ? { description: stringValue(option.description) as string }\n : {})\n }\n ];\n });\n}\n\n// The runtime's keep-planning option id (\"No, keep planning\"), preserving its\n// exact casing so it can be submitted back. The daemon models exit-plan as an\n// approval that *requires* an option id — declining means selecting this option,\n// not sending a bare deny. Returns null when the payload has no plan option\n// (legacy `exitplanmode` / Codex), where callers fall back to a plain deny.\nexport function extractExitPlanKeepPlanningOptionId(\n input: unknown,\n payload?: unknown\n): string | null {\n const sources =\n payload === undefined\n ? [recordValue(input)]\n : [recordValue(input), recordValue(payload)];\n for (const option of sources.flatMap(collectRawOptions)) {\n const id = rawOptionId(option);\n if (id && normalizeToken(id) === EXIT_PLAN_KEEP_PLANNING_OPTION_ID) {\n return id;\n }\n }\n return null;\n}\n\nfunction collectRawOptions(\n record: Record<string, unknown>\n): Record<string, unknown>[] {\n return arrayValue(record.options).map(recordValue);\n}\n\nfunction rawOptionId(option: Record<string, unknown>): string {\n return (\n stringValue(option.optionId) ??\n stringValue(option.id) ??\n stringValue(option.kind) ??\n \"\"\n );\n}\n\nfunction normalizeToken(value: string | null | undefined): string {\n return (value ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n","import type { AgentAskUserQuestionVM } from \"./contracts/agentAskUserQuestionItemVM\";\n\n/**\n * Single source of truth for turning a raw AskUserQuestion tool input's\n * `questions` array into the view-model shape. Both the in-conversation tool\n * projection and the message-center derivation call this, so the two surfaces\n * can never drift on which fields they read or how they default them (the\n * exact class of bug that left the message-center card without its options).\n *\n * Input shape (codex / ACP): each entry may carry `id`, `header`, `question`,\n * `multiSelect`, and `options: [{ label, description }]`. Answers are layered on\n * by the caller (the live projection knows them; a pending prompt has none), so\n * this returns the answer-less base.\n */\nexport function normalizeAskUserQuestions(\n rawQuestions: unknown\n): AgentAskUserQuestionVM[] {\n return arrayValue(rawQuestions).flatMap((value, index) => {\n const question = objectValue(value);\n if (!question) {\n return [];\n }\n return [\n {\n id: stringValue(question.id) ?? `question-${index + 1}`,\n header: stringValue(question.header) ?? `Question ${index + 1}`,\n question:\n stringValue(question.question) ??\n stringValue(question.header) ??\n `Question ${index + 1}`,\n options: arrayValue(question.options).flatMap((optionValue) => {\n const option = objectValue(optionValue);\n const label = stringValue(option?.label);\n if (!label) {\n return [];\n }\n return [\n {\n label,\n description: stringValue(option?.description) ?? \"\"\n }\n ];\n }),\n multiSelect: Boolean(question.multiSelect)\n }\n ];\n });\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n","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","const ALLOWED_WEBSITE_PROTOCOLS = new Set([\"http:\", \"https:\"]);\nexport const DEFAULT_WEBSITE_NODE_URL = \"https://www.google.com/\";\nconst GOOGLE_SEARCH_BASE_URL = \"https://www.google.com/search\";\nconst LIKELY_HOST_PATTERN =\n /^(localhost|(\\d{1,3}\\.){3}\\d{1,3}|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,})(?::\\d{1,5})?(?:[/?#][^\\s]*)?$/i;\nconst EXPLICIT_PROTOCOL_PATTERN = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//;\nconst LOOPBACK_HOST_PATTERN =\n /^(localhost|127(?:\\.\\d{1,3}){3})(?::\\d{1,5})?(?:[/?#][^\\s]*)?$/i;\n\nfunction defaultSchemeForHostInput(value: string): \"http\" | \"https\" {\n return LOOPBACK_HOST_PATTERN.test(value) ? \"http\" : \"https\";\n}\n\nexport function resolveWebsiteNavigationUrl(rawUrl: string): {\n url: string | null;\n error: string | null;\n} {\n const trimmed = rawUrl.trim();\n if (trimmed.length === 0) {\n return { url: null, error: null };\n }\n\n if (EXPLICIT_PROTOCOL_PATTERN.test(trimmed)) {\n try {\n const parsed = new URL(trimmed);\n if (!ALLOWED_WEBSITE_PROTOCOLS.has(parsed.protocol)) {\n return { url: null, error: `Unsupported protocol: ${parsed.protocol}` };\n }\n\n return { url: parsed.toString(), error: null };\n } catch {\n return { url: null, error: \"Invalid URL\" };\n }\n }\n\n if (!LIKELY_HOST_PATTERN.test(trimmed)) {\n return { url: null, error: \"Invalid URL\" };\n }\n\n try {\n const parsed = new URL(\n `${defaultSchemeForHostInput(trimmed)}://${trimmed}`\n );\n return { url: parsed.toString(), error: null };\n } catch {\n return { url: null, error: \"Invalid URL\" };\n }\n}\n\nexport function isWebsiteUrlAllowedForNavigation(rawUrl: string): boolean {\n const resolved = resolveWebsiteNavigationUrl(rawUrl);\n return resolved.url !== null && resolved.error === null;\n}\n\nexport function resolveWebsiteAddressInput(rawInput: string): {\n url: string | null;\n error: string | null;\n} {\n const trimmed = rawInput.trim();\n if (trimmed.length === 0) {\n return { url: null, error: null };\n }\n\n const navigation = resolveWebsiteNavigationUrl(trimmed);\n if (navigation.url) {\n return navigation;\n }\n\n const searchUrl = new URL(GOOGLE_SEARCH_BASE_URL);\n searchUrl.searchParams.set(\"q\", trimmed);\n return { url: searchUrl.toString(), error: null };\n}\n\nexport function normalizeWebsiteComparableUrl(rawUrl: string): string | null {\n const resolved = resolveWebsiteNavigationUrl(rawUrl);\n return resolved.error === null ? resolved.url : null;\n}\n","import { resolveWebsiteNavigationUrl } from \"../shared/utils/websiteUrl\";\nimport type { WorkspaceIssueMentionMode } from \"@tutti-os/workspace-issue-manager/core\";\nimport { parseRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\nimport { getAgentCustomMentionKind } from \"../shared/agentCustomMentionKinds\";\n\nexport type WorkspaceLinkActionSource =\n | \"agent-markdown\"\n | \"agent-file-change\"\n | string;\n\nexport interface ResolveWorkspaceFileLinkActionInput {\n path: string;\n workspaceRoot?: string | null;\n basePath?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface ResolveWorkspaceFilePathCandidateInput {\n path: string;\n workspaceRoot?: string | null;\n basePath?: string | null;\n}\n\nexport interface ResolvedWorkspaceFilePathCandidate {\n path: string;\n directoryPath: string;\n workspaceRoot: string;\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 OpenWorkspaceUrlLinkAction {\n type: \"open-url\";\n url: string;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface OpenAgentSessionLinkAction {\n type: \"open-agent-session\";\n workspaceId: string;\n agentSessionId: string;\n agentTargetId?: string | null;\n source: WorkspaceLinkActionSource;\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 ResolveWorkspaceUrlLinkActionInput {\n url: string;\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 URL_LIKE_LINK_PATTERN = /^[a-zA-Z][a-zA-Z\\d+.-]*:|^#/;\nconst LOCAL_ASSET_ROOT = \"/var/cache/tsh/local-assets\";\n\nexport function resolveWorkspaceFilePathCandidate({\n path,\n workspaceRoot,\n basePath\n}: ResolveWorkspaceFilePathCandidateInput): ResolvedWorkspaceFilePathCandidate | null {\n const rawPath = decodeWorkspaceLinkPath(path.trim());\n if (\n !rawPath ||\n isUrlLikeWorkspaceFilePath(rawPath) ||\n isUncWorkspaceFilePath(rawPath)\n ) {\n return null;\n }\n\n const normalizedPath = normalizeWorkspaceFilePath(rawPath);\n if (isUnsupportedSpecialWorkspaceFilePath(normalizedPath)) {\n return null;\n }\n if (isStagedLocalAssetPath(normalizedPath)) {\n return null;\n }\n if (isHomeRelativeWorkspaceFilePath(normalizedPath)) {\n const directoryPath = dirnameForHomeRelativePath(normalizedPath);\n return {\n path: normalizedPath,\n directoryPath,\n workspaceRoot:\n normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\") || directoryPath\n };\n }\n if (\n isAbsoluteLocalPath(normalizedPath) &&\n (isDirectAgentGeneratedMediaPath(normalizedPath) ||\n isDirectWorkspaceAppDataPath(normalizedPath))\n ) {\n const directoryPath = dirname(normalizedPath);\n return {\n path: normalizedPath,\n directoryPath,\n workspaceRoot:\n normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\") || directoryPath\n };\n }\n\n const selectedRoot = normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\");\n const sessionRoot = normalizeWorkspaceFilePath(basePath?.trim() ?? \"\");\n const root = selectedRoot || sessionRoot;\n if (!root) {\n return null;\n }\n if (isAbsoluteLocalPath(normalizedPath)) {\n const directoryPath = dirname(normalizedPath);\n return {\n path: normalizedPath,\n directoryPath,\n workspaceRoot: root\n };\n }\n const base = normalizeWorkspaceFilePath(basePath?.trim() || root);\n const resolvedPath = isAbsoluteLocalPath(normalizedPath)\n ? normalizedPath\n : normalizeWorkspaceFilePath(`${base}/${normalizedPath}`);\n if (\n !isInsideOrEqual(resolvedPath, root) &&\n !isDirectAgentGeneratedMediaPath(resolvedPath)\n ) {\n return null;\n }\n\n return {\n path: resolvedPath,\n directoryPath: resolvedPath === root ? root : dirname(resolvedPath),\n workspaceRoot: root\n };\n}\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 !isInsideOrEqual(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: basename(resolvedPath),\n source\n };\n}\n\nexport function resolveWorkspaceUrlLinkAction({\n url,\n source\n}: ResolveWorkspaceUrlLinkActionInput): OpenWorkspaceUrlLinkAction | null {\n const resolved = resolveWebsiteNavigationUrl(url);\n if (!resolved.url || resolved.error) {\n return null;\n }\n\n return {\n type: \"open-url\",\n url: resolved.url,\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 workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n const targetId = mention.entityId.trim();\n if (!workspaceId || !targetId) {\n return null;\n }\n\n if (mention.providerId === \"agent-session\") {\n const agentTargetId = mention.scope?.agentTargetId?.trim() || null;\n return {\n type: \"open-agent-session\",\n workspaceId,\n agentSessionId: targetId,\n ...(agentTargetId ? { agentTargetId } : {}),\n source\n };\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\nfunction normalizeWorkspaceFilePath(path: string): string {\n const normalizedPath = path.trim().replaceAll(\"\\\\\", \"/\");\n const drive = /^[A-Za-z]:/.exec(normalizedPath)?.[0] ?? \"\";\n const startsWithSlash = normalizedPath.startsWith(\"/\");\n const pathBody = drive\n ? normalizedPath.slice(drive.length)\n : startsWithSlash\n ? normalizedPath.slice(1)\n : normalizedPath;\n const parts: string[] = [];\n for (const part of pathBody.split(\"/\")) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n if (drive) {\n return parts.length > 0 ? `${drive}/${parts.join(\"/\")}` : `${drive}/`;\n }\n if (startsWithSlash) {\n return parts.length > 0 ? `/${parts.join(\"/\")}` : \"/\";\n }\n return parts.join(\"/\");\n}\n\nfunction isUrlLikeWorkspaceFilePath(path: string): boolean {\n if (path.startsWith(\"#\")) {\n return true;\n }\n if (isWindowsAbsolutePath(path.trim().replaceAll(\"\\\\\", \"/\"))) {\n return false;\n }\n return URL_LIKE_LINK_PATTERN.test(path);\n}\n\nfunction isAbsoluteLocalPath(path: string): boolean {\n return path.startsWith(\"/\") || isWindowsAbsolutePath(path);\n}\n\nfunction isHomeRelativeWorkspaceFilePath(path: string): boolean {\n return path === \"~\" || path.startsWith(\"~/\");\n}\n\nfunction dirnameForHomeRelativePath(path: string): string {\n return path === \"~\" ? \"~\" : dirname(path);\n}\n\nfunction isWindowsAbsolutePath(path: string): boolean {\n return /^[A-Za-z]:\\//.test(path);\n}\n\nfunction isUncWorkspaceFilePath(path: string): boolean {\n return /^(?:\\\\\\\\|\\/\\/)[^/\\\\]+[/\\\\][^/\\\\]+/.test(path);\n}\n\nfunction isUnsupportedSpecialWorkspaceFilePath(path: string): boolean {\n const comparisonPath = cleanWorkspaceFilePathForComparison(path);\n return (\n comparisonPath === \"/dev/null\" ||\n comparisonPath.split(\"/\").some((segment) => {\n const normalized = segment.trim().replace(/[. ]+$/g, \"\");\n const deviceName = normalized.split(\".\", 1)[0]?.toUpperCase();\n return deviceName === \"NUL\";\n })\n );\n}\n\nfunction cleanWorkspaceFilePathForComparison(path: string): string {\n const normalized = path.replace(/\\/+/g, \"/\");\n const parts: string[] = [];\n for (const part of normalized.split(\"/\")) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return normalized.startsWith(\"/\") ? `/${parts.join(\"/\")}` : parts.join(\"/\");\n}\n\nfunction decodeWorkspaceLinkPath(path: string): string {\n if (!path.includes(\"%\")) {\n return path;\n }\n try {\n return decodeURI(path);\n } catch {\n return path;\n }\n}\n\nfunction dirname(path: string): string {\n const index = path.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return path.slice(0, index);\n}\n\nfunction basename(path: string): string {\n return path.split(\"/\").filter(Boolean).at(-1) ?? path;\n}\n\nfunction isInsideOrEqual(path: string, root: string): boolean {\n if (root === \"/\") {\n return path.startsWith(\"/\");\n }\n const comparison =\n isWindowsAbsolutePath(root) || isWindowsAbsolutePath(path)\n ? { path: path.toLowerCase(), root: root.toLowerCase() }\n : { path, root };\n return (\n comparison.path === comparison.root ||\n comparison.path.startsWith(`${comparison.root}/`)\n );\n}\n\nfunction isStagedLocalAssetPath(path: string): boolean {\n return path !== LOCAL_ASSET_ROOT && isInsideOrEqual(path, LOCAL_ASSET_ROOT);\n}\n\nexport function isDirectAgentGeneratedMediaPath(path: string): boolean {\n if (!isAbsoluteLocalPath(path)) {\n return false;\n }\n const statePath = getTuttiStatePathSegments(path);\n if (!statePath) {\n return false;\n }\n if (\n statePath[1] !== \"agent\" ||\n statePath[2] !== \"runs\" ||\n (!statePath.includes(\"generated_images\") &&\n !statePath.includes(\"generated_videos\"))\n ) {\n return false;\n }\n return /\\.(?:png|jpe?g|gif|webp|bmp|mp4|webm)$/i.test(path);\n}\n\nfunction isDirectWorkspaceAppDataPath(path: string): boolean {\n if (!isAbsoluteLocalPath(path)) {\n return false;\n }\n const statePath = getTuttiStatePathSegments(path);\n if (!statePath) {\n return false;\n }\n return (\n statePath[1] === \"apps\" &&\n statePath[2] === \"workspaces\" &&\n statePath.length > 5\n );\n}\n\nfunction getTuttiStatePathSegments(path: string): string[] | null {\n const segments = path.split(\"/\").filter(Boolean);\n const stateRootIndex = segments.findIndex(\n (segment) => segment === \".tutti\" || segment === \".tutti-dev\"\n );\n if (stateRootIndex < 0) {\n return null;\n }\n return segments.slice(stateRootIndex);\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/workspaceLinkActions\";\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-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 {actionButtons ? (\n <div className=\"tsh-zoom-dialog__image-actions nodrag tsh-desktop-no-drag\">\n {actionButtons}\n </div>\n ) : null}\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 <Button\n asChild\n className=\"tsh-zoom-dialog__icon-button nodrag tsh-desktop-no-drag\"\n size=\"icon\"\n variant=\"chrome\"\n >\n <button\n type=\"button\"\n aria-label={t(\"common.minimizeImage\")}\n data-rmiz-btn-unzoom=\"\"\n onClick={closePreviewImage}\n >\n <RestoreIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </Button>\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 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":["stringValue","arrayValue","objectValue","stringValue","useCallback","useState","basenameWorkspacePath","label","parseRichTextMentionHref","isWindowsAbsolutePath","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","basename","basenameWorkspacePath","useCallback","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useEffect","CustomScrollArea","forwardRef","useCallback","useEffect","useRef","jsx","jsxs","forwardRef","useRef","useCallback","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../shared/agentMcpToolTarget.ts","../shared/agentConversation/agentApprovalPurpose.ts","../shared/agentConversation/exitPlanOptions.ts","../shared/agentConversation/askUserQuestions.ts","../shared/AgentMessageMarkdown.tsx","../shared/utils/websiteUrl.ts","../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":["export interface AgentMcpToolTarget {\n server: string;\n tool: string;\n displayName: string;\n instruction: string | null;\n}\n\nexport interface ExtractAgentMcpToolTargetInput {\n input?: Record<string, unknown> | null;\n metadata?: Record<string, unknown> | null;\n name?: string | null;\n payload?: Record<string, unknown> | null;\n toolName?: string | null;\n}\n\nexport function extractAgentMcpToolTarget({\n input: rawInput,\n metadata: rawMetadata,\n payload: rawPayload,\n toolName\n}: ExtractAgentMcpToolTargetInput): AgentMcpToolTarget | null {\n const payload = objectValue(rawPayload);\n const input = objectValue(rawInput) ?? objectValue(payload?.input);\n const metadata = objectValue(rawMetadata) ?? objectValue(payload?.metadata);\n const toolCall = objectValue(input?.toolCall);\n const toolCallRawInput = objectValue(toolCall?.rawInput);\n const request = objectValue(input?.request) ?? objectValue(toolCall?.request);\n const requestMeta = objectValue(request?._meta);\n const parsedToolName = parseMcpToolName(\n firstString(toolName, stringValue(metadata?.toolName))\n );\n const server = firstString(\n stringValue(metadata?.server),\n stringValue(metadata?.serverName),\n stringValue(metadata?.mcpServer),\n stringValue(input?.server),\n stringValue(input?.server_name),\n stringValue(input?.serverName),\n stringValue(input?.mcpServer),\n stringValue(toolCall?.server),\n stringValue(toolCall?.server_name),\n stringValue(toolCall?.serverName),\n stringValue(toolCallRawInput?.server),\n stringValue(toolCallRawInput?.server_name),\n stringValue(toolCallRawInput?.serverName),\n parsedToolName?.server\n );\n const tool = firstString(\n stringValue(metadata?.toolName),\n stringValue(metadata?.tool),\n stringValue(input?.tool),\n stringValue(input?.toolName),\n stringValue(toolCall?.tool),\n stringValue(toolCall?.toolName),\n stringValue(toolCallRawInput?.tool),\n stringValue(toolCallRawInput?.toolName),\n parsedToolName?.tool\n );\n if (!server || !tool) {\n return null;\n }\n return {\n server,\n tool,\n displayName: formatAgentMcpToolTarget({ server, tool }),\n instruction:\n firstString(\n formatToolParamsDisplay(requestMeta?.tool_params_display),\n formatObjectInstruction(requestMeta?.tool_params),\n formatObjectInstruction(input?.arguments),\n formatObjectInstruction(toolCallRawInput?.arguments)\n ) ?? null\n };\n}\n\nexport function formatAgentMcpToolTarget({\n server,\n tool\n}: {\n server: string;\n tool: string;\n}): string {\n return `${server} / ${tool}`;\n}\n\nfunction parseMcpToolName(\n value: string | null\n): { server: string; tool: string } | null {\n const match = value?.match(/^mcp__([^_]+(?:_[^_]+)*)__(.+)$/i);\n if (!match) {\n return null;\n }\n const server = match[1]?.replace(/_/gu, \"-\").trim();\n const tool = match[2]?.trim();\n return server && tool ? { server, tool } : null;\n}\n\nfunction firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n return values.find((value) => value !== null && value !== undefined) ?? null;\n}\n\nfunction formatToolParamsDisplay(value: unknown): string | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const parts = value.flatMap((entry) => {\n const record = objectValue(entry);\n const name =\n stringValue(record?.display_name) ??\n stringValue(record?.displayName) ??\n stringValue(record?.name);\n const rawValue = record?.value;\n const formattedValue = formatInstructionValue(rawValue);\n return name && formattedValue ? [`${name}: ${formattedValue}`] : [];\n });\n return parts.length > 0 ? parts.join(\", \") : null;\n}\n\nfunction formatObjectInstruction(value: unknown): string | null {\n const record = objectValue(value);\n if (!record) {\n return stringValue(value);\n }\n const parts = Object.entries(record).flatMap(([key, rawValue]) => {\n const formattedValue = formatInstructionValue(rawValue);\n return formattedValue ? [`${key}: ${formattedValue}`] : [];\n });\n return parts.length > 0 ? parts.join(\", \") : null;\n}\n\nfunction formatInstructionValue(value: unknown): string | null {\n if (typeof value === \"string\") {\n return stringValue(value);\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n return String(value);\n }\n if (Array.isArray(value)) {\n const parts = value.flatMap((entry) => {\n const formattedValue = formatInstructionValue(entry);\n return formattedValue ? [formattedValue] : [];\n });\n return parts.length > 0 ? parts.join(\", \") : null;\n }\n if (objectValue(value)) {\n return stableJsonValue(value);\n }\n return null;\n}\n\nfunction stableJsonValue(value: unknown): string | null {\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n","export type AgentApprovalPurpose = \"edit-files\";\n\nexport function normalizeAgentApprovalPurpose(\n value: unknown\n): AgentApprovalPurpose | null {\n return value === \"edit-files\" ? value : null;\n}\n","import type { AgentApprovalOptionVM } from \"./contracts/agentApprovalItemVM\";\n\n// Shared exit-plan (Claude Code `switch_mode`) detection and option extraction.\n//\n// Claude Code surfaces \"exit plan mode\" as a permission/approval whose\n// `input.toolCall.kind` is `switch_mode` and whose options are the permission\n// modes to switch into (\"Yes, and bypass permissions\" / \"...auto\" / etc.) plus\n// a trailing `plan` option (\"No, keep planning\"). Both the conversation and the\n// message-center deck must classify and render these identically, so the\n// detection + option normalization live here instead of being re-implemented at\n// each projection site (which is how they drifted in the first place).\n//\n// The runtime is the source of truth for the option set: callers render exactly\n// the modes it sent (so newly added modes like `auto` appear automatically)\n// rather than a hand-maintained list. The `plan` option is the keep-planning /\n// deny action and is filtered out of the mode list — callers render it as a\n// dedicated \"keep planning\" affordance.\n\nexport const EXIT_PLAN_KEEP_PLANNING_OPTION_ID = \"plan\";\n\nexport function isExitPlanSwitchModeInput(input: unknown): boolean {\n const record = recordValue(input);\n const toolCall = recordValue(record.toolCall);\n if (normalizeToken(stringValue(toolCall.kind)) !== \"switchmode\") {\n return false;\n }\n return collectRawOptions(record).some(\n (option) =>\n normalizeToken(rawOptionId(option)) === EXIT_PLAN_KEEP_PLANNING_OPTION_ID\n );\n}\n\n// Normalized \"Yes, and ...\" mode options, in runtime order, with the\n// keep-planning (`plan`) option removed. Returns [] when the payload carries no\n// options (e.g. Codex plan or the legacy `exitplanmode` tool), letting callers\n// fall back to a curated default list.\nexport function extractExitPlanModeOptions(\n input: unknown,\n payload?: unknown\n): AgentApprovalOptionVM[] {\n const sources =\n payload === undefined\n ? [recordValue(input)]\n : [recordValue(input), recordValue(payload)];\n return sources.flatMap(collectRawOptions).flatMap((option) => {\n // The emitted id must be the runtime's exact value (e.g. \"acceptEdits\",\n // \"auto\") — it is submitted back as the permission mode. Only the\n // keep-planning comparison is case/format-insensitive.\n const id = rawOptionId(option);\n if (!id || normalizeToken(id) === EXIT_PLAN_KEEP_PLANNING_OPTION_ID) {\n return [];\n }\n return [\n {\n id,\n label:\n stringValue(option.name) ??\n stringValue(option.label) ??\n stringValue(option.title) ??\n stringValue(option.kind) ??\n id,\n kind: stringValue(option.kind) ?? id,\n ...(stringValue(option.description)\n ? { description: stringValue(option.description) as string }\n : {})\n }\n ];\n });\n}\n\n// The runtime's keep-planning option id (\"No, keep planning\"), preserving its\n// exact casing so it can be submitted back. The daemon models exit-plan as an\n// approval that *requires* an option id — declining means selecting this option,\n// not sending a bare deny. Returns null when the payload has no plan option\n// (legacy `exitplanmode` / Codex), where callers fall back to a plain deny.\nexport function extractExitPlanKeepPlanningOptionId(\n input: unknown,\n payload?: unknown\n): string | null {\n const sources =\n payload === undefined\n ? [recordValue(input)]\n : [recordValue(input), recordValue(payload)];\n for (const option of sources.flatMap(collectRawOptions)) {\n const id = rawOptionId(option);\n if (id && normalizeToken(id) === EXIT_PLAN_KEEP_PLANNING_OPTION_ID) {\n return id;\n }\n }\n return null;\n}\n\nfunction collectRawOptions(\n record: Record<string, unknown>\n): Record<string, unknown>[] {\n return arrayValue(record.options).map(recordValue);\n}\n\nfunction rawOptionId(option: Record<string, unknown>): string {\n return (\n stringValue(option.optionId) ??\n stringValue(option.id) ??\n stringValue(option.kind) ??\n \"\"\n );\n}\n\nfunction normalizeToken(value: string | null | undefined): string {\n return (value ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n","import type { AgentAskUserQuestionVM } from \"./contracts/agentAskUserQuestionItemVM\";\n\n/**\n * Single source of truth for turning a raw AskUserQuestion tool input's\n * `questions` array into the view-model shape. Both the in-conversation tool\n * projection and the message-center derivation call this, so the two surfaces\n * can never drift on which fields they read or how they default them (the\n * exact class of bug that left the message-center card without its options).\n *\n * Input shape (codex / ACP): each entry may carry `id`, `header`, `question`,\n * `multiSelect`, and `options: [{ label, description }]`. Answers are layered on\n * by the caller (the live projection knows them; a pending prompt has none), so\n * this returns the answer-less base.\n */\nexport function normalizeAskUserQuestions(\n rawQuestions: unknown\n): AgentAskUserQuestionVM[] {\n return arrayValue(rawQuestions).flatMap((value, index) => {\n const question = objectValue(value);\n if (!question) {\n return [];\n }\n return [\n {\n id: stringValue(question.id) ?? `question-${index + 1}`,\n header: stringValue(question.header) ?? `Question ${index + 1}`,\n question:\n stringValue(question.question) ??\n stringValue(question.header) ??\n `Question ${index + 1}`,\n options: arrayValue(question.options).flatMap((optionValue) => {\n const option = objectValue(optionValue);\n const label = stringValue(option?.label);\n if (!label) {\n return [];\n }\n return [\n {\n label,\n description: stringValue(option?.description) ?? \"\"\n }\n ];\n }),\n multiSelect: Boolean(question.multiSelect)\n }\n ];\n });\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n","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","const ALLOWED_WEBSITE_PROTOCOLS = new Set([\"http:\", \"https:\"]);\nexport const DEFAULT_WEBSITE_NODE_URL = \"https://www.google.com/\";\nconst GOOGLE_SEARCH_BASE_URL = \"https://www.google.com/search\";\nconst LIKELY_HOST_PATTERN =\n /^(localhost|(\\d{1,3}\\.){3}\\d{1,3}|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,})(?::\\d{1,5})?(?:[/?#][^\\s]*)?$/i;\nconst EXPLICIT_PROTOCOL_PATTERN = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//;\nconst LOOPBACK_HOST_PATTERN =\n /^(localhost|127(?:\\.\\d{1,3}){3})(?::\\d{1,5})?(?:[/?#][^\\s]*)?$/i;\n\nfunction defaultSchemeForHostInput(value: string): \"http\" | \"https\" {\n return LOOPBACK_HOST_PATTERN.test(value) ? \"http\" : \"https\";\n}\n\nexport function resolveWebsiteNavigationUrl(rawUrl: string): {\n url: string | null;\n error: string | null;\n} {\n const trimmed = rawUrl.trim();\n if (trimmed.length === 0) {\n return { url: null, error: null };\n }\n\n if (EXPLICIT_PROTOCOL_PATTERN.test(trimmed)) {\n try {\n const parsed = new URL(trimmed);\n if (!ALLOWED_WEBSITE_PROTOCOLS.has(parsed.protocol)) {\n return { url: null, error: `Unsupported protocol: ${parsed.protocol}` };\n }\n\n return { url: parsed.toString(), error: null };\n } catch {\n return { url: null, error: \"Invalid URL\" };\n }\n }\n\n if (!LIKELY_HOST_PATTERN.test(trimmed)) {\n return { url: null, error: \"Invalid URL\" };\n }\n\n try {\n const parsed = new URL(\n `${defaultSchemeForHostInput(trimmed)}://${trimmed}`\n );\n return { url: parsed.toString(), error: null };\n } catch {\n return { url: null, error: \"Invalid URL\" };\n }\n}\n\nexport function isWebsiteUrlAllowedForNavigation(rawUrl: string): boolean {\n const resolved = resolveWebsiteNavigationUrl(rawUrl);\n return resolved.url !== null && resolved.error === null;\n}\n\nexport function resolveWebsiteAddressInput(rawInput: string): {\n url: string | null;\n error: string | null;\n} {\n const trimmed = rawInput.trim();\n if (trimmed.length === 0) {\n return { url: null, error: null };\n }\n\n const navigation = resolveWebsiteNavigationUrl(trimmed);\n if (navigation.url) {\n return navigation;\n }\n\n const searchUrl = new URL(GOOGLE_SEARCH_BASE_URL);\n searchUrl.searchParams.set(\"q\", trimmed);\n return { url: searchUrl.toString(), error: null };\n}\n\nexport function normalizeWebsiteComparableUrl(rawUrl: string): string | null {\n const resolved = resolveWebsiteNavigationUrl(rawUrl);\n return resolved.error === null ? resolved.url : null;\n}\n","import { resolveWebsiteNavigationUrl } from \"../shared/utils/websiteUrl\";\nimport type { WorkspaceIssueMentionMode } from \"@tutti-os/workspace-issue-manager/core\";\nimport { parseRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\nimport { getAgentCustomMentionKind } from \"../shared/agentCustomMentionKinds\";\n\nexport type WorkspaceLinkActionSource =\n | \"agent-markdown\"\n | \"agent-file-change\"\n | string;\n\nexport interface ResolveWorkspaceFileLinkActionInput {\n path: string;\n workspaceRoot?: string | null;\n basePath?: string | null;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface ResolveWorkspaceFilePathCandidateInput {\n path: string;\n workspaceRoot?: string | null;\n basePath?: string | null;\n}\n\nexport interface ResolvedWorkspaceFilePathCandidate {\n path: string;\n directoryPath: string;\n workspaceRoot: string;\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 OpenWorkspaceUrlLinkAction {\n type: \"open-url\";\n url: string;\n source: WorkspaceLinkActionSource;\n}\n\nexport interface OpenAgentSessionLinkAction {\n type: \"open-agent-session\";\n workspaceId: string;\n agentSessionId: string;\n agentTargetId?: string | null;\n source: WorkspaceLinkActionSource;\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 ResolveWorkspaceUrlLinkActionInput {\n url: string;\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 URL_LIKE_LINK_PATTERN = /^[a-zA-Z][a-zA-Z\\d+.-]*:|^#/;\nconst LOCAL_ASSET_ROOT = \"/var/cache/tsh/local-assets\";\n\nexport function resolveWorkspaceFilePathCandidate({\n path,\n workspaceRoot,\n basePath\n}: ResolveWorkspaceFilePathCandidateInput): ResolvedWorkspaceFilePathCandidate | null {\n const rawPath = decodeWorkspaceLinkPath(path.trim());\n if (\n !rawPath ||\n isUrlLikeWorkspaceFilePath(rawPath) ||\n isUncWorkspaceFilePath(rawPath)\n ) {\n return null;\n }\n\n const normalizedPath = normalizeWorkspaceFilePath(rawPath);\n if (isUnsupportedSpecialWorkspaceFilePath(normalizedPath)) {\n return null;\n }\n if (isStagedLocalAssetPath(normalizedPath)) {\n return null;\n }\n if (isHomeRelativeWorkspaceFilePath(normalizedPath)) {\n const directoryPath = dirnameForHomeRelativePath(normalizedPath);\n return {\n path: normalizedPath,\n directoryPath,\n workspaceRoot:\n normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\") || directoryPath\n };\n }\n if (\n isAbsoluteLocalPath(normalizedPath) &&\n (isDirectAgentGeneratedMediaPath(normalizedPath) ||\n isDirectWorkspaceAppDataPath(normalizedPath))\n ) {\n const directoryPath = dirname(normalizedPath);\n return {\n path: normalizedPath,\n directoryPath,\n workspaceRoot:\n normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\") || directoryPath\n };\n }\n\n const selectedRoot = normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\");\n const sessionRoot = normalizeWorkspaceFilePath(basePath?.trim() ?? \"\");\n const root = selectedRoot || sessionRoot;\n if (!root) {\n return null;\n }\n if (isAbsoluteLocalPath(normalizedPath)) {\n const directoryPath = dirname(normalizedPath);\n return {\n path: normalizedPath,\n directoryPath,\n workspaceRoot: root\n };\n }\n const base = normalizeWorkspaceFilePath(basePath?.trim() || root);\n const resolvedPath = isAbsoluteLocalPath(normalizedPath)\n ? normalizedPath\n : normalizeWorkspaceFilePath(`${base}/${normalizedPath}`);\n if (\n !isInsideOrEqual(resolvedPath, root) &&\n !isDirectAgentGeneratedMediaPath(resolvedPath)\n ) {\n return null;\n }\n\n return {\n path: resolvedPath,\n directoryPath: resolvedPath === root ? root : dirname(resolvedPath),\n workspaceRoot: root\n };\n}\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 !isInsideOrEqual(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: basename(resolvedPath),\n source\n };\n}\n\nexport function resolveWorkspaceUrlLinkAction({\n url,\n source\n}: ResolveWorkspaceUrlLinkActionInput): OpenWorkspaceUrlLinkAction | null {\n const resolved = resolveWebsiteNavigationUrl(url);\n if (!resolved.url || resolved.error) {\n return null;\n }\n\n return {\n type: \"open-url\",\n url: resolved.url,\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 workspaceId = mention.scope?.workspaceId?.trim() || \"\";\n const targetId = mention.entityId.trim();\n if (!workspaceId || !targetId) {\n return null;\n }\n\n if (mention.providerId === \"agent-session\") {\n const agentTargetId = mention.scope?.agentTargetId?.trim() || null;\n return {\n type: \"open-agent-session\",\n workspaceId,\n agentSessionId: targetId,\n ...(agentTargetId ? { agentTargetId } : {}),\n source\n };\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\nfunction normalizeWorkspaceFilePath(path: string): string {\n const normalizedPath = path.trim().replaceAll(\"\\\\\", \"/\");\n const drive = /^[A-Za-z]:/.exec(normalizedPath)?.[0] ?? \"\";\n const startsWithSlash = normalizedPath.startsWith(\"/\");\n const pathBody = drive\n ? normalizedPath.slice(drive.length)\n : startsWithSlash\n ? normalizedPath.slice(1)\n : normalizedPath;\n const parts: string[] = [];\n for (const part of pathBody.split(\"/\")) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n if (drive) {\n return parts.length > 0 ? `${drive}/${parts.join(\"/\")}` : `${drive}/`;\n }\n if (startsWithSlash) {\n return parts.length > 0 ? `/${parts.join(\"/\")}` : \"/\";\n }\n return parts.join(\"/\");\n}\n\nfunction isUrlLikeWorkspaceFilePath(path: string): boolean {\n if (path.startsWith(\"#\")) {\n return true;\n }\n if (isWindowsAbsolutePath(path.trim().replaceAll(\"\\\\\", \"/\"))) {\n return false;\n }\n return URL_LIKE_LINK_PATTERN.test(path);\n}\n\nfunction isAbsoluteLocalPath(path: string): boolean {\n return path.startsWith(\"/\") || isWindowsAbsolutePath(path);\n}\n\nfunction isHomeRelativeWorkspaceFilePath(path: string): boolean {\n return path === \"~\" || path.startsWith(\"~/\");\n}\n\nfunction dirnameForHomeRelativePath(path: string): string {\n return path === \"~\" ? \"~\" : dirname(path);\n}\n\nfunction isWindowsAbsolutePath(path: string): boolean {\n return /^[A-Za-z]:\\//.test(path);\n}\n\nfunction isUncWorkspaceFilePath(path: string): boolean {\n return /^(?:\\\\\\\\|\\/\\/)[^/\\\\]+[/\\\\][^/\\\\]+/.test(path);\n}\n\nfunction isUnsupportedSpecialWorkspaceFilePath(path: string): boolean {\n const comparisonPath = cleanWorkspaceFilePathForComparison(path);\n return (\n comparisonPath === \"/dev/null\" ||\n comparisonPath.split(\"/\").some((segment) => {\n const normalized = segment.trim().replace(/[. ]+$/g, \"\");\n const deviceName = normalized.split(\".\", 1)[0]?.toUpperCase();\n return deviceName === \"NUL\";\n })\n );\n}\n\nfunction cleanWorkspaceFilePathForComparison(path: string): string {\n const normalized = path.replace(/\\/+/g, \"/\");\n const parts: string[] = [];\n for (const part of normalized.split(\"/\")) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return normalized.startsWith(\"/\") ? `/${parts.join(\"/\")}` : parts.join(\"/\");\n}\n\nfunction decodeWorkspaceLinkPath(path: string): string {\n if (!path.includes(\"%\")) {\n return path;\n }\n try {\n return decodeURI(path);\n } catch {\n return path;\n }\n}\n\nfunction dirname(path: string): string {\n const index = path.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return path.slice(0, index);\n}\n\nfunction basename(path: string): string {\n return path.split(\"/\").filter(Boolean).at(-1) ?? path;\n}\n\nfunction isInsideOrEqual(path: string, root: string): boolean {\n if (root === \"/\") {\n return path.startsWith(\"/\");\n }\n const comparison =\n isWindowsAbsolutePath(root) || isWindowsAbsolutePath(path)\n ? { path: path.toLowerCase(), root: root.toLowerCase() }\n : { path, root };\n return (\n comparison.path === comparison.root ||\n comparison.path.startsWith(`${comparison.root}/`)\n );\n}\n\nfunction isStagedLocalAssetPath(path: string): boolean {\n return path !== LOCAL_ASSET_ROOT && isInsideOrEqual(path, LOCAL_ASSET_ROOT);\n}\n\nexport function isDirectAgentGeneratedMediaPath(path: string): boolean {\n if (!isAbsoluteLocalPath(path)) {\n return false;\n }\n const statePath = getTuttiStatePathSegments(path);\n if (!statePath) {\n return false;\n }\n if (\n statePath[1] !== \"agent\" ||\n statePath[2] !== \"runs\" ||\n (!statePath.includes(\"generated_images\") &&\n !statePath.includes(\"generated_videos\"))\n ) {\n return false;\n }\n return /\\.(?:png|jpe?g|gif|webp|bmp|mp4|webm)$/i.test(path);\n}\n\nfunction isDirectWorkspaceAppDataPath(path: string): boolean {\n if (!isAbsoluteLocalPath(path)) {\n return false;\n }\n const statePath = getTuttiStatePathSegments(path);\n if (!statePath) {\n return false;\n }\n return (\n statePath[1] === \"apps\" &&\n statePath[2] === \"workspaces\" &&\n statePath.length > 5\n );\n}\n\nfunction getTuttiStatePathSegments(path: string): string[] | null {\n const segments = path.split(\"/\").filter(Boolean);\n const stateRootIndex = segments.findIndex(\n (segment) => segment === \".tutti\" || segment === \".tutti-dev\"\n );\n if (stateRootIndex < 0) {\n return null;\n }\n return segments.slice(stateRootIndex);\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/workspaceLinkActions\";\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":";;;;;;;;;;;;;;;;;;;;;;;;;AAeO,SAAS,0BAA0B;AAAA,EACxC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AACF,GAA8D;AAC5D,QAAM,UAAU,YAAY,UAAU;AACtC,QAAM,QAAQ,YAAY,QAAQ,KAAK,YAAY,SAAS,KAAK;AACjE,QAAM,WAAW,YAAY,WAAW,KAAK,YAAY,SAAS,QAAQ;AAC1E,QAAM,WAAW,YAAY,OAAO,QAAQ;AAC5C,QAAM,mBAAmB,YAAY,UAAU,QAAQ;AACvD,QAAM,UAAU,YAAY,OAAO,OAAO,KAAK,YAAY,UAAU,OAAO;AAC5E,QAAM,cAAc,YAAY,SAAS,KAAK;AAC9C,QAAM,iBAAiB;AAAA,IACrB,YAAY,UAAU,YAAY,UAAU,QAAQ,CAAC;AAAA,EACvD;AACA,QAAM,SAAS;AAAA,IACb,YAAY,UAAU,MAAM;AAAA,IAC5B,YAAY,UAAU,UAAU;AAAA,IAChC,YAAY,UAAU,SAAS;AAAA,IAC/B,YAAY,OAAO,MAAM;AAAA,IACzB,YAAY,OAAO,WAAW;AAAA,IAC9B,YAAY,OAAO,UAAU;AAAA,IAC7B,YAAY,OAAO,SAAS;AAAA,IAC5B,YAAY,UAAU,MAAM;AAAA,IAC5B,YAAY,UAAU,WAAW;AAAA,IACjC,YAAY,UAAU,UAAU;AAAA,IAChC,YAAY,kBAAkB,MAAM;AAAA,IACpC,YAAY,kBAAkB,WAAW;AAAA,IACzC,YAAY,kBAAkB,UAAU;AAAA,IACxC,gBAAgB;AAAA,EAClB;AACA,QAAM,OAAO;AAAA,IACX,YAAY,UAAU,QAAQ;AAAA,IAC9B,YAAY,UAAU,IAAI;AAAA,IAC1B,YAAY,OAAO,IAAI;AAAA,IACvB,YAAY,OAAO,QAAQ;AAAA,IAC3B,YAAY,UAAU,IAAI;AAAA,IAC1B,YAAY,UAAU,QAAQ;AAAA,IAC9B,YAAY,kBAAkB,IAAI;AAAA,IAClC,YAAY,kBAAkB,QAAQ;AAAA,IACtC,gBAAgB;AAAA,EAClB;AACA,MAAI,CAAC,UAAU,CAAC,MAAM;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,yBAAyB,EAAE,QAAQ,KAAK,CAAC;AAAA,IACtD,aACE;AAAA,MACE,wBAAwB,aAAa,mBAAmB;AAAA,MACxD,wBAAwB,aAAa,WAAW;AAAA,MAChD,wBAAwB,OAAO,SAAS;AAAA,MACxC,wBAAwB,kBAAkB,SAAS;AAAA,IACrD,KAAK;AAAA,EACT;AACF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGW;AACT,SAAO,GAAG,MAAM,MAAM,IAAI;AAC5B;AAEA,SAAS,iBACP,OACyC;AACzC,QAAM,QAAQ,OAAO,MAAM,kCAAkC;AAC7D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,CAAC,GAAG,QAAQ,OAAO,GAAG,EAAE,KAAK;AAClD,QAAM,OAAO,MAAM,CAAC,GAAG,KAAK;AAC5B,SAAO,UAAU,OAAO,EAAE,QAAQ,KAAK,IAAI;AAC7C;AAEA,SAAS,eACJ,QACY;AACf,SAAO,OAAO,KAAK,CAAC,UAAU,UAAU,QAAQ,UAAU,MAAS,KAAK;AAC1E;AAEA,SAAS,wBAAwB,OAA+B;AAC9D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,QAAQ,CAAC,UAAU;AACrC,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,OACJ,YAAY,QAAQ,YAAY,KAChC,YAAY,QAAQ,WAAW,KAC/B,YAAY,QAAQ,IAAI;AAC1B,UAAM,WAAW,QAAQ;AACzB,UAAM,iBAAiB,uBAAuB,QAAQ;AACtD,WAAO,QAAQ,iBAAiB,CAAC,GAAG,IAAI,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EACpE,CAAC;AACD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,wBAAwB,OAA+B;AAC9D,QAAM,SAAS,YAAY,KAAK;AAChC,MAAI,CAAC,QAAQ;AACX,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,QAAM,QAAQ,OAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,QAAQ,MAAM;AAChE,UAAM,iBAAiB,uBAAuB,QAAQ;AACtD,WAAO,iBAAiB,CAAC,GAAG,GAAG,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EAC3D,CAAC;AACD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,uBAAuB,OAA+B;AAC7D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,UAAU,MACV;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,MAAM,QAAQ,CAAC,UAAU;AACrC,YAAM,iBAAiB,uBAAuB,KAAK;AACnD,aAAO,iBAAiB,CAAC,cAAc,IAAI,CAAC;AAAA,IAC9C,CAAC;AACD,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,EAC/C;AACA,MAAI,YAAY,KAAK,GAAG;AACtB,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+B;AACtD,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,OAA+B;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,YAAY,OAAgD;AACnE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;;;AC1KO,SAAS,8BACd,OAC6B;AAC7B,SAAO,UAAU,eAAe,QAAQ;AAC1C;;;ACYO,IAAM,oCAAoC;AAE1C,SAAS,0BAA0B,OAAyB;AACjE,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,WAAW,YAAY,OAAO,QAAQ;AAC5C,MAAI,eAAeA,aAAY,SAAS,IAAI,CAAC,MAAM,cAAc;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,kBAAkB,MAAM,EAAE;AAAA,IAC/B,CAAC,WACC,eAAe,YAAY,MAAM,CAAC,MAAM;AAAA,EAC5C;AACF;AAMO,SAAS,2BACd,OACA,SACyB;AACzB,QAAM,UACJ,YAAY,SACR,CAAC,YAAY,KAAK,CAAC,IACnB,CAAC,YAAY,KAAK,GAAG,YAAY,OAAO,CAAC;AAC/C,SAAO,QAAQ,QAAQ,iBAAiB,EAAE,QAAQ,CAAC,WAAW;AAI5D,UAAM,KAAK,YAAY,MAAM;AAC7B,QAAI,CAAC,MAAM,eAAe,EAAE,MAAM,mCAAmC;AACnE,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,OACEA,aAAY,OAAO,IAAI,KACvBA,aAAY,OAAO,KAAK,KACxBA,aAAY,OAAO,KAAK,KACxBA,aAAY,OAAO,IAAI,KACvB;AAAA,QACF,MAAMA,aAAY,OAAO,IAAI,KAAK;AAAA,QAClC,GAAIA,aAAY,OAAO,WAAW,IAC9B,EAAE,aAAaA,aAAY,OAAO,WAAW,EAAY,IACzD,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAOO,SAAS,oCACd,OACA,SACe;AACf,QAAM,UACJ,YAAY,SACR,CAAC,YAAY,KAAK,CAAC,IACnB,CAAC,YAAY,KAAK,GAAG,YAAY,OAAO,CAAC;AAC/C,aAAW,UAAU,QAAQ,QAAQ,iBAAiB,GAAG;AACvD,UAAM,KAAK,YAAY,MAAM;AAC7B,QAAI,MAAM,eAAe,EAAE,MAAM,mCAAmC;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,QAC2B;AAC3B,SAAO,WAAW,OAAO,OAAO,EAAE,IAAI,WAAW;AACnD;AAEA,SAAS,YAAY,QAAyC;AAC5D,SACEA,aAAY,OAAO,QAAQ,KAC3BA,aAAY,OAAO,EAAE,KACrBA,aAAY,OAAO,IAAI,KACvB;AAEJ;AAEA,SAAS,eAAe,OAA0C;AAChE,UAAQ,SAAS,IACd,QAAQ,YAAY,EAAE,EACtB,KAAK,EACL,YAAY;AACjB;AAEA,SAASA,aAAY,OAA+B;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,YAAY,OAAyC;AAC5D,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD,CAAC;AACP;AAEA,SAAS,WAAW,OAA2B;AAC7C,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;;;AChHO,SAAS,0BACd,cAC0B;AAC1B,SAAOC,YAAW,YAAY,EAAE,QAAQ,CAAC,OAAO,UAAU;AACxD,UAAM,WAAWC,aAAY,KAAK;AAClC,QAAI,CAAC,UAAU;AACb,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,MACL;AAAA,QACE,IAAIC,aAAY,SAAS,EAAE,KAAK,YAAY,QAAQ,CAAC;AAAA,QACrD,QAAQA,aAAY,SAAS,MAAM,KAAK,YAAY,QAAQ,CAAC;AAAA,QAC7D,UACEA,aAAY,SAAS,QAAQ,KAC7BA,aAAY,SAAS,MAAM,KAC3B,YAAY,QAAQ,CAAC;AAAA,QACvB,SAASF,YAAW,SAAS,OAAO,EAAE,QAAQ,CAAC,gBAAgB;AAC7D,gBAAM,SAASC,aAAY,WAAW;AACtC,gBAAM,QAAQC,aAAY,QAAQ,KAAK;AACvC,cAAI,CAAC,OAAO;AACV,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,cACA,aAAaA,aAAY,QAAQ,WAAW,KAAK;AAAA,YACnD;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,aAAa,QAAQ,SAAS,WAAW;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAASA,aAAY,OAA+B;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAASD,aAAY,OAAgD;AACnE,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD;AACN;AAEA,SAASD,YAAW,OAA2B;AAC7C,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACzC;;;AC7DA;AAAA,EAKE,eAAAG;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,OACK;AAGP,OAAO,mBAAmB;AAC1B,OAAO;AAAA,EACL;AAAA,OAEK;AACP,OAAO,eAAe;AACtB,SAAS,qBAAqBC,8BAA6B;AAC3D,SAAS,qCAAqC;AAC9C,SAAS,mBAAmB;AAC5B,SAAS,kCAAkC;;;ACrB3C,IAAM,4BAA4B,oBAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;AAG7D,IAAM,sBACJ;AACF,IAAM,4BAA4B;AAClC,IAAM,wBACJ;AAEF,SAAS,0BAA0B,OAAiC;AAClE,SAAO,sBAAsB,KAAK,KAAK,IAAI,SAAS;AACtD;AAEO,SAAS,4BAA4B,QAG1C;AACA,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,KAAK,MAAM,OAAO,KAAK;AAAA,EAClC;AAEA,MAAI,0BAA0B,KAAK,OAAO,GAAG;AAC3C,QAAI;AACF,YAAM,SAAS,IAAI,IAAI,OAAO;AAC9B,UAAI,CAAC,0BAA0B,IAAI,OAAO,QAAQ,GAAG;AACnD,eAAO,EAAE,KAAK,MAAM,OAAO,yBAAyB,OAAO,QAAQ,GAAG;AAAA,MACxE;AAEA,aAAO,EAAE,KAAK,OAAO,SAAS,GAAG,OAAO,KAAK;AAAA,IAC/C,QAAQ;AACN,aAAO,EAAE,KAAK,MAAM,OAAO,cAAc;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,CAAC,oBAAoB,KAAK,OAAO,GAAG;AACtC,WAAO,EAAE,KAAK,MAAM,OAAO,cAAc;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,SAAS,IAAI;AAAA,MACjB,GAAG,0BAA0B,OAAO,CAAC,MAAM,OAAO;AAAA,IACpD;AACA,WAAO,EAAE,KAAK,OAAO,SAAS,GAAG,OAAO,KAAK;AAAA,EAC/C,QAAQ;AACN,WAAO,EAAE,KAAK,MAAM,OAAO,cAAc;AAAA,EAC3C;AACF;;;AC7CA,SAAS,gCAAgC;AAoIzC,IAAM,wBAAwB;AAC9B,IAAM,mBAAmB;AAElB,SAAS,kCAAkC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF,GAAsF;AACpF,QAAM,UAAU,wBAAwB,KAAK,KAAK,CAAC;AACnD,MACE,CAAC,WACD,2BAA2B,OAAO,KAClC,uBAAuB,OAAO,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,2BAA2B,OAAO;AACzD,MAAI,sCAAsC,cAAc,GAAG;AACzD,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,cAAc,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,gCAAgC,cAAc,GAAG;AACnD,UAAM,gBAAgB,2BAA2B,cAAc;AAC/D,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,eACE,2BAA2B,eAAe,KAAK,KAAK,EAAE,KAAK;AAAA,IAC/D;AAAA,EACF;AACA,MACE,oBAAoB,cAAc,MACjC,gCAAgC,cAAc,KAC7C,6BAA6B,cAAc,IAC7C;AACA,UAAM,gBAAgB,QAAQ,cAAc;AAC5C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,eACE,2BAA2B,eAAe,KAAK,KAAK,EAAE,KAAK;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,eAAe,2BAA2B,eAAe,KAAK,KAAK,EAAE;AAC3E,QAAM,cAAc,2BAA2B,UAAU,KAAK,KAAK,EAAE;AACrE,QAAM,OAAO,gBAAgB;AAC7B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,oBAAoB,cAAc,GAAG;AACvC,UAAM,gBAAgB,QAAQ,cAAc;AAC5C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AACA,QAAM,OAAO,2BAA2B,UAAU,KAAK,KAAK,IAAI;AAChE,QAAM,eAAe,oBAAoB,cAAc,IACnD,iBACA,2BAA2B,GAAG,IAAI,IAAI,cAAc,EAAE;AAC1D,MACE,CAAC,gBAAgB,cAAc,IAAI,KACnC,CAAC,gCAAgC,YAAY,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe,iBAAiB,OAAO,OAAO,QAAQ,YAAY;AAAA,IAClE,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,+BAA+B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4E;AAC1E,QAAM,YAAY,kCAAkC;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,UAAU;AAAA,IAChB,eAAe,UAAU;AAAA,IACzB,eAAe,UAAU;AAAA,IACzB;AAAA,EACF;AACF;AAEO,SAAS,mCAAmC;AAAA,EACjD;AAAA,EACA;AACF,GAG2C;AACzC,QAAM,UAAU,wBAAwB,KAAK,KAAK,CAAC;AACnD,MAAI,CAAC,WAAW,2BAA2B,OAAO,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,2BAA2B,OAAO;AACvD,MACE,iBAAiB,oBACjB,CAAC,gBAAgB,cAAc,gBAAgB,GAC/C;AACA,WAAO;AAAA,EACT;AACA,MAAI,aAAa,SAAS,gBAAgB,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,SAAS,YAAY;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AACF,GAA0E;AACxE,QAAM,WAAW,4BAA4B,GAAG;AAChD,MAAI,CAAC,SAAS,OAAO,SAAS,OAAO;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,SAAS;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC;AAAA,EAChD;AAAA,EACA;AACF,GAKS;AACP,QAAM,UAAU,yBAAyB,MAAM,EAAE;AACjD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAIA,QAAM,mBAAmB,0BAA0B,QAAQ,UAAU;AACrE,MAAI,kBAAkB;AACpB,QAAI,CAAC,iBAAiB,WAAW;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAQ,WAAW,KAAK,EAAE,YAAY;AAAA,MAC5C,MAAM,KAAK,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC1D,QAAM,WAAW,QAAQ,SAAS,KAAK;AACvC,MAAI,CAAC,eAAe,CAAC,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,eAAe,iBAAiB;AAC1C,UAAM,gBAAgB,QAAQ,OAAO,eAAe,KAAK,KAAK;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,gBAAgB;AAAA,MAChB,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,mBAAmB;AAC5C,UAAM,OAAO,+BAA+B,QAAQ,OAAO,QAAQ,IAAI;AACvE,UAAM,YAAY,QAAQ,OAAO,WAAW,KAAK,KAAK;AACtD,UAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK,KAAK;AAC9C,UAAM,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAK;AAChD,UAAM,UAAU,QAAQ,OAAO,SAAS,KAAK,KAAK;AAClD,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,iBAAiB;AAC1C,UAAM,YAAY,QAAQ,OAAO,WAAW,KAAK,KAAK;AACtD,UAAM,gBAAgB,QAAQ,OAAO,eAAe,KAAK,KAAK;AAC9D,UAAM,iBAAiB,QAAQ,OAAO,gBAAgB,KAAK,KAAK;AAChE,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MACzC,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,MACE,QAAQ,eAAe,yBACvB,QAAQ,OAAO,QAAQ,KAAK,MAAM,OAClC;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,+BACP,OACkC;AAClC,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,YAAY,eAAe,YAAY,YAAY,UAAU;AACtE;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgE;AAC9D,SACE,kCAAkC,EAAE,MAAM,OAAO,CAAC,KAClD,mCAAmC;AAAA,IACjC,MAAM;AAAA,IACN;AAAA,EACF,CAAC,KACD,+BAA+B;AAAA,IAC7B,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,KACD,8BAA8B,EAAE,KAAK,MAAM,OAAO,CAAC;AAEvD;AAEA,SAAS,2BAA2B,MAAsB;AACxD,QAAM,iBAAiB,KAAK,KAAK,EAAE,WAAW,MAAM,GAAG;AACvD,QAAM,QAAQ,aAAa,KAAK,cAAc,IAAI,CAAC,KAAK;AACxD,QAAM,kBAAkB,eAAe,WAAW,GAAG;AACrD,QAAM,WAAW,QACb,eAAe,MAAM,MAAM,MAAM,IACjC,kBACE,eAAe,MAAM,CAAC,IACtB;AACN,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,SAAS,MAAM,GAAG,GAAG;AACtC,QAAI,CAAC,QAAQ,SAAS,KAAK;AACzB;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI;AACV;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,MAAI,OAAO;AACT,WAAO,MAAM,SAAS,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK;AAAA,EACpE;AACA,MAAI,iBAAiB;AACnB,WAAO,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AAAA,EACpD;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,2BAA2B,MAAuB;AACzD,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,sBAAsB,KAAK,KAAK,EAAE,WAAW,MAAM,GAAG,CAAC,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,KAAK,IAAI;AACxC;AAEA,SAAS,oBAAoB,MAAuB;AAClD,SAAO,KAAK,WAAW,GAAG,KAAK,sBAAsB,IAAI;AAC3D;AAEA,SAAS,gCAAgC,MAAuB;AAC9D,SAAO,SAAS,OAAO,KAAK,WAAW,IAAI;AAC7C;AAEA,SAAS,2BAA2B,MAAsB;AACxD,SAAO,SAAS,MAAM,MAAM,QAAQ,IAAI;AAC1C;AAEA,SAAS,sBAAsB,MAAuB;AACpD,SAAO,eAAe,KAAK,IAAI;AACjC;AAEA,SAAS,uBAAuB,MAAuB;AACrD,SAAO,oCAAoC,KAAK,IAAI;AACtD;AAEA,SAAS,sCAAsC,MAAuB;AACpE,QAAM,iBAAiB,oCAAoC,IAAI;AAC/D,SACE,mBAAmB,eACnB,eAAe,MAAM,GAAG,EAAE,KAAK,CAAC,YAAY;AAC1C,UAAM,aAAa,QAAQ,KAAK,EAAE,QAAQ,WAAW,EAAE;AACvD,UAAM,aAAa,WAAW,MAAM,KAAK,CAAC,EAAE,CAAC,GAAG,YAAY;AAC5D,WAAO,eAAe;AAAA,EACxB,CAAC;AAEL;AAEA,SAAS,oCAAoC,MAAsB;AACjE,QAAM,aAAa,KAAK,QAAQ,QAAQ,GAAG;AAC3C,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,WAAW,MAAM,GAAG,GAAG;AACxC,QAAI,CAAC,QAAQ,SAAS,KAAK;AACzB;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI;AACV;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO,WAAW,WAAW,GAAG,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK,MAAM,KAAK,GAAG;AAC5E;AAEA,SAAS,wBAAwB,MAAsB;AACrD,MAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,UAAU,IAAI;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,GAAG,KAAK;AAC5B;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,KAAK;AACnD;AAEA,SAAS,gBAAgB,MAAc,MAAuB;AAC5D,MAAI,SAAS,KAAK;AAChB,WAAO,KAAK,WAAW,GAAG;AAAA,EAC5B;AACA,QAAM,aACJ,sBAAsB,IAAI,KAAK,sBAAsB,IAAI,IACrD,EAAE,MAAM,KAAK,YAAY,GAAG,MAAM,KAAK,YAAY,EAAE,IACrD,EAAE,MAAM,KAAK;AACnB,SACE,WAAW,SAAS,WAAW,QAC/B,WAAW,KAAK,WAAW,GAAG,WAAW,IAAI,GAAG;AAEpD;AAEA,SAAS,uBAAuB,MAAuB;AACrD,SAAO,SAAS,oBAAoB,gBAAgB,MAAM,gBAAgB;AAC5E;AAEO,SAAS,gCAAgC,MAAuB;AACrE,MAAI,CAAC,oBAAoB,IAAI,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,0BAA0B,IAAI;AAChD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,MACE,UAAU,CAAC,MAAM,WACjB,UAAU,CAAC,MAAM,UAChB,CAAC,UAAU,SAAS,kBAAkB,KACrC,CAAC,UAAU,SAAS,kBAAkB,GACxC;AACA,WAAO;AAAA,EACT;AACA,SAAO,0CAA0C,KAAK,IAAI;AAC5D;AAEA,SAAS,6BAA6B,MAAuB;AAC3D,MAAI,CAAC,oBAAoB,IAAI,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,0BAA0B,IAAI;AAChD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,SACE,UAAU,CAAC,MAAM,UACjB,UAAU,CAAC,MAAM,gBACjB,UAAU,SAAS;AAEvB;AAEA,SAAS,0BAA0B,MAA+B;AAChE,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,QAAM,iBAAiB,SAAS;AAAA,IAC9B,CAAC,YAAY,YAAY,YAAY,YAAY;AAAA,EACnD;AACA,MAAI,iBAAiB,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,SAAS,MAAM,cAAc;AACtC;;;ACxjBA,IAAM,yBAAyB;AAExB,SAAS,+BACd,SACA,SACuC;AACvC,MAAI,CAAC,QAAQ,aAAa,QAAQ,WAAW,GAAG;AAC9C,WAAO,EAAE,SAAS,SAAS,MAAM;AAAA,EACnC;AAEA,QAAM,eAAe,KAAK;AAAA,IACxB;AAAA,IACA,QAAQ,gBAAgB;AAAA,EAC1B;AACA,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,SAAS,YAAY;AAC3D,QAAM,OAAO,QAAQ,MAAM,SAAS;AAEpC,QAAM,QAAQ,cAAc,IAAI;AAChC,MAAI,OAAO;AACT,WAAO;AAAA,MACL,SAAS,GAAG,OAAO;AAAA,EAAK,MAAM,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,MACzD,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,iBAAiB,4BAA4B,OAAO;AAC1D,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,4BAA4B,OAAO;AACtD,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,yBAAyB,OAAO;AACjD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,uBAAuB,IAAI;AAC9C,MAAI,YAAY;AACd,WAAO;AAAA,MACL,SAAS,GAAG,OAAO,GAAG,IAAI,OAAO,WAAW,MAAM,CAAC;AAAA,MACnD,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW,gCAAgC,OAAO;AACxD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,SAAS,SAAS,MAAM;AACnC;AAEA,SAAS,cACP,MAC8C;AAC9C,MAAI,YAA0D;AAC9D,aAAW,QAAQ,KAAK,QAAQ,UAAU,IAAI,EAAE,MAAM,IAAI,GAAG;AAC3D,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,MAAM,WAAW,UAAU,UAAU,MAAM,UAAU,UAAU,QAAQ;AACzE,kBAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eACP,MAC8C;AAC9C,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,OAAO,QAAQ,GAAG;AAC9D,aAAS;AAAA,EACX;AACA,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,SAAO,KAAK,QAAQ,MAAM,MAAM,QAAQ;AACtC,cAAU;AAAA,EACZ;AACA,SAAO,UAAU,IAAI,EAAE,QAAQ,OAAO,IAAI;AAC5C;AAEA,SAAS,4BACP,SAC8C;AAC9C,QAAM,YAAY,QAAQ,YAAY,IAAI,IAAI;AAC9C,QAAM,OAAO,QAAQ,MAAM,SAAS;AACpC,QAAM,YAAY,KAAK,YAAY,GAAG;AACtC,QAAM,aAAa,KAAK,YAAY,IAAI;AACxC,QAAM,mBACJ,cAAc,KAAK,aAAa,MAAM,YAAY,aAAa;AACjE,MAAI,mBAAmB,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,YAAY;AACtC,QAAM,SAAS,QAAQ,MAAM,iBAAiB;AAC9C,QAAM,kBAAkB,OAAO,QAAQ,GAAG;AAC1C,MAAI,kBAAkB,GAAG;AACvB,UAAMC,SAAQ,OAAO,WAAW,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC;AACxE,WAAO;AAAA,MACL,SAAS,GAAG,QAAQ,MAAM,GAAG,iBAAiB,CAAC,GAAGA,MAAK;AAAA,MACvD,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,OAAO,kBAAkB,CAAC,MAAM,OAAO,OAAO,SAAS,GAAG,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,WAAW,IAAI,IAChC,OAAO,MAAM,GAAG,eAAe,IAC/B,OAAO,MAAM,GAAG,eAAe;AACnC,SAAO;AAAA,IACL,SAAS,GAAG,QAAQ,MAAM,GAAG,iBAAiB,CAAC,GAAG,KAAK;AAAA,IACvD,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,4BACP,SAC8C;AAC9C,QAAM,YAAY,QAAQ,YAAY,IAAI,IAAI;AAC9C,QAAM,OAAO,QAAQ,MAAM,SAAS;AACpC,QAAM,UAAU,KAAK,KAAK;AAC1B,QAAM,WAAW,YAAY,OAAO,YAAY,OAAO,YAAY;AACnE,QAAM,YACJ,QAAQ,UAAU,KAClB,QAAQ,SAAS,GAAG,KACpB,CAAC,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,QAAQ,OAAO,QAAQ,GAAG;AACtE,MAAI,CAAC,YAAY,CAAC,WAAW;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,QAAQ,MAAM,GAAG,SAAS;AAAA,IACnC,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,yBACP,SAC8C;AAC9C,MAAI,QAAQ,SAAS,IAAI,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,QAAQ,UAAU,IAAI,EAAE,MAAM,IAAI;AACxD,QAAM,cAAc,MAAM,GAAG,EAAE,KAAK;AACpC,QAAM,eAAe,MAAM,GAAG,EAAE,KAAK;AACrC,MAAI,CAAC,YAAY,SAAS,GAAG,KAAK,CAAC,aAAa,SAAS,GAAG,GAAG;AAC7D,WAAO;AAAA,EACT;AACA,MAAI,YAAY,QAAQ,EAAE,SAAS,GAAG,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,cAAc,GAAG,IAAI,GAAG;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,GAAG,OAAO;AAAA,IACnB,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,uBAAuB,MAAyC;AACvE,QAAM,gBAAgB,KAAK,MAAM,KAAK,YAAY,MAAM,IAAI,CAAC;AAC7D,MAAI,aAAa;AACjB,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS,GAAG;AAC5D,QAAI,cAAc,KAAK,MAAM,KAAK;AAChC;AAAA,IACF;AACA,QAAI,SAAS;AACb,WAAO,cAAc,QAAQ,MAAM,MAAM,KAAK;AAC5C,gBAAU;AAAA,IACZ;AACA,QAAI,UAAU,GAAG;AACf,eAAS,SAAS;AAClB;AAAA,IACF;AACA,iBAAa,eAAe,SAAS,IAAI;AACzC,aAAS,SAAS;AAAA,EACpB;AACA,SAAO,aAAa,IAAI,EAAE,QAAQ,WAAW,IAAI;AACnD;AAEA,SAAS,gCACP,SAC8C;AAC9C,QAAM,SAAS,QAAQ,GAAG,EAAE;AAC5B,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,GAAG,EAAE;AAC9B,QAAM,cACJ,aAAa,SAAS,QAAQ,MAAM,GAAG,EAAE,IAAI,QAAQ,MAAM,GAAG,EAAE;AAClE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,UAAU,OAAe,MAAsB;AACtD,MAAI,QAAQ;AACZ,aAAW,WAAW,OAAO;AAC3B,QAAI,YAAY,MAAM;AACpB,eAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;;;AC/OA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AASP,IAAM,mBAAmB;AACzB,IAAM,+BAA+B;AACrC,IAAM,+BAA+B;AAE9B,SAAS,wBACd,YACA,SACQ;AACR,QAAM;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,EACvB,IAAI;AACJ,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,UAAU;AACzD,QAAM,YAAY,OAAO,UAAU;AACnC,QAAM,aAAa,OAAO,WAAW;AACrC,QAAM,WAAW,OAA6C,IAAI;AAElE,YAAU,MAAM;AACd,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,WAAW,CAAC;AAEhB;AAAA,IACE,MAAM,MAAM;AACV,qCAA+B,QAAQ;AAAA,IACzC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,YAAU,MAAM;AACd,cAAU,UAAU;AAEpB,QAAI,CAAC,SAAS;AACZ,qCAA+B,QAAQ;AACvC,iBAAW,UAAU;AACrB,qBAAe,UAAU;AACzB;AAAA,IACF;AAEA,QAAI,eAAe,WAAW,WAAW,SAAS,YAAY,MAAM;AAClE;AAAA,IACF;AAEA,aAAS,UAAU;AAAA,MACjB,MAAM;AACJ,iBAAS,UAAU;AACnB,cAAM,kBAAkB,4BAA4B;AAAA,UAClD,aAAa,WAAW;AAAA,UACxB,YAAY,UAAU;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,oBAAoB,WAAW,SAAS;AAC1C;AAAA,QACF;AAEA,mBAAW,UAAU;AACrB,wBAAgB,MAAM;AACpB,yBAAe,eAAe;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,MACA,KAAK,IAAI,GAAG,OAAO;AAAA,IACrB;AAEA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,UAAU,cAAc;AACjC;AAEO,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,qBAAqB;AACvB,GAMW;AACT,MAAI,gBAAgB,YAAY;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,WAAW,WAAW,WAAW,IAClD,YAAY,SACZ,mBAAmB,aAAa,UAAU;AAC9C,QAAM,eAAe,WAAW,MAAM,GAAG,YAAY;AACrD,QAAM,kBAAkB,WAAW,SAAS;AAC5C,MAAI,mBAAmB,oBAAoB;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,KAAK;AAAA,IACzB;AAAA,IACA,KAAK,KAAM,KAAK,IAAI,GAAG,iBAAiB,IAAI,KAAK,IAAI,GAAG,OAAO,IAAK,GAAI;AAAA,EAC1E;AACA,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,KAAK,IAAI,WAAW,QAAQ,aAAa,SAAS,aAAa;AAAA,EACjE;AACF;AAEA,SAAS,mBAAmB,MAAc,OAAuB;AAC/D,QAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;AACpD,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAAG;AACjD,QAAI,KAAK,WAAW,KAAK,MAAM,MAAM,WAAW,KAAK,GAAG;AACtD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,+BACP,UACM;AACN,MAAI,SAAS,YAAY,MAAM;AAC7B;AAAA,EACF;AACA,eAAa,SAAS,OAAO;AAC7B,WAAS,UAAU;AACrB;;;ACnJA,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAOvB,SAAS,6BACd,SAC0B;AAC1B,QAAM,aAAa,QAAQ,QAAQ,UAAU,IAAI;AACjD,MAAI,CAAC,YAAY;AACf,WAAO,CAAC,EAAE,SAAS,IAAI,mBAAmB,GAAG,CAAC;AAAA,EAChD;AAEA,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,QAAM,SAAmC,CAAC;AAC1C,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAmD;AAEvD,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,IAAI;AACjB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI,WAAW;AACb,UAAI,CAAC,OAAO;AACV,gBAAQ;AAAA,MACV,WACE,UAAU,WAAW,MAAM,UAC3B,UAAU,UAAU,MAAM,QAC1B;AACA,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AACA,QAAI,CAAC,SAAS,KAAK,KAAK,MAAM,IAAI;AAChC,iCAA2B,QAAQ,OAAO;AAAA,IAC5C;AAAA,EACF;AACA,6BAA2B,QAAQ,OAAO;AAC1C,SAAO,OAAO,SAAS,IACnB,SACA,CAAC,EAAE,SAAS,YAAY,mBAAmB,WAAW,CAAC;AAC7D;AAEO,SAAS,2BACd,QACA,OACM;AACN,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AACA,QAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,MAAI,CAAC,SAAS;AACZ,UAAM,SAAS;AACf;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC;AACD,QAAM,SAAS;AACjB;AAEO,SAAS,oBACd,MAC2C;AAC3C,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,SAAS,QAAQ,CAAC;AACxB,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AACA,MAAI,SAAS;AACb,SAAO,QAAQ,MAAM,MAAM,QAAQ;AACjC,cAAU;AAAA,EACZ;AACA,SAAO,UAAU,IAAI,EAAE,QAAQ,OAAO,IAAI;AAC5C;AAEO,SAAS,0BACd,QACe;AACf,MAAI,EAAE,kBAAkB,UAAU;AAChC,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO,QAAQ,gCAAgC;AAC5D,MAAI,EAAE,gBAAgB,cAAc;AAClC,WAAO;AAAA,EACT;AACA,QAAM,WAAW,KAAK,QAAQ,eAAe,KAAK;AAClD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,mBAAmB;AACrC,WAAO,KAAK,aAAa,MAAM,GAAG,KAAK,KAAK;AAAA,EAC9C;AACA,SAAO;AACT;AAEO,SAAS,qBACd,OAIA,MACA,aACM;AACN,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AACA,QAAM,eAAe;AACrB,QAAM,gBAAgB;AACtB,gBAAc,MAAM;AACtB;AAEO,SAAS,4BACd,OACA,MACA,aACM;AACN,MAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C;AAAA,EACF;AACA,uBAAqB,OAAO,MAAM,WAAW;AAC/C;AAEO,SAAS,gCACd,OACA,MACA,aACM;AACN,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AACA,uBAAqB,OAAO,MAAM,WAAW;AAC/C;AAEO,SAAS,4BAA4B,SAAyB;AACnE,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,WAAQ,OAAO,KAAK,QAAQ,WAAW,KAAK,IAAK;AAAA,EACnD;AACA,SAAO,GAAG,QAAQ,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC;AAC5C;AAEO,SAAS,4BAA4B,SAA0B;AACpE,QAAM,kBAAkB,QAAQ,QAAQ,UAAU,IAAI,EAAE,MAAM,IAAI;AAClE,MAAI,gBAAgB,SAAS,sBAAsB;AACjD,WAAO;AAAA,EACT;AACA,QAAM,qBAAqB,gBAAgB,OAAO,CAAC,OAAO,SAAS;AACjE,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,eAAe,sCAAsC,KAAK,OAAO,IACnE,IACA;AACJ,WACE,QACA,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,SAAS,qBAAqB,CAAC,IAC7D;AAAA,EAEJ,GAAG,CAAC;AACJ,SAAO,qBAAqB;AAC9B;;;ACrKA,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA,4BAAAC;AAAA,OACK;AASP,IAAM,qCAAqC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,mCAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,sBAAkE,CAAC;AAiBzE,IAAM,sBAAsB,oBAAI,IAAiC;AACjE,IAAM,wCAAwC;AAWvC,SAAS,oBAAoB,MAAuB;AACzD,QAAM,YAAY,KAAK,KAAK;AAC5B,SACE,UAAU,SAAS,KACnB,UAAU,WAAW,GAAG,KACxB,CAAC,UAAU,WAAW,IAAI,KAC1B,CAAC,UAAU,SAAS,KAAK,KACzB,CAAC,KAAK,KAAK,SAAS;AAExB;AAEO,SAAS,mBAAmB,MAAuB;AACxD,QAAM,YAAY,KAAK,KAAK;AAC5B,SACE,UAAU,SAAS,KACnB,CAAC,KAAK,KAAK,SAAS,MACnB,cAAc,OACb,UAAU,WAAW,IAAI,KACzB,UAAU,WAAW,KAAK;AAEhC;AAEO,SAASC,uBAAsB,MAAuB;AAC3D,QAAM,YAAY,KAAK,KAAK;AAC5B,SAAO,kBAAkB,KAAK,SAAS,KAAK,CAAC,KAAK,KAAK,SAAS;AAClE;AAEO,SAAS,4BAA4B,MAAuB;AACjE,QAAM,YAAY,KAAK,KAAK;AAC5B,MAAI,CAAC,aAAa,UAAU,SAAS,KAAK,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,SACE,oBAAoB,SAAS,KAC7B,mBAAmB,SAAS,KAC5BA,uBAAsB,SAAS;AAEnC;AAEO,SAAS,wBAAwB,MAAuB;AAC7D,QAAM,SAAS,KAAK,KAAK;AACzB,SAAO;AAAA,IACL,WACC,2BAA2B,MAAM,KAChC,sBAAsB,MAAM,KAC5B,4BAA4B,MAAM;AAAA,EACtC;AACF;AAEO,SAAS,2BAA2B,MAAuB;AAChE,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,CAAC,UAAU,4BAA4B,MAAM,GAAG;AAClD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,WAAO,OAAO,SAAS;AAAA,EACzB;AACA,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,MAAM;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,WAAW,IAAI,SAAS,QAAQ,MAAM,EAAE,EAAE,YAAY;AAC5D,SAAO,iCAAiC;AAAA,IACtC;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC,KAAqB;AACrE,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,CAAC,oBAAoB,OAAO,KAAK,QAAQ,WAAW,aAAa,GAAG;AACtE,WAAO;AAAA,EACT;AACA,SAAO,IAAI,IAAI,SAAS,SAAS,EAAE,SAAS;AAC9C;AAEO,SAAS,+BAA+B,KAAuB;AACpE,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,oBAAoB,OAAO,KAAK,QAAQ,WAAW,aAAa,GAAG;AACtE,WAAO;AAAA,EACT;AACA,SAAO,gCAAgC,OAAO;AAChD;AAEO,SAAS,yBACd,YAC0B;AAC1B,SAAO,yBAAyB,UAAU,GAAG,QAAQ;AACvD;AAEO,SAAS,yBACd,YACsD;AACtD,QAAM,gBAAgB,8BAA8B,UAAU;AAC9D,MAAI,eAAe;AACjB,WAAO,EAAE,MAAM,SAAS,UAAU,cAAc;AAAA,EAClD;AACA,QAAM,gBAAgB,8BAA8B,UAAU;AAC9D,MAAI,eAAe;AACjB,WAAO,EAAE,MAAM,SAAS,UAAU,cAAc;AAAA,EAClD;AACA,SAAO;AACT;AAEO,SAAS,6BACd,MAC2B;AAC3B,QAAM,QAAQ,oBAAoB,IAAI,IAAI;AAC1C,SAAO,QACH,EAAE,MAAM,MAAM,MAAM,QAAQ,SAAS,KAAK,MAAM,UAAU,IAC1D;AACN;AAEO,SAAS,0BACd,MACiD;AACjD,QAAM,QAAQ,oBAAoB,IAAI,IAAI;AAC1C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAClB,MAAI,MAAM,aAAa;AACrB,iBAAa,MAAM,WAAW;AAC9B,UAAM,cAAc;AAAA,EACtB;AACA,SAAO,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,UAAU;AAClD;AAEO,SAAS,mBACd,MACA,MACA,MACQ;AACR,QAAM,QAAQ,oBAAoB,IAAI,IAAI;AAC1C,MAAI,OAAO;AACT,UAAM,YAAY;AAClB,QAAI,MAAM,aAAa;AACrB,mBAAa,MAAM,WAAW;AAC9B,YAAM,cAAc;AAAA,IACtB;AACA,WAAO,MAAM;AAAA,EACf;AACA,QAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,sBAAoB,IAAI,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,SAAO;AACT;AAEO,SAAS,2BACd,MACA,WACM;AACN,QAAM,QAAQ,oBAAoB,IAAI,IAAI;AAC1C,MAAI,CAAC,SAAS,MAAM,cAAc,WAAW;AAC3C,QAAI,gBAAgB,SAAS;AAC7B;AAAA,EACF;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM,WAAW,CAAC;AAC/C,MAAI,MAAM,WAAW,KAAK,MAAM,aAAa;AAC3C;AAAA,EACF;AAEA,QAAM,cAAc,WAAW,MAAM;AACnC,UAAM,UAAU,oBAAoB,IAAI,IAAI;AAC5C,QAAI,CAAC,WAAW,QAAQ,cAAc,aAAa,QAAQ,WAAW,GAAG;AACvE;AAAA,IACF;AACA,wBAAoB,OAAO,IAAI;AAC/B,QAAI,gBAAgB,SAAS;AAAA,EAC/B,GAAG,qCAAqC;AAC1C;AAEO,SAAS,gCAAgC,SAAyB;AACvE,MAAI,MAAM;AACV,WAAS,QAAQ,GAAG,QAAQ,QAAQ,UAAU;AAC5C,UAAM,cAAc,iBAAiB,SAAS,KAAK;AACnD,QAAI,cAAc,OAAO;AACvB,aAAO,QAAQ,MAAM,OAAO,WAAW;AACvC,cAAQ;AACR;AAAA,IACF;AACA,UAAM,aAAa,iCAAiC,SAAS,KAAK;AAClE,QAAI,YAAY;AACd,aAAO,WAAW;AAClB,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,WAAO,QAAQ,KAAK;AACpB,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,iCACP,SACA,OAC0C;AAC1C,MAAI,QAAQ,KAAK,MAAM,IAAK,QAAO;AACnC,QAAM,WAAW,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AAC/C,MAAI,WAAW,KAAK,QAAQ,WAAW,CAAC,MAAM,IAAK,QAAO;AAC1D,QAAM,YAAY,WAAW;AAC7B,MAAI,QAAQ,SAAS,MAAM,IAAK,QAAO;AACvC,MAAI,UAAU;AACd,SAAO,UAAU,QAAQ,QAAQ;AAC/B,UAAM,UAAU,QAAQ,OAAO;AAC/B,QAAI,YAAY,QAAQ,UAAU,IAAI,QAAQ,QAAQ;AACpD,iBAAW;AACX;AAAA,IACF;AACA,QAAI,YAAY,QAAQ,YAAY,KAAM,QAAO;AACjD,QAAI,YAAY,IAAK;AACrB,eAAW;AAAA,EACb;AACA,MAAI,QAAQ,OAAO,MAAM,IAAK,QAAO;AACrC,QAAM,SAAS,QAAQ,MAAM,WAAW,OAAO,EAAE,KAAK;AACtD,MACE,CAAC,UACD,CAAC,KAAK,KAAK,MAAM,KACjB,OAAO,KAAK,MAAM,KAClB,CAAC,iCAAiC,MAAM,GACxC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,UAAU,GAAG,QAAQ,MAAM,OAAO,SAAS,CAAC,IAAI,MAAM;AAAA,IACtD,KAAK,UAAU;AAAA,EACjB;AACF;AAEA,SAAS,iCAAiC,MAAuB;AAC/D,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,CAAC,UAAU,OAAO,SAAS,KAAK,EAAG,QAAO;AAC9C,SACG,OAAO,WAAW,GAAG,KAAK,CAAC,OAAO,WAAW,IAAI,KAClD,OAAO,WAAW,IAAI,KACtB,OAAO,WAAW,KAAK,KACvB,kBAAkB,KAAK,MAAM;AAEjC;AAEO,SAAS,uCACd,SACQ;AACR,QAAM,UAAU,QAAQ,KAAK;AAC7B,MACE,YAAY,WACZ,CAAC,QAAQ,WAAW,GAAG,KACvB,QAAQ,SAAS,IAAI,KACrB,qBAAqB,SAAS,CAAC,MAAM,QAAQ,QAC7C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,8BAA8B,SAAyB;AACrE,SAAO,QACJ,QAAQ,2CAA2C,MAAM,EACzD,QAAQ,kDAAkD,UAAU;AACzE;AAEO,SAAS,6BAA6B,SAA0B;AACrE,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,qBAAqB,SAAS,CAAC,MAAM,QAAQ,QAAQ;AACvD,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,SAAO,sBAAsB,QAAQ,MAAM,WAAW,CAAC,CAAC;AAC1D;AAEO,SAAS,kCAAkC,SAAyB;AACzE,QAAM,UAAU,QAAQ,KAAK;AAC7B,MACE,YAAY,WACZ,CAAC,QAAQ,WAAW,GAAG,KACvB,QAAQ,SAAS,IAAI,GACrB;AACA,WAAO;AAAA,EACT;AAEA,aAAW,cAAc,oCAAoC;AAC3D,UAAM,YAAY,MAAM,UAAU;AAClC,UAAM,iBAAiB,QAAQ,QAAQ,SAAS;AAChD,QAAI,kBAAkB,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,MAAM,GAAG,cAAc,EAAE,KAAK;AACxD,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,QAAM,SAAS,MAAM,KAAK;AAC1B,SAAO,sBAAsB,MAAM,KACjC,4BAA4B,MAAM,KAClC,2BAA2B,MAAM,IAC/B,SACA,oBAAoB,KAAK;AAC/B;AAyBO,SAAS,iBACd,MACA,UACA,oBAAqE,CAAC,GACtE,eAA2D,qBAC3D,0BAA0B,cACA;AAC1B,QAAM,UAAUC,0BAAyB,MAAM,QAAQ;AACvD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,WAAW,KAAK,EAAE,YAAY;AACvD,QAAM,OACJ,aAAa,kBACT,YACA,aAAa,kBACX,kBACA,aAAa,wBACX,wBACA,aAAa,0BACX,0BACA,aAAa,oBACX,oBACA,aAAa,iBACX,iBACA,aAAa,gBACX,gBACA;AAClB,MACE,SAAS,aACT,SAAS,kBACT,SAAS,mBACT,SAAS,yBACT,SAAS,2BACT,SAAS,qBACT,SAAS,eACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,SAAS,KAAK;AACvC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,QACJ,SAAS,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK,MACvC,SAAS,0BAA0B,0BAA0B;AAChE,QAAM,WAAW;AAAA,IACf;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EAClD;AACA,MAAI,SAAS,eAAe;AAC1B,WAAO,EAAE,GAAG,UAAU,MAAM,MAAM;AAAA,EACpC;AACA,MAAI,SAAS,mBAAmB,SAAS,yBAAyB;AAChE,UAAM,QAAQ,SAAS,kBAAkB,WAAW;AACpD,UAAM,cAAc,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC1D,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,GAAI,SAAS,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAAA,MAC5C;AAAA,MACA,GAAI,SAAS,kBACT;AAAA,QACE,SAAS,kCAAkC;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,IACA,CAAC;AAAA,IACP;AAAA,EACF;AACA,MAAI,SAAS,gBAAgB;AAC3B,UAAM,cAAc,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC1D,UAAM,SAAS,+BAA+B;AAAA,MAC5C,eAAe;AAAA,MACf;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,kBAAkB,QAAQ,UAAU,KAAK,KAAK;AACpD,UAAM,cAAc,QAAQ,MAAM,KAAK,KAAK;AAC5C,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,SACE,QAAQ,SAAS,KAAK,KAAK,2BAA2B,eAAe;AAAA,IACzE;AAAA,EACF;AACA,MAAI,SAAS,WAAW;AACtB,UAAM,cAAc,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC1D,UAAM,gBAAgB,QAAQ,OAAO,eAAe,KAAK,KAAK;AAC9D,UAAM,SAAS,+BAA+B;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,gBAAgB,cAAc,WAAW,QAAQ,IACnD,cAAc,MAAM,SAAS,MAAM,EAAE,KAAK,IAC1C;AACJ,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,SACE,QAAQ,SAAS,KAAK,MACrB,gBAAgB,2BAA2B,aAAa,IAAI;AAAA,IACjE;AAAA,EACF;AACA,MAAI,SAAS,uBAAuB;AAClC,UAAM,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAK;AAChD,UAAM,cAAc,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC1D,UAAM,aACJ,WAAW,QACP,kCAAkC;AAAA,MAChC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC,IACD;AACN,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,OAAO,MAAM,KAAK,KAAK;AAAA,MACxC,WAAW,4BAA4B,QAAQ,OAAO,SAAS,IAAI;AAAA,MACnE,iBAAiB,UAAU;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,SAAS,mBAAmB;AAC9B,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,4BACd,OACoB;AACpB,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,SAAS,MAAM,KAAK,GAAG,EAAE;AAC/C,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEO,SAAS,kCAAkC,OAI3B;AACrB,QAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,cAAc,MAAM,YAAY,KAAK;AAC3C,QAAM,aAAa,MAAM,kBAAkB;AAAA,IACzC,CAAC,SACC,KAAK,MAAM,KAAK,MAAM,UACrB,KAAK,aAAa,KAAK,KAAK,QAAQ,eACrC,KAAK,SAAS,KAAK;AAAA,EACvB;AACA,QAAM,gBAAgB,MAAM,kBAAkB;AAAA,IAC5C,CAAC,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,KAAK;AAAA,EAC9D;AACA,SACE,YAAY,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,KAAK;AAErE;AAEO,SAAS,qBAAqB,SAAiB,OAAuB;AAC3E,MAAI,QAAQ,KAAK,MAAM,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AAC/C,MAAI,WAAW,KAAK,QAAQ,WAAW,CAAC,MAAM,KAAK;AACjD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,QAAQ,KAAK,WAAW,CAAC;AACjD,SAAO,UAAU,IAAI,KAAK,UAAU;AACtC;AAEO,SAAS,iBAAiB,SAAiB,OAAuB;AACvE,MAAI,QAAQ,KAAK,MAAM,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,YAAY;AAChB,SAAO,QAAQ,QAAQ,SAAS,MAAM,KAAK;AACzC,iBAAa;AAAA,EACf;AACA,QAAM,QAAQ,IAAI,OAAO,SAAS;AAClC,QAAM,MAAM,QAAQ,QAAQ,OAAO,QAAQ,SAAS;AACpD,SAAO,MAAM,IAAI,KAAK,MAAM;AAC9B;;;ACpmBA,SAAS,qBAAqB;AAEvB,IAAM,sBAAsB,cAAc,KAAK;;;ACFtD;AAAA,EACE;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIK;AACP,SAAS,OAAO,YAAY;AAaxB,cAqHA,YArHA;AARG,SAAS,aAAa;AAAA,EAC3B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA0C;AACxC;AACA,SACE,oBAAC,UAAM,GAAG,OAAO,WACd,UACH;AAEJ;AAEA,IAAM,8BAA6C;AAAA,EACjD,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;AAEA,IAAM,gCAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,oBAAoB;AACtB;AAEA,IAAM,2BAA0C;AAAA,EAC9C,QAAQ;AACV;AAEO,SAAS,sBAAsB;AAAA,EACpC,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwC;AACtC;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,GAAG,+BAA+B,GAAG,MAAM;AAAA;AAAA,EACtD;AAEJ;AAEO,SAAS,oBAAoB;AAAA,EAClC,MAAM;AAAA,EACN;AAAA,EACA,GAAG;AACL,GAAwC;AACtC;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,QACL,GAAG;AAAA,QACH,eAAe;AAAA,QACf,GAAG;AAAA,MACL;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B,MAAM;AAAA,EACN;AAAA,EACA,GAAG;AACL,GAAwC;AACtC;AACA,SAAO,oBAAC,QAAI,GAAG,OAAO,OAAO,EAAE,GAAG,0BAA0B,GAAG,MAAM,GAAG;AAC1E;AAEO,SAAS,kBAAkB;AAAA,EAChC,MAAM;AAAA,EACN;AAAA,EACA,GAAG;AACL,GAEgB;AACd;AACA,MAAI,QAAQ;AACV,WAAO,oBAAC,UAAM,GAAG,OAAO;AAAA,EAC1B;AACA,SAAO,oBAAC,OAAG,GAAG,OAAO;AACvB;AAEO,SAAS,kBAAkB,MAAyB;AACzD,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,WAAO,OAAO,IAAI;AAAA,EACpB;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,iBAAiB,EAAE,KAAK,EAAE;AAAA,EAC5C;AACA,SAAO;AACT;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAAyC;AACvC;AACA,QAAM,SAASC,QAAuB,IAAI;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,eAAeD,QAA6C,IAAI;AAEtE,QAAM,aAAa,YAAY,MAAM;AACnC,UAAM,OAAO,OAAO,SAAS,aAAa,KAAK;AAC/C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,SAAK,UAAU,WAAW,UAAU,IAAI,EAAE,KAAK,MAAM;AACnD,gBAAU,IAAI;AACd,UAAI,aAAa,SAAS;AACxB,qBAAa,aAAa,OAAO;AAAA,MACnC;AAEA,mBAAa,UAAU,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IAChE,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SACE,qBAAC,SAAI,WAAU,kBACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAU;AAAA,QACV,cAAY,UAAU,6BAA6B;AAAA,QACnD,OAAO,UAAU,6BAA6B;AAAA,QAC9C,SAAS;AAAA,QAER,mBACC,oBAAC,SAAM,MAAM,IAAI,aAAa,GAAG,eAAY,QAAO,IAEpD,oBAAC,QAAK,MAAM,IAAI,aAAa,GAAG,eAAY,QAAO;AAAA;AAAA,IAEvD;AAAA,IACA,oBAAC,SAAK,GAAG,OAAO,KAAK,QAClB,UACH;AAAA,KACF;AAEJ;;;AC9JA,SAAS,YAAY,aAAAE,YAAW,YAAAC,iBAA0B;;;ACA1D;AAAA,EAME,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe,YAAY,mBAAmB;;;ACrBvD;AAAA,EACE,eAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACJP,eAAe,kBAAkB,KAAmC;AAClE,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,OAAO;AACtB,SAAO,SAAS,OAAO;AACvB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ,GAAG,CAAC;AAC1B,SAAO,MAAM,IAAI;AAAA,IAAqB,CAAC,YACrC,OAAO,OAAO,CAAC,WAAW,QAAQ,MAAM,GAAG,WAAW;AAAA,EACxD;AACF;AAIA,eAAsB,aAAa,MAA6B;AAC9D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,UAAU,MAAM,OAAO,OAAO,SAAS,IAAI,MAAM,aAAa,CAAC;AACtE,WAAO,SAAS,MAAM;AACpB,YAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACnE,cAAQ,OAAO,SAAS,GAAG,IAAK,OAAO,MAAM,GAAG,EAAE,IAAI,KAAK,KAAM,MAAM;AAAA,IACzE;AACA,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,eAAe,KAA4B;AACxD,QAAM,OAAO,MAAM,kBAAkB,GAAG;AACxC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,eAAe,0BACb,MACkB;AAClB,MACE,OAAO,cAAc,eACrB,OAAO,UAAU,WAAW,UAAU,cACtC,OAAO,kBAAkB,aACzB;AACA,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,UAAU,UAAU,MAAM,CAAC,IAAI,cAAc,EAAE,aAAa,KAAK,CAAC,CAAC,CAAC;AAC1E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,qBACpB,KACA,eACkB;AAClB,MAAI;AACF,QAAI,CAAC,eAAe,YAAY;AAC9B,aAAO,MAAM,0BAA0B,eAAe,GAAG,CAAC;AAAA,IAC5D;AAEA,UAAM,OAAO,MAAM,kBAAkB,GAAG;AACxC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,cAAc,WAAW;AAAA,QAC7B,MAAM,MAAM,aAAa,IAAI;AAAA,QAC7B,UAAU;AAAA,MACZ,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AAAA,IAGR;AAEA,WAAO,0BAA0B,IAAI;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD9CI,SACE,OAAAC,MADF,QAAAC,aAAA;AAlCG,SAAS,6BAA6B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAcgB;AACd,QAAM,eAAe,wBAAwB;AAC7C,QAAM,iBAAiBC,QAAO,KAAK;AACnC,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAS,CAAC;AAClD,QAAM,eAAeC,aAAY,MAAM;AACrC,QAAI,eAAe,SAAS;AAC1B;AAAA,IACF;AACA,mBAAe,UAAU;AACzB,oBAAgB,CAAC,QAAQ,MAAM,CAAC;AAChC,SAAK,qBAAqB,KAAK,cAAc,SAAS,EAAE,QAAQ,MAAM;AACpE,qBAAe,UAAU;AAAA,IAC3B,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,WAAW,GAAG,CAAC;AACjC,SACE,gBAAAH,MAAC,eACC;AAAA,oBAAAD,KAAC,sBAAmB,SAAmB,UAAS;AAAA,IAChD,gBAAAA,KAAC,sBAAmB,OAAO,cACzB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,eAAe,CAAC,UAAU;AACxB,cAAI,MAAM,WAAW,GAAG;AACtB;AAAA,UACF;AACA,gBAAM,eAAe;AACrB,uBAAa;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QAET,oBAAU,8BAA8B;AAAA;AAAA,IAC3C,GACF;AAAA,OAhBgB,YAiBlB;AAEJ;;;AEvEO,SAAS,cAAc,KAAa,MAAoB;AAC7D,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,OAAK,MAAM;AACX,WAAS,KAAK,OAAO,IAAI;AACzB,OAAK,MAAM;AACX,OAAK,OAAO;AACd;AAEO,SAAS,yBACd,MACA,KACA,KACQ;AACR,QAAM,eACJ,qBAAqB,IAAI,KACzB,qBAAqB,GAAG,KACxB,qBAAqB,GAAG,KACxB;AACF,QAAM,YACJ,0BAA0B,IAAI,KAC9B,0BAA0B,GAAG,KAC7B,0BAA0B,GAAG,KAC7B;AACF,SAAO,GAAG,YAAY,IAAI,6BAA6B,oBAAI,KAAK,CAAC,CAAC,IAAI,2BAA2B,CAAC,IAAI,SAAS;AACjH;AAEA,SAAS,qBAAqB,OAAiD;AAC7E,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,QAAQ,wBAAwB,EAAE;AACvD,QAAM,YAAY,uBAAuB,IAAI,EAC1C,QAAQ,+BAA+B,GAAG,EAC1C,QAAQ,SAAS,GAAG,EACpB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,WAAW,EAAE,EACrB,MAAM,GAAG,EAAE;AACd,SAAO,aAAa;AACtB;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,MAAM,KAAK,KAAK,EACpB,OAAO,CAAC,SAAS,KAAK,WAAW,CAAC,KAAK,EAAE,EACzC,KAAK,EAAE;AACZ;AAEA,SAAS,0BACP,OACe;AACf,QAAM,UAAU,iBAAiB,KAAK;AACtC,QAAM,QAAQ,SAAS,MAAM,wBAAwB;AACrD,SAAO,QAAQ,CAAC,IAAI,wBAAwB,MAAM,CAAC,CAAC,IAAI;AAC1D;AAEA,SAAS,iBAAiB,OAAiD;AACzE,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,eAAe;AAAA,IACnB,QAAQ,MAAM,QAAQ,CAAC,EAAE,CAAC,KAAK;AAAA,EACjC;AACA,SAAO,aAAa,MAAM,OAAO,EAAE,IAAI,GAAG,KAAK,KAAK;AACtD;AAEA,SAAS,0BAA0B,KAAmC;AACpE,QAAM,QAAQ,KAAK,MAAM,qCAAqC;AAC9D,SAAO,QAAQ,CAAC,IAAI,wBAAwB,MAAM,CAAC,CAAC,IAAI;AAC1D;AAEA,SAAS,wBAAwB,WAA2B;AAC1D,QAAM,aAAa,UAAU,YAAY;AACzC,MAAI,eAAe,OAAQ,QAAO;AAClC,MAAI,eAAe,UAAW,QAAO;AACrC,SAAO,WAAW,QAAQ,eAAe,EAAE,KAAK;AAClD;AAEA,SAAS,6BAA6B,MAAoB;AACxD,QAAM,MAAM,CAAC,UAA0B,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AACpE,SAAO,GAAG,KAAK,YAAY,CAAC,GAAG,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC;AACzJ;AAEA,SAAS,6BAAqC;AAC5C,SAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG;AAC7D;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI;AACF,WAAO,mBAAmB,KAAK;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AH+HI,SAyDA,UAzDA,OAAAK,MA0DE,QAAAC,aA1DF;AAnLJ,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAEzB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,GAAoC;AAClC,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,eAAe,wBAAwB;AAC7C,QAAM,eACJ,OAAO,QAAQ,YAAY,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;AACvD,QAAM,kBAAkB,QAAQ,gBAAgB,iBAAiB,MAAS;AAC1E,QAAM,CAAC,qBAAqB,sBAAsB,IAAIC,UAI5C,IAAI;AACd,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAiC,IAAI;AACzE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,CAAC;AAC1D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,KAAK;AAClE,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,KAAK;AACxE,QAAM,0BAA0B,KAAK,MAAM,mBAAmB,GAAG;AACjE,QAAM,aAAa,mBAAmB;AACtC,QAAM,YAAY,mBAAmB;AAErC,QAAM,mBAAmBC,aAAY,MAAM;AACzC,2BAAuB,IAAI;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,0BAA0B,MAAY;AAC1C,0BAAsB,KAAK;AAC3B,6BAAyB,KAAK;AAC9B,sBAAkB,KAAK;AACvB,wBAAoB,CAAC;AAAA,EACvB;AAEA,QAAM,oBAAoB,MAAY;AACpC,QAAI,CAAC,oBAAoB;AACvB;AAAA,IACF;AACA,6BAAyB,IAAI;AAC7B,sBAAkB,KAAK;AACvB,wBAAoB,CAAC;AACrB,qBAAiB;AAAA,EACnB;AAEA,QAAM,mBAAmB,MAAY;AACnC,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,qBAAiB;AACjB,6BAAyB,KAAK;AAC9B,0BAAsB,IAAI;AAAA,EAC5B;AAEA,EAAAC,WAAU,MAAM;AACd,UAAM,sBAAsB,CAAC,UAA0C;AACrE,UAAI,CAAC,sBAAsB,MAAM,QAAQ,UAAU;AACjD;AAAA,MACF;AACA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,+BAAyB,IAAI;AAC7B,wBAAkB,KAAK;AACvB,0BAAoB,CAAC;AACrB,uBAAiB;AAAA,IACnB;AAEA,QAAI,qBAAqB;AACvB,eAAS,iBAAiB,SAAS,gBAAgB;AACnD,eAAS,iBAAiB,UAAU,kBAAkB,IAAI;AAAA,IAC5D;AACA,QAAI,oBAAoB;AACtB,aAAO,iBAAiB,WAAW,qBAAqB,IAAI;AAAA,IAC9D;AACA,WAAO,MAAM;AACX,eAAS,oBAAoB,SAAS,gBAAgB;AACtD,eAAS,oBAAoB,UAAU,kBAAkB,IAAI;AAC7D,aAAO,oBAAoB,WAAW,qBAAqB,IAAI;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,kBAAkB,qBAAqB,kBAAkB,CAAC;AAE9D,QAAM,oBAAoBD;AAAA,IACxB,CAAC,UAAyC;AACxC,sBAAgB,KAAqC;AACrD,UAAI,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,iBAAiB;AAC/D;AAAA,MACF;AACA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,6BAAuB;AAAA,QACrB,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,QACT,cAAc,QAAQ,MAAM,cAAc,QAAQ,kBAAkB,CAAC;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,IACA,CAAC,cAAc,iBAAiB,aAAa;AAAA,EAC/C;AAEA,QAAM,kBAAkBA,aAAY,YAA2B;AAC7D,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,UAAM,iBAAiB,EAAE,gBAAgB;AACzC,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,qBAAiB;AACjB,UAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,MAChC,qBAAqB,cAAc,cAAc,SAAS;AAAA,MAC1D,IAAI,QAAiB,CAAC,YAAY;AAChC,eAAO,WAAW,MAAM,QAAQ,KAAK,GAAG,GAAI;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AACD,UAAM,UAAU;AAAA,MACd,SAAS,qCAAqC;AAAA,IAChD;AACA,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA,SAAS,SAAS,YAAY;AAAA,IAChC,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,cAAc,WAAW,kBAAkB,CAAC,CAAC;AAE/D,QAAM,wBAAwBA,aAAY,MAAY;AACpD,SAAK,gBAAgB,EAAE,MAAM,MAAM,MAAS;AAAA,EAC9C,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,sBAAsBA,aAAY,MAAY;AAClD,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,qBAAiB;AACjB;AAAA,MACE;AAAA,MACA,yBAAyB,cAAc,cAAc,GAAG;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,cAAc,KAAK,kBAAkB,YAAY,CAAC;AACtD,QAAM,sBAAsBA,aAAY,MAAY;AAClD,sBAAkB,KAAK;AACvB;AAAA,MAAoB,CAAC,UACnB,6BAA6B,QAAQ,uBAAuB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,CAAC;AACL,QAAM,qBAAqBA,aAAY,MAAY;AACjD,sBAAkB,KAAK;AACvB;AAAA,MAAoB,CAAC,UACnB,6BAA6B,QAAQ,uBAAuB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,CAAC;AACL,QAAM,wBAAwBA,aAAY,MAAY;AACpD,sBAAkB,KAAK;AACvB,wBAAoB,CAAC;AAAA,EACvB,GAAG,CAAC,CAAC;AACL,QAAM,0BAA0BA;AAAA,IAC9B,CAAC,UAAyC;AACxC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,UAAI,MAAM,WAAW,GAAG;AACtB;AAAA,MACF;AACA,wBAAkB,IAAI;AACtB;AAAA,QAAoB,CAAC,UACnB,sBAAsB,QAAQ,KAAK,IAAI,GAAG,sBAAsB,KAAK,CAAC,CAAC;AAAA,MACzE;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,kBACpB,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,EAAE,kBAAkB;AAAA,MAC/B,eAAe,EAAE,sBAAsB;AAAA,MACvC,QAAQ;AAAA,MACR,YAAY;AAAA;AAAA,EACd,IACE;AAEJ,QAAM,gBACH,sBAAsB,0BAA0B,eAC/C,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,uBAAoB;AAAA,MACpB,uBAAqB,uBAAuB,gBAAgB;AAAA,MAC5D,WAAW;AAAA,MACX,KAAK;AAAA,MACL,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,MACvD,WAAU;AAAA,MACV,OAAO;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,YAAY,iBACR,SACA,4BAA4B,MAAS;AAAA,MAC3C;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,cAAM,gBAAgB;AACtB,0BAAkB;AAAA,MACpB;AAAA,MACA,eAAe,kBAAkB,oBAAoB;AAAA,MACrD,iBACE,wBAAwB,0BAA0B;AAAA,MAEpD,SAAS;AAAA;AAAA,EACX,IACE;AAEN,QAAM,iBACJ,gBAAgB,CAAC,iBAAiB,eAChC,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,SAAO;AAAA,MACP,cAAc,EAAE,QAAQ,0BAA0B;AAAA,MAEjD;AAAA;AAAA,EACH,IAEA;AAGJ,QAAM,UAAU;AAEhB,SACE,gBAAAC,MAAA,YACE;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,SAAS;AAAA,QAC3B;AAAA,QAEA;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACE,GAAG;AAAA,cACJ;AAAA,cACA;AAAA,cACA,SAAS,CAAC,UAAU;AAClB,sBAAM,UAAU,KAAK;AACrB,oBAAI,CAAC,MAAM,kBAAkB;AAC3B,mCAAiB;AAAA,gBACnB;AAAA,cACF;AAAA,cACA,eAAe,kBAAkB,oBAAoB;AAAA,cACrD,WAAW,GAAG,6CAA6C,SAAS;AAAA;AAAA,UACtE;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,EAAE,oBAAoB;AAAA,cAClC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,eAAe;AAAA;AAAA,UACjB;AAAA;AAAA;AAAA,IACF;AAAA,IACC,uBAAuB,CAAC,oBAAoB,gBAAgB,gBACzD;AAAA,MACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM,oBAAoB;AAAA,YAC1B,KAAK,oBAAoB;AAAA,UAC3B;AAAA,UACA,MAAK;AAAA,UACL,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAE1C,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,EAAE,kBAAkB;AAAA,cAC/B,eAAe,EAAE,sBAAsB;AAAA,cACvC,UAAS;AAAA,cACT,QAAQ;AAAA,cACR,YAAY;AAAA;AAAA,UACd;AAAA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX,IACA;AAAA,KACF,sBAAsB,0BAA0B,eAC9C;AAAA,MACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAS;AAAA,UACT,WAAU;AAAA,UACV,gBAAc,wBAAwB,SAAS;AAAA,UAC/C,0BAAwB,kBAAkB,SAAS;AAAA,UACnD,mBAAgB;AAAA,UAChB,MAAK;AAAA,UACL,UAAU;AAAA,UACV,gBAAgB,CAAC,UAAU;AACzB,gBACE,yBACA,MAAM,kBAAkB,MAAM,QAC9B;AACA,sCAAwB;AAAA,YAC1B;AAAA,UACF;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,2BAAwB;AAAA,gBACxB,SAAS;AAAA;AAAA,YACX;AAAA,YACA,gBAAAA,KAAC,SAAI,2BAAwB,QAAQ,0BAAe;AAAA,YACpD,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,SAAS;AAAA,gBACT,cAAc,EAAE,2BAA2B;AAAA,kBACzC,SAAS;AAAA,gBACX,CAAC;AAAA,gBACD,qBAAqB,CAAC;AAAA,gBACtB,YAAY,EAAE,uBAAuB;AAAA,gBACrC,aAAa,EAAE,oBAAoB;AAAA,gBACnC,cAAc,EAAE,qBAAqB;AAAA,gBACrC,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,SAAS;AAAA;AAAA,YACX;AAAA,YACA,gBAAAC,MAAC,SAAI,WAAU,+DACZ;AAAA;AAAA,cACD,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAY,EAAE,sBAAsB;AAAA,kBACpC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,OAAO,EAAE,sBAAsB;AAAA,kBAC/B,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,kBAChD,SAAQ;AAAA,kBACR,SAAS,CAAC,UAAU;AAClB,0BAAM,eAAe;AACrB,0BAAM,gBAAgB;AACtB,sCAAkB;AAAA,kBACpB;AAAA,kBAEA,0BAAAA,KAAC,eAAY,eAAY,QAAO,WAAU,UAAS;AAAA;AAAA,cACrD;AAAA,eACF;AAAA,YACC,qBAAqB,gBAAgB,gBACpC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,MAAM,oBAAoB;AAAA,kBAC1B,KAAK,oBAAoB;AAAA,gBAC3B;AAAA,gBACA,MAAK;AAAA,gBACL,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,gBAE1C,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,EAAE,kBAAkB;AAAA,oBAC/B,eAAe,EAAE,sBAAsB;AAAA,oBACvC,UAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,YAAY;AAAA;AAAA,gBACd;AAAA;AAAA,YACF,IACE;AAAA,YACH,aACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,WAAW;AAAA,gBACjB,SAAS,WAAW;AAAA,gBACpB,SAAS,WAAW;AAAA,gBACpB,cAAc,CAAC,SAAS;AACtB,sBAAI,CAAC,MAAM;AACT,kCAAc,IAAI;AAAA,kBACpB;AAAA,gBACF;AAAA;AAAA,YACF,IACE;AAAA;AAAA;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX,IACA;AAAA,IACH,cAAc,CAAC,qBACZ;AAAA,MACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,WAAW;AAAA,UACjB,SAAS,WAAW;AAAA,UACpB,SAAS,WAAW;AAAA,UACpB,cAAc,CAAC,SAAS;AACtB,gBAAI,CAAC,MAAM;AACT,4BAAc,IAAI;AAAA,YACpB;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX,IACA;AAAA,KACN;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKgB;AACd,SACE,gBAAAC,MAAC,iBAAc,UAAU,MAAM,gBAAe,SAC5C;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAI;AAAA,QACJ,QAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,8BAA2B;AAAA,QAC3B,OAAO,EAAE,QAAQ,OAAO;AAAA,QACxB;AAAA,QAEA,0BAAAA,KAAC,cAAY,mBAAQ;AAAA;AAAA,IACvB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,KAAK;AAAA,UACL,QAAQ;AAAA,QACV;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAagB;AACd,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,cAAY;AAAA,YACZ,UAAU,CAAC;AAAA,YACX,SAAS;AAAA,YAET,0BAAAA,KAAC,eAAY,eAAY,QAAO,WAAU,UAAS;AAAA;AAAA,QACrD;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,cAAY;AAAA,YACZ,MAAM,sBAAsB,WAAW;AAAA,YAEtC;AAAA;AAAA,cAAQ;AAAA;AAAA;AAAA,QACX;AAAA,QACA,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,cAAY;AAAA,YACZ,SAAS;AAAA,YAET,0BAAAA,KAAC,iBAAc,eAAY,QAAO,WAAU,UAAS;AAAA;AAAA,QACvD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,cAAY;AAAA,YACZ,UAAU,CAAC;AAAA,YACX,SAAS;AAAA,YAET,0BAAAA,KAAC,cAAW,eAAY,QAAO,WAAU,UAAS;AAAA;AAAA,QACpD;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMgB;AACd,MAAI,CAAC,UAAU;AACb,WACE,gBAAAC,MAAA,YACE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,cAAY;AAAA,UACZ,WAAU;AAAA,UACV,MAAK;AAAA,UACL,OAAO;AAAA,UACP,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAChD,SAAQ;AAAA,UACR,SAAS,CAAC,UAAU;AAClB,kBAAM,eAAe;AACrB,kBAAM,gBAAgB;AACtB,mBAAO;AAAA,UACT;AAAA,UAEA,0BAAAA,KAAC,YAAS,eAAY,QAAO,WAAU,UAAS;AAAA;AAAA,MAClD;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAY;AAAA,UACZ,WAAU;AAAA,UACV,MAAK;AAAA,UACL,OAAO;AAAA,UACP,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAChD,SAAQ;AAAA,UACR,SAAS,CAAC,UAAU;AAClB,kBAAM,eAAe;AACrB,kBAAM,gBAAgB;AACtB,uBAAW;AAAA,UACb;AAAA,UAEA,0BAAAA,KAAC,gBAAa,eAAY,QAAO,WAAU,UAAS;AAAA;AAAA,MACtD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAA,YACE;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAChD,SAAS,CAAC,UAAU;AAClB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,iBAAO;AAAA,QACT;AAAA,QAEA;AAAA,0BAAAD,KAAC,YAAS,eAAY,QAAO,WAAU,UAAS;AAAA,UAChD,gBAAAA,KAAC,UAAM,qBAAU;AAAA;AAAA;AAAA,IACnB;AAAA,IACA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAChD,SAAS,CAAC,UAAU;AAClB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,qBAAW;AAAA,QACb;AAAA,QAEA;AAAA,0BAAAD,KAAC,gBAAa,eAAY,QAAO,WAAU,UAAS;AAAA,UACpD,gBAAAA,KAAC,UAAM,yBAAc;AAAA;AAAA;AAAA,IACvB;AAAA,KACF;AAEJ;AAEA,SAAS,sBAAsB,OAAwC;AACrE,SACE,CAAC,MAAM,UACN,MAAM,cAAc,IAAI,OAAO,MAAM,YAAY,IAAI,SACrD,MAAM,UAAU,KAAK;AAE1B;AAEA,SAAS,4BACP,WACA,MACA,OACA,QAC4B;AAC5B,QAAM,gBAAgB,OAAO,cAAc,WAAW,UAAU,KAAK,IAAI;AACzE,QAAM,gBAAgB,iCAAiC,MAAM,OAAO,MAAM;AAC1E,MAAI,CAAC,eAAe;AAClB,WAAO,iBAAiB;AAAA,EAC1B;AACA,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,aAAa,IAAI,aAAa;AAC1C;AAEA,SAAS,iCACP,MACA,OACA,QACQ;AACR,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS,uBAAuB,IAAI,CAAC;AACnD,MAAI,UAAU,QAAQ,WAAW,MAAM;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,gBAAgB,QAAQ,CAAC;AAC3C,QAAM,aAAa,gBAAgB,SAAS,CAAC;AAC7C,SAAO,aAAa,SAAS,MAAM,UAAU,OAAO,KAAK,eAAe,SAAS,OAAO,UAAU;AACpG;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC,EAAE,SAAS;AAC3C;AAEA,SAAS,4BACP,YAC6B;AAC7B,QAAM,iBAAiB;AACvB,MAAI,OAAO,eAAe,YAAY,CAAC,WAAW,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AACA,SAAO,WAAW,SAAS,WAAW,IAClC,aACA,GAAG,UAAU,KAAK,cAAc;AACtC;AAEA,SAAS,6BAA6B,OAAuB;AAC3D,QAAM,UACJ,KAAK,MAAM,QAAQ,uBAAuB,IAAI;AAChD,SAAO,sBAAsB,OAAO;AACtC;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,wBAAwB,KAAK;AAAA,EACxC;AACF;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC,EAAE,SAAS;AAC3C;;;ADxrBA,SAAS,qBAAqB,6BAA6B;AAkI5C,gBAAAK,YAAA;AA7GR,SAAS,cAAc;AAAA,EAC5B,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,GAAG;AACL,GAEgB;AACd;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,eAAe,WAAW,mBAAmB;AACnD,QAAM,eAAe,wBAAwB,KAAK,wBAAwB;AAC1E,QAAM,gBACJ,OAAO,QAAQ,YAAY,oBAAoB,GAAG,IAAI,IAAI,KAAK,IAAI;AACrE,QAAM,qBAAqB,gBACvB,cAAc,WAAW,WACzB;AACJ,QAAM,wBAAwB,QAAQ,iBAAiB,kBAAkB;AACzE,QAAM,mBAAmB,cAAc,CAAC;AACxC,QAAM,oBACJ,OAAO,QAAQ,WAAW,yBAAyB,GAAG,IAAI;AAC5D,QAAM,cACJ,OAAO,QAAQ,WAAW,kCAAkC,GAAG,IAAI;AACrE,QAAM,CAAC,OAAO,QAAQ,IAAIC;AAAA,IAAoC,MAC5D,yBAAyB,gBACpB,6BAA6B,aAAa,KAAK,EAAE,QAAQ,UAAU,IACpE;AAAA,EACN;AAEA,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,oBAAoB;AACzC,eAAS,IAAI;AACb;AAAA,IACF;AAEA,UAAM,wBAAwB;AAC9B,UAAM,6BAA6B;AACnC,UAAM,SAAS,0BAA0B,qBAAqB;AAC9D,QAAI,QAAQ;AACV,eAAS,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAS,KAAK,OAAO,IAAI,CAAC;AAChE,aAAO,MAAM;AACX,mCAA2B,uBAAuB,OAAO,GAAG;AAAA,MAC9D;AAAA,IACF;AAEA,UAAM,YAAY,yBAAyB,qBAAqB;AAChE,QAAI,CAAC,WAAW;AACd,eAAS;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AACA,UAAM,YAAY,UAAU;AAC5B,UAAM,gBAAgB,UAAU;AAEhC,QAAI,WAAW;AACf,QAAI,YAA2B;AAC/B,aAAS,EAAE,QAAQ,UAAU,CAAC;AAE9B,mBAAe,qBAAoC;AACjD,UAAI;AACF,cAAM,SAAS,MAAM,2BAA2B;AAAA,UAC9C,MAAM;AAAA,QACR,CAAC;AACD,YAAI,UAAU;AACZ;AAAA,QACF;AACA,cAAM,QACJ,OAAO,iBAAiB,aACpB,OAAO,QACP,IAAI,WAAW,OAAO,KAAK;AACjC,cAAM,cAAc,MAAM,OAAO;AAAA,UAC/B,MAAM;AAAA,UACN,MAAM,aAAa,MAAM;AAAA,QAC3B;AACA,oBAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,MAAM,cAAc,CAAC;AAAA,QACjD;AACA,iBAAS,EAAE,MAAM,WAAW,QAAQ,SAAS,KAAK,UAAU,CAAC;AAAA,MAC/D,SAAS,OAAO;AACd,YAAI,CAAC,UAAU;AACb,mBAAS;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC/D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,SAAK,mBAAmB;AAExB,WAAO,MAAM;AACX,iBAAW;AACX,UAAI,WAAW;AACb,mCAA2B,uBAAuB,SAAS;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,uBAAuB,aAAa,CAAC;AAEzC,MAAI,CAAC,iBAAiB,CAAC,oBAAoB;AACzC,QAAI,sBAAsB,SAAS;AACjC,UAAI,CAAC,+BAA+B,GAAG,GAAG;AACxC,eAAO,gBAAAC,KAAC,mCAAgC;AAAA,MAC1C;AACA,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,cAAY,OAAO;AAAA,UACnB,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAQ;AAAA,UACR,aAAW;AAAA,UACX,SAAQ;AAAA,UACR,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,CAAC,kBAAkB;AACrB,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,cAAc,iCAAiC,KAAK,GAAG;AAAA,QACvD;AAAA,QACA,aAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AAEA,MAAI,OAAO,WAAW,SAAS;AAC7B,QAAI,MAAM,SAAS,SAAS;AAC1B,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,MAAM;AAAA,UACX,cAAY,OAAO;AAAA,UACnB,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,UAC3C,UAAQ;AAAA,UACR,aAAW;AAAA,UACX,SAAQ;AAAA,UACR,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,CAAC,kBAAkB;AACrB,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,KAAK,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,KAAK,MAAM;AAAA,QACX;AAAA,QACA;AAAA,QACA,cAAc,iCAAiC,eAAe,GAAG;AAAA,QACjE,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,aAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,UAAK,WAAU,mLACb,iBAAO,WAAW,UACf,MAAM,WAAW,gBACf,EAAE,mDAAmD,IACrD,EAAE,oDAAoD;AAAA,IACpD,SAAS,MAAM,UAAU;AAAA,EAC3B,CAAC,IACH,EAAE,+CAA+C,GACvD;AAEJ;AAEA,SAAS,kCAA+C;AACtD,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,SACE,gBAAAA,KAAC,UAAK,WAAU,mLACb,YAAE,mDAAmD,GACxD;AAEJ;AAEA,SAAS,iCACP,KACA,KACoB;AACpB,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,WAAW,sBAAsB,IAAI,KAAK,CAAC;AACjD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,OAAO,QAAQ,WAAW,IAAI,KAAK,KAAK,SAAY;AAC7D;;;AK/OA,IAAM,4BAA4B;AAQ3B,SAAS,gCAAgC;AAC9C,SAAO,CAAC,MAAe,SAAwB;AAC7C,QAAI,CAAC,eAAe,IAAI,GAAG;AACzB;AAAA,IACF;AACA,UAAM,SAAS,uBAAuB,IAAI;AAC1C,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AACA,sBAAkB,MAAM,MAAM;AAAA,EAChC;AACF;AAEA,SAAS,kBAAkB,QAAsB,QAAsB;AACrE,MAAI,CAAC,OAAO,UAAU;AACpB;AAAA,EACF;AAEA,WAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,QAAQ,SAAS,GAAG;AAC9D,UAAM,QAAQ,OAAO,SAAS,KAAK;AACnC,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,UAAM,QAAQ,qBAAqB,OAAO,MAAM;AAChD,QAAI,OAAO;AACT,aAAO,SAAS,OAAO,OAAO,GAAG,MAAM,MAAM,MAAM,QAAQ;AAC3D,eAAS;AACT;AAAA,IACF;AACA,sBAAkB,OAAO,MAAM;AAAA,EACjC;AACF;AAEA,SAAS,qBACP,MACA,QACsB;AACtB,QAAM,WAAW,KAAK,WAAW,CAAC;AAClC,MACE,KAAK,SAAS,UACd,OAAO,KAAK,QAAQ,YACpB,KAAK,UAAU,WAAW,KAC1B,UAAU,SAAS,UACnB,OAAO,SAAS,UAAU,YAC1B,CAAC,KAAK,UACN;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,cAAc,KAAK,SAAS,MAAM;AACxC,QAAM,YAAY,KAAK,SAAS,IAAI;AACpC,MACE,gBAAgB,UAChB,cAAc,UACd,OAAO,MAAM,aAAa,SAAS,MAAM,SACzC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,QAAQ,OAAO,yBAAyB;AAC9D,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,MAAM,GAAG,aAAa;AACjD,QAAM,eAAe,QAAQ,MAAM,aAAa;AAChD,MAAI,CAAC,KAAK,IAAI,SAAS,YAAY,GAAG;AACpC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,IAAI,MAAM,GAAG,CAAC,aAAa,MAAM;AACxD,MAAI,CAAC,UAAU,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,aAAa,KAAK,SAAS,OAAO,WAAW,MAAM;AACzE,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,GAAG;AAAA,MACH,KAAK;AAAA,MACL,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,KAAK;AAAA,MACP;AAAA,MACA,UAAU;AAAA,QACR;AAAA,UACE,GAAG;AAAA,UACH,OAAO;AAAA,UACP,UAAU,SAAS,WACf;AAAA,YACE,OAAO,SAAS,SAAS;AAAA,YACzB,KAAK;AAAA,UACP,IACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,OAAO;AAAA,QACP,KAAK,KAAK,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAwB;AACzC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,IAAI,aAAa,WAAW,IAAI,aAAa;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,OAAsB,YAAmC;AAC7E,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM,SAAS;AAAA,IACvB,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,SAAS,WAAW;AAAA,EAC5E;AACF;AAEA,SAAS,uBAAuB,MAA8B;AAC5D,MACE,OAAO,SAAS,YAChB,SAAS,QACT,EAAE,WAAW,SACb,OAAO,KAAK,UAAU,UACtB;AACA,WAAO;AAAA,EACT;AACA,SAAO,KAAK;AACd;AAEA,SAAS,eAAe,OAAuC;AAC7D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAO,MAAM,SAAS;AAE1B;;;ACnKO,SAAS,qBAEd,SACM;AACN,MAAI,OAAO,KAAK,WAAW,YAAY;AACrC;AAAA,EACF;AACA,QAAM,QAAQ,KAAK;AACnB,OAAK,SAAS,IAAI,SAChB;AAAA,IACE,wBAAwB;AAAA,MACtB,WAAW;AAAA,MACX,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IACtC,CAAC;AAAA,EACH;AACJ;;;Af6NQ,SA2GJ,YAAAC,WA3GI,OAAAC,MA6BJ,QAAAC,aA7BI;AAnLR,IAAM,8BAA8B;AACpC,IAAM,0CAA0C;AAChD,IAAM,sCAAsC;AAC5C,IAAMC,oCAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,+BACJ,uDAAuD,MAAM,EAAE;AAIjE,IAAM,2BAAkD;AAAA,EACtD,GAAG;AAAA,EACH,WAAW;AAAA,IACT,GAAG,cAAc;AAAA,IACjB,MAAM;AAAA,MACJ,GAAI,cAAc,WAAW,QAAQ,CAAC;AAAA,MACtC;AAAA,MACA,GAAGC;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AACF;AA+BA,IAAM,4BACJ,CAAC;AACH,IAAMC,uBAAkE,CAAC;AAclE,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,kCAAkC;AAAA,EAClC,kBAAkB;AAAA,EAClB,YAAY;AACd,GAA2C;AACzC;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,sBAAsB,4BAA4B;AACxD,QAAM,wBAAwB,gBAAgB;AAC9C,QAAM,iBAAiB,wBAAwB,SAAS;AAAA,IACtD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,EACtB,CAAC;AACD,QAAM,oBAAoB;AAAA,IACxB,MACE,+BAA+B,gBAAgB;AAAA,MAC7C;AAAA,IACF,CAAC,EAAE;AAAA,IACL,CAAC,WAAW,cAAc;AAAA,EAC5B;AACA,QAAM,gBAAgB,sBAAsB,iBAAiB;AAC7D,QAAM,WAAW,sBAAsB,YAAY;AACnD,QAAM,sBAAsB,sBAAsB,UAAU;AAC5D,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,KAAK;AAClD,QAAM,sBACJ,eAAe,EAAE,uCAAuC;AAC1D,QAAM,iBACJ,eAAe,4BAA4B,iBAAiB;AAC9D,QAAM,cAAc,kBAAkB,CAAC;AACvC,QAAM,eAAe,SAAS,SAAS;AACvC,QAAM,oBAAoB;AAAA,IACxB,MACE;AAAA,MACE;AAAA,QACE,kCACI;AAAA,UACE,kCAAkC,iBAAiB;AAAA,QACrD,IACA,kCAAkC,iBAAiB;AAAA,MACzD;AAAA,IACF;AAAA,IACF,CAAC,iCAAiC,iBAAiB;AAAA,EACrD;AACA,QAAM,uBAAuB;AAAA,IAC3B,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,UACE,UAAU,kBAAkB,KAAK,KAAK;AAAA,UACtC,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,iBAAiB;AAAA,EACtC;AACA,QAAM,gBAAgB,6BAA6B,iBAAiB;AACpE,QAAM,kBAAkBC;AAAA,IACtB,CAAC,SAAuB;AACtB,UAAI,uBAAuB,iBAAiB,iBAAiB,WAAW;AACtE,cAAM,SAAS,2BAA2B;AAAA,UACxC;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AACD,YAAI,QAAQ;AACV,uBAAa,MAAM;AACnB;AAAA,QACF;AAAA,MACF;AACA,oBAAc,IAAI;AAAA,IACpB;AAAA,IACA,CAAC,UAAU,cAAc,aAAa,qBAAqB,aAAa;AAAA,EAC1E;AACA,QAAM,2BAA2BA;AAAA,IAC/B,CAAC,UAAyC;AACxC,YAAM,OAAO,0BAA0B,MAAM,MAAM;AACnD,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AACA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,sBAAgB,IAAI;AAAA,IACtB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AACA,QAAM,qBAAqB;AAAA,IACzB,OAAO;AAAA,MACL,GAAG,CAAC,UACF,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,aAAa;AAAA,UACb;AAAA,UACA,cAAc;AAAA;AAAA,MAChB;AAAA,MAEF,MAAM,CAAC,UAAoC,gBAAAA,KAAC,gBAAc,GAAG,OAAO;AAAA,MACpE,KAAK,CAAC,UACJ,gBAAAA,KAAC,iBAAe,GAAG,OAAO,YAAY,iBAAiB;AAAA,MAEzD,GAAG,CAAC,UACF,gBAAAA,KAAC,qBAAmB,GAAG,OAAO,QAAgB;AAAA,MAEhD,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,KAAK;AAAA,IACP;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,uCAAoC;AAAA,MAEpC;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,UACE;AAAA,cACF,kBACE;AAAA,cACF,eACE;AAAA,cACF,kBAAkB,CAAC,eAAe;AAAA,cAClC;AAAA,YACF;AAAA,YACA,iCAA8B;AAAA,YAC9B,2BAAyB,gBAAgB,SAAS;AAAA,YAClD,kBAAgB,cAAc,SAAS;AAAA,YACvC,gBAAgB;AAAA,YAEf,sBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,YAAY;AAAA;AAAA,YACd,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAe;AAAA,gBACf,eAAe,CAAC,CAAC,gBAAgB,wBAAwB,CAAC;AAAA,gBAC1D,cAAc;AAAA,gBACd,YAAY;AAAA,gBAEX;AAAA;AAAA,YACH;AAAA;AAAA,QAEJ;AAAA,QACC,kBAAkB,CAAC,aAClB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,IAAI;AAAA,YAEhC;AAAA;AAAA,QACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AACF,GAGgB;AACd,QAAM,SAAS;AAAA,IACb,MAAM,6BAA6B,OAAO;AAAA,IAC1C,CAAC,OAAO;AAAA,EACV;AACA,SACE,gBAAAA,KAAAE,WAAA,EACG,iBAAO,IAAI,CAAC,OAAO,UAClB,gBAAAF;AAAA,IAAC;AAAA;AAAA,MAEC,SAAS,MAAM;AAAA,MACf;AAAA;AAAA,IAFK,GAAG,KAAK,IAAI,4BAA4B,MAAM,iBAAiB,CAAC;AAAA,EAGvE,CACD,GACH;AAEJ;AAEA,IAAM,wBAAwB,KAAK,SAASG,uBAAsB;AAAA,EAChE;AAAA,EACA;AACF,GAGgB;AACd,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,eAAe,CAAC,WAAW,6BAA6B;AAAA,MACxD,eAAe,CAAC,CAAC,gBAAgB,wBAAwB,CAAC;AAAA,MAC1D,cAAc;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,SAAS,aAAa;AAAA,EACpB,MAAM;AAAA,EACN,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIgB;AACd;AACA,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,aAAa,MAAM,KAAK,KAAK;AACnC,QAAM,UAAU,aACZ;AAAA,IACE;AAAA,IACA,kBAAkB,MAAM,QAAQ;AAAA,IAChC,qBAAqB,CAAC;AAAA,IACtB,gBAAgBH;AAAA,IAChB,EAAE,uDAAuD;AAAA,EAC3D,IACA;AACJ,MAAI,SAAS;AACX,WACE,gBAAAG;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,QAAM,cAAc,aAChB;AAAA,IACE;AAAA,IACA,kBAAkB,MAAM,QAAQ;AAAA,EAClC,IACA;AACJ,MAAI,aAAa;AACf,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,MAAI,CAAC,wBAAwB,UAAU,GAAG;AACxC,WACE,gBAAAA,KAAC,oBAAoB,UAApB,EAA6B,OAAO,MACnC,0BAAAA,KAAC,UAAK,WAAW,MAAM,WAAW,OAAO,MAAM,OAC5C,gBAAM,UACT,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,oBAAoB,UAApB,EAA6B,OAAO,MACnC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,wBAAsB;AAAA,MACtB,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS,CAAC,UAAU;AAClB,6BAAqB,OAAO,YAAY,WAAW;AAAA,MACrD;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,wCAAgC,OAAO,YAAY,WAAW;AAAA,MAChE;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,oCAA4B,OAAO,YAAY,WAAW;AAAA,MAC5D;AAAA;AAAA,EACF,GACF;AAEJ;AAcA,SAAS,gCACP,MACyC;AACzC,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,QAAQ,mBAAmB;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,oBACJ,IAAI,aAAa,IAAI,MAAM,KAC3B,IAAI,aAAa,IAAI,SAAS,KAC9B,IAAI,aAAa,IAAI,WAAW,KAChC;AACF,QAAM,iBAAiB,kBAAkB,KAAK,EAAE,YAAY;AAC5D,QAAM,eACJ,mBAAmB,YAAY,mBAAmB,cAC9C,cACA,mBAAmB,SACjB,SACA;AACR,QAAM,OAAO,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAC5C,MAAI,CAAC,QAAQ,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,cACE,iBAAiB,IAAI,SAAS,SAAS,GAAG,IAAI,cAAc;AAAA,EAChE;AACF;AAEA,SAAS,qCACP,MACA,OACA,cACsB;AACtB,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AACA,MAAI,8BAA8B,IAAI,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAMI,YAAWC,uBAAsB,IAAI;AAC3C,SAAOD,cAAa,QAAQ,cAAc;AAC5C;AAEA,SAAS,8BACP,MACA,UACuC;AACvC,QAAM,QAAQ,SAAS,KAAK;AAC5B,QAAM,SAAS,gCAAgC,IAAI;AACnD,MAAI,CAAC,UAAU,CAAC,MAAM,WAAW,GAAG,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,MAAM,QAAQ,OAAO,EAAE,EAAE,KAAK;AAChD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM,OAAO;AAAA,IACb;AAAA,IACA,YAAY,oCAAoC,OAAO,MAAM;AAAA,MAC3D,SAAS,cAAc,cAAc,WAAW;AAAA,IAClD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,yBAAyB;AAAA,EAChC,SAAS;AAAA,EACT;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA,GAAG;AACL,GAIgB;AACd;AACA,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,2BAAwB;AAAA,MACxB,2BAAwB;AAAA,MACxB,8BAA4B,QAAQ;AAAA,MACpC,+BAA6B,QAAQ;AAAA,MACrC,wBAAsB,QAAQ;AAAA,MAC9B,2BAAyB,QAAQ;AAAA,MACjC,cAAY,QAAQ;AAAA,MACpB,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS,CAAC,UAAU;AAClB,6BAAqB,OAAO,QAAQ,MAAM,WAAW;AAAA,MACvD;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,wCAAgC,OAAO,QAAQ,MAAM,WAAW;AAAA,MAClE;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,oCAA4B,OAAO,QAAQ,MAAM,WAAW;AAAA,MAC9D;AAAA,MAEA;AAAA,wBAAAD,KAAC,UAAK,WAAU,gCAA+B,eAAY,QAAO;AAAA,QAClE,gBAAAA,KAAC,UAAK,WAAU,gCAAgC,kBAAQ,OAAM;AAAA;AAAA;AAAA,EAChE;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIgB;AACd;AACA,QAAM,WAAW,2BAA2B;AAAA,IAC1C,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,EACjB,CAAC;AACD,QAAM,WAAW,SAAS,UAAU,UAAU,SAAS,WAAW;AAClE,QAAM,QAAQ,UAAU,OAAO,KAAK,KAAK,QAAQ;AACjD,QAAM,eAAe,UAAU;AAC/B,QAAM,UACJ,cAAc,SAAS,KAAK,KAC5B,cAAc,cAAc,KAAK,KACjC,cAAc,cAAc,KAAK,KACjC,QAAQ;AACV,QAAM,WACJ,QAAQ,SAAS,qBAAqB,QAAQ,oBAAoB,SAC9D,UACA,QAAQ,SAAS,aAAa,QAAQ,SAAS,iBAC7C,YACA,QAAQ,SAAS,gBACf,SACA;AACV,QAAM,kBAAkB,QAAQ,SAAS;AAEzC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,2BAAwB;AAAA,MACxB,wBAAsB;AAAA,MACtB,+BAA6B;AAAA,MAC7B,2BAAyB;AAAA,MACzB,2BAAyB,QAAQ;AAAA,MACjC,+BAA6B,QAAQ;AAAA,MACrC,cAAY;AAAA,MACZ,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS,CAAC,UAAU;AAClB,6BAAqB,OAAO,MAAM,WAAW;AAAA,MAC/C;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,wCAAgC,OAAO,MAAM,WAAW;AAAA,MAC1D;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,oCAA4B,OAAO,MAAM,WAAW;AAAA,MACtD;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA,oBAAoB;AAAA,YAClB,WAAW;AAAA,YACX,+BAA+B,kBAAkB,SAAY;AAAA,YAC7D,mCAAmC,kBAC/B,SACA;AAAA,YACJ,2BAA2B,kBAAkB,SAAY;AAAA,UAC3D;AAAA,UACA,mBAAmB;AAAA,YACjB,oCAAoC;AAAA,UACtC;AAAA,UACA,MAAM;AAAA,UACN,OAAO,gBAAAA,KAAC,UAAK,WAAU,gCAAgC,iBAAM;AAAA,UAC7D,WAAW;AAAA,UACX,gBAAc;AAAA,UACd,qBAAmB;AAAA;AAAA,MACrB;AAAA;AAAA,EACF;AAEJ;;;AgBrrBA;AAAA,EACE;AAAA,EACA,eAAAM;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAMK;AAyOD,gBAAAC,MA6CF,QAAAC,aA7CE;AAtON,IAAM,mBAAmB;AAwBlB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C;AACA,QAAM,WAAWC,QAA8B,IAAI;AACnD,QAAM,eAAeA,QAAkC,IAAI;AAC3D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAyB;AAAA,IACnE,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAE9C,QAAM,qBAAqBC,aAAY,MAAM;AAC3C,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,UAAU;AACb,wBAAkB,EAAE,YAAY,OAAO,aAAa,GAAG,UAAU,EAAE,CAAC;AACpE;AAAA,IACF;AAEA,UAAM,EAAE,cAAc,cAAc,UAAU,IAAI;AAClD,UAAM,cAAc,SAAS,SAAS,gBAAgB;AACtD,UAAM,eAAe,KAAK,IAAI,GAAG,eAAe,YAAY;AAC5D,QAAI,gBAAgB,KAAK,eAAe,KAAK,gBAAgB,GAAG;AAC9D,wBAAkB,EAAE,YAAY,OAAO,aAAa,GAAG,UAAU,EAAE,CAAC;AACpE;AAAA,IACF;AAEA,UAAM,cAAc,KAAK;AAAA,MACvB;AAAA,MACA,KAAK,MAAO,eAAe,eAAgB,WAAW;AAAA,IACxD;AACA,UAAM,cAAc,KAAK,IAAI,GAAG,cAAc,WAAW;AACzD,UAAM,WAAW,KAAK,MAAO,YAAY,eAAgB,WAAW;AACpE;AAAA,MAAkB,CAAC,aACjB,SAAS,cACT,SAAS,gBAAgB,eACzB,SAAS,aAAa,WAClB,WACA,EAAE,YAAY,MAAM,aAAa,SAAS;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,2BAA2BA;AAAA,IAC/B,CAAC,aAAqB;AACpB,YAAM,WAAW,YAAY;AAC7B,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,YAAY,CAAC,OAAO;AACvB;AAAA,MACF;AAEA,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,QACA,SAAS,eAAe,SAAS;AAAA,MACnC;AACA,YAAM,cAAc,KAAK;AAAA,QACvB;AAAA,QACA,MAAM,eAAe,eAAe;AAAA,MACtC;AACA,UAAI,gBAAgB,KAAK,eAAe,GAAG;AACzC;AAAA,MACF;AAEA,eAAS,YACN,MAAM,UAAU,GAAG,WAAW,IAAI,cAAe;AACpD,yBAAmB;AAAA,IACrB;AAAA,IACA,CAAC,aAAa,eAAe,aAAa,kBAAkB;AAAA,EAC9D;AAEA,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,UAA2C;AAC1C,UAAI,MAAM,WAAW,KAAK,CAAC,eAAe,YAAY;AACpD;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,YAAM,YAAY,MAAM,sBAAsB;AAC9C;AAAA,QACE,MAAM,UAAU,UAAU,MAAM,eAAe,cAAc;AAAA,MAC/D;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,UAA2C;AAC1C,UAAI,MAAM,WAAW,KAAK,CAAC,eAAe,YAAY;AACpD;AAAA,MACF;AAEA,YAAM,WAAW,YAAY;AAC7B,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,YAAY,CAAC,OAAO;AACvB;AAAA,MACF;AAEA,YAAM,eAAe,KAAK;AAAA,QACxB;AAAA,QACA,SAAS,eAAe,SAAS;AAAA,MACnC;AACA,YAAM,cAAc,KAAK;AAAA,QACvB;AAAA,QACA,MAAM,eAAe,eAAe;AAAA,MACtC;AACA,UAAI,gBAAgB,KAAK,eAAe,GAAG;AACzC;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,mBAAa,UAAU;AAAA,QACrB;AAAA,QACA;AAAA,QACA,cAAc,MAAM;AAAA,QACpB,gBAAgB,SAAS;AAAA,MAC3B;AACA,kBAAY,IAAI;AAAA,IAClB;AAAA,IACA,CAAC,aAAa,eAAe,YAAY,eAAe,WAAW;AAAA,EACrE;AAEA,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,kBAAkB,CAAC,UAA4B;AACnD,YAAM,YAAY,aAAa;AAC/B,YAAM,WAAW,YAAY;AAC7B,UAAI,CAAC,aAAa,CAAC,UAAU;AAC3B;AAAA,MACF;AAEA,YAAM,eACH,UAAU,iBAAiB,UAAU,eACpC,UAAU,eACX,MAAM,UAAU,UAAU;AAC7B,eAAS,YACN,MAAM,cAAc,GAAG,UAAU,WAAW,IAC3C,UAAU,cACZ,UAAU;AACZ,yBAAmB;AAAA,IACrB;AAEA,UAAM,gBAAgB,MAAY;AAChC,mBAAa,UAAU;AACvB,kBAAY,KAAK;AAAA,IACnB;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM;AACX,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,UAAU,aAAa,kBAAkB,CAAC;AAE9C,EAAAA,WAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,UAAU;AACb,wBAAkB,EAAE,YAAY,OAAO,aAAa,GAAG,UAAU,EAAE,CAAC;AACpE;AAAA,IACF;AAEA,uBAAmB;AACnB,aAAS,iBAAiB,UAAU,oBAAoB,EAAE,SAAS,KAAK,CAAC;AACzE,UAAM,iBACJ,OAAO,mBAAmB,cACtB,IAAI,eAAe,kBAAkB,IACrC;AACN,oBAAgB,QAAQ,QAAQ;AAChC,UAAM,mBAAmB,OAAO,sBAAsB,kBAAkB;AAExE,WAAO,MAAM;AACX,aAAO,qBAAqB,gBAAgB;AAC5C,eAAS,oBAAoB,UAAU,kBAAkB;AACzD,sBAAgB,WAAW;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,aAAa,SAAS,kBAAkB,CAAC;AAE7C,SACE,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,wBAAwB,SAAS;AAAA,MAC/C,mBAAiB,eAAe,aAAa,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS;AAAA,MACnC,eAAa;AAAA,MACb,eAAY;AAAA,MACZ,aAAa;AAAA,MAEb,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,+BAA+B,cAAc;AAAA,UAC3D,eAAa;AAAA,UACb,aAAa;AAAA,UACb,OAAO;AAAA,YACL,QAAQ,GAAG,eAAe,WAAW;AAAA,YACrC,WAAW,cAAc,eAAe,QAAQ;AAAA,UAClD;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAYO,IAAM,mBAAmB,WAG9B,SAASM,kBACT;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,cACmB;AACnB;AACA,QAAM,cAAcJ,QAA8B,IAAI;AACtD,QAAM,cAAcE,aAAY,MAAM,YAAY,SAAS,CAAC,CAAC;AAE7D,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,QAAQ,aAAa,YAAY;AAAA,YACtC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW;AAAA,YACX,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,SAAS,WAAW;AAAA;AAAA,QACtB;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,SAAS,QACP,UACA,cAC0B;AAC1B,SAAO,CAAC,SAAS;AACf,aAAS,UAAU;AACnB,QAAI,OAAO,iBAAiB,YAAY;AACtC,mBAAa,IAAI;AAAA,IACnB,WAAW,cAAc;AACvB,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;;;AC1UA;AAAA,EACE,cAAAO;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AA+HC,SAWE,OAAAC,MAXF,QAAAC,aAAA;AAlHR,IAAM,iBAAiB;AAAA,EACrB,OAAO,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC5C,UAAU;AACZ;AAEA,IAAM,eAAyB;AAAA,EAC7B,QAAQ;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS,CAAC,YAAoB;AAAA,IAC5B,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,IAChC,YAAY;AAAA,MACV,SAAS;AAAA,QACP,GAAG;AAAA,QACH,OAAO,eAAe,MAAM;AAAA,UAAI,CAAC,MAAM,UACrC,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,IACnD,OAAO,SAAS,MAChB;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,YAAoB;AAAA,IAC3B,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,IAChC,YAAY;AAAA,MACV,SAAS;AAAA,QACP,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,OAAO,eAAe,MAAM;AAAA,UAAI,CAAC,MAAM,UACrC,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,IACnD,OAAO,SAAS,MAChB;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwBC;AAAA,EAI5B,CACE;AAAA,IACE,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,WAAW,aAAa;AAC9B,UAAM,eAAe,iBAAiB;AACtC,UAAM,kBAAkBC,QAAO,KAAK;AAEpC,UAAM,iBAAiBC,aAAY,MAAM;AACvC,UAAI,cAAc;AAChB;AAAA,MACF;AACA,WAAK,SAAS,MAAM,SAAS,WAAW,SAAS;AAAA,IACnD,GAAG,CAAC,QAAQ,UAAU,YAAY,CAAC;AAEnC,UAAM,gBAAgBA,aAAY,MAAM;AACtC,WAAK,SAAS,MAAM,QAAQ;AAAA,IAC9B,GAAG,CAAC,QAAQ,CAAC;AAEb,wBAAoB,KAAK,MAAM;AAC7B,sBAAgB,UAAU;AAE1B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,IAAAC,WAAU,MAAM;AACd,UAAI,QAAQ;AACV,uBAAe;AACf;AAAA,MACF;AACA,oBAAc;AAAA,IAChB,GAAG,CAAC,QAAQ,gBAAgB,aAAa,CAAC;AAE1C,UAAM,mBAAmBD;AAAA,MACvB,CAAC,UAAsC;AACrC,YAAI,gBAAgB,SAAS;AAC3B,yBAAe,KAAK;AAAA,QACtB,OAAO;AACL,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,CAAC,cAAc,cAAc;AAAA,IAC/B;AAEA,UAAM,mBAAmBA;AAAA,MACvB,CAAC,UAAsC;AACrC,YAAI,gBAAgB,SAAS;AAC3B,yBAAe,KAAK;AAAA,QACtB,OAAO;AACL,wBAAc;AAAA,QAChB;AAAA,MACF;AAAA,MACA,CAAC,cAAc,aAAa;AAAA,IAC9B;AAEA,WACE,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,2CAA2C,SAAS;AAAA,QAClE,cAAc;AAAA,QACd,cAAc;AAAA,QACb,GAAG;AAAA,QAEJ,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAQ;AAAA,YACR,QAAO;AAAA,YACP,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAY;AAAA,YACZ,SAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAM;AAAA,YAEN;AAAA,8BAAAD,KAAC,UAAK,GAAE,iEAAgE;AAAA,cACxE,gBAAAA;AAAA,gBAAC,OAAO;AAAA,gBAAP;AAAA,kBACC,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,GAAE;AAAA,kBACF,UAAU;AAAA;AAAA,cACZ;AAAA,cACA,gBAAAA;AAAA,gBAAC,OAAO;AAAA,gBAAP;AAAA,kBACC,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,GAAE;AAAA,kBACF,UAAU;AAAA;AAAA,cACZ;AAAA,cACA,gBAAAA;AAAA,gBAAC,OAAO;AAAA,gBAAP;AAAA,kBACC,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,GAAE;AAAA,kBACF,UAAU;AAAA;AAAA,cACZ;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,sBAAsB,cAAc;;;AClLpC,IAAM,SAAS;AAAA,EACb,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,8BACE;AAAA,EACF,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,2BACE;AAAA,EACF,0BACE;AAAA,EACF,0BACE;AAAA,EACF,yBAAyB;AAAA,EACzB,0BACE;AAAA,EACF,wBAAwB;AAAA,EACxB,8BACE;AAAA,EACF,qCACE;AAAA,EACF,iCACE;AAAA,EACF,2BACE;AAAA,EACF,0BACE;AAAA,EACF,6BACE;AAAA,EACF,2BACE;AAAA,EACF,+BACE;AAAA,EACF,yBAAyB;AAAA,EACzB,0BACE;AAAA,EACF,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,0BACE;AAAA,EACF,0BACE;AAAA,EACF,iBAAiB;AAAA,EACjB,2BACE;AAAA,EACF,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB;AAEA,IAAO,sCAAQ;","names":["stringValue","arrayValue","objectValue","stringValue","useCallback","useState","basenameWorkspacePath","label","parseRichTextMentionHref","isWindowsAbsolutePath","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","basename","basenameWorkspacePath","useCallback","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useEffect","CustomScrollArea","forwardRef","useCallback","useEffect","useRef","jsx","jsxs","forwardRef","useRef","useCallback","useEffect"]}
|