@tutti-os/agent-gui 0.0.33 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +5 -0
  2. package/dist/{AgentMessageMarkdown-Cp70W-Z2.d.ts → AgentMessageMarkdown-0sV8Biv3.d.ts} +53 -5
  3. package/dist/agent-conversation/index.d.ts +4 -4
  4. package/dist/agent-conversation/index.js +5 -5
  5. package/dist/agent-message-center/index.d.ts +2 -2
  6. package/dist/agent-message-center/index.js +29 -8
  7. package/dist/agent-message-center/index.js.map +1 -1
  8. package/dist/{agentConversationVM-BElW2LNR.d.ts → agentConversationVM-xuzmD5IL.d.ts} +2 -0
  9. package/dist/app/renderer/agentactivity.css +54 -128
  10. package/dist/{chunk-SGQ4C7JE.js → chunk-2ADVHCST.js} +2 -1
  11. package/dist/chunk-2ADVHCST.js.map +1 -0
  12. package/dist/{chunk-WPWZKKKV.js → chunk-3LEUGNCT.js} +2 -2
  13. package/dist/{chunk-AFTAFV2C.js → chunk-CMXRLF64.js} +85 -13
  14. package/dist/chunk-CMXRLF64.js.map +1 -0
  15. package/dist/{chunk-RDCBACWR.js → chunk-JYH2ITNL.js} +5 -5
  16. package/dist/{chunk-RQ3HEF42.js → chunk-KFMD33UD.js} +36 -12
  17. package/dist/chunk-KFMD33UD.js.map +1 -0
  18. package/dist/{chunk-ZWYHKGQ7.js → chunk-NCS7X3XY.js} +11 -9
  19. package/dist/{chunk-ZWYHKGQ7.js.map → chunk-NCS7X3XY.js.map} +1 -1
  20. package/dist/{chunk-GSZPMKFW.js → chunk-O56P2KSZ.js} +237 -26
  21. package/dist/chunk-O56P2KSZ.js.map +1 -0
  22. package/dist/{chunk-ERRANBGS.js → chunk-U3D7YI47.js} +7 -11
  23. package/dist/chunk-U3D7YI47.js.map +1 -0
  24. package/dist/{chunk-OOQIJXCA.js → chunk-UN4XGHLQ.js} +3 -2
  25. package/dist/{chunk-A4KUAXE5.js → chunk-VPC55T7P.js} +2 -2
  26. package/dist/context-mention-palette/index.js +6 -6
  27. package/dist/i18n/index.d.ts +34 -10
  28. package/dist/i18n/index.js +1 -1
  29. package/dist/index.d.ts +5 -4
  30. package/dist/index.js +1012 -477
  31. package/dist/index.js.map +1 -1
  32. package/dist/plan-decision-ops.d.ts +1 -1
  33. package/dist/workbench/contribution.js +1 -1
  34. package/dist/workbench/index.js +1 -1
  35. package/dist/workspace-agent-generated-files.js +2 -2
  36. package/dist/{workspaceLinkActions-CqWZaCY4.d.ts → workspaceLinkActions-C6POH38D.d.ts} +7 -1
  37. package/package.json +12 -12
  38. package/dist/chunk-AFTAFV2C.js.map +0 -1
  39. package/dist/chunk-ERRANBGS.js.map +0 -1
  40. package/dist/chunk-GSZPMKFW.js.map +0 -1
  41. package/dist/chunk-RQ3HEF42.js.map +0 -1
  42. package/dist/chunk-SGQ4C7JE.js.map +0 -1
  43. /package/dist/{chunk-WPWZKKKV.js.map → chunk-3LEUGNCT.js.map} +0 -0
  44. /package/dist/{chunk-RDCBACWR.js.map → chunk-JYH2ITNL.js.map} +0 -0
  45. /package/dist/{chunk-OOQIJXCA.js.map → chunk-UN4XGHLQ.js.map} +0 -0
  46. /package/dist/{chunk-A4KUAXE5.js.map → chunk-VPC55T7P.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/agentMcpToolTarget.ts","../shared/agentConversation/askUserQuestions.ts","../shared/AgentMessageMarkdown.tsx","../app/renderer/components/ZoomableImage.tsx","../app/renderer/lib/utils.ts","../shared/utils/websiteUrl.ts","../actions/workspaceLinkActions.ts","../shared/streamingMarkdownTailStabilizer.ts","../shared/useStreamingVisibleText.ts","../agent-gui/agentGuiNode/AgentGUIConversation.styles.ts","../app/renderer/components/icons/MessageSquareMoreIcon.tsx","../app/renderer/components/ui/custom-scroll-area.tsx"],"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","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 CSSProperties,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type JSX,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n createContext,\n startTransition,\n useCallback,\n useEffect,\n useContext,\n memo,\n useMemo,\n useState\n} from \"react\";\nimport { useTranslation } from \"../i18n/index\";\nimport { ZoomableImage } from \"../app/renderer/components/ZoomableImage\";\nimport { cn } from \"../app/renderer/lib/utils\";\nimport ReactMarkdown, { defaultUrlTransform } from \"react-markdown\";\nimport rehypeSanitize, {\n defaultSchema,\n type Options as RehypeSanitizeOptions\n} from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\nimport {\n resolveWorkspaceFileExtension,\n resolveWorkspaceImageMimeType,\n resolveWorkspaceVideoMimeType,\n workspaceFileName as basenameWorkspacePath\n} from \"@tutti-os/workspace-file-manager/services\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n useTextOverflow\n} from \"@tutti-os/ui-system/components\";\nimport {\n isRichTextMentionHref,\n parseRichTextMentionHref\n} from \"@tutti-os/ui-rich-text/core\";\nimport {\n getOptionalAgentHostApi,\n useOptionalAgentHostApi\n} from \"../agentActivityHost\";\nimport {\n isDirectAgentGeneratedMediaPath,\n resolveWorkspaceFilePathCandidate,\n resolveWorkspaceLinkAction,\n type WorkspaceLinkAction,\n type WorkspaceLinkActionSource\n} from \"../actions/workspaceLinkActions\";\nimport { resolveAgentWorkspaceFileVisualKind } from \"./workspaceFileVisualKind\";\nimport { stabilizeStreamingMarkdownTail } from \"./streamingMarkdownTailStabilizer\";\nimport { useStreamingVisibleText } from \"./useStreamingVisibleText\";\n\nconst COLLAPSED_LINE_LIMIT = 8;\nconst APPROX_CHARS_PER_LINE = 34;\nconst DEFERRED_LONG_MARKDOWN_CHAR_THRESHOLD = 4096;\nconst STREAMING_MARKDOWN_EMERGENCY_PLAIN_CHAR_THRESHOLD = 96_000;\nconst DEFERRED_LONG_MARKDOWN_FALLBACK_DELAY_MS = 80;\nconst DEFERRED_LONG_MARKDOWN_IDLE_TIMEOUT_MS = 700;\nconst STREAMING_MARKDOWN_FRAME_MS = 24;\nconst STREAMING_MARKDOWN_MAX_CHARS_PER_SECOND = 6_000;\nconst STREAMING_MARKDOWN_TAIL_FLUSH_CHARS = 0;\nconst PLAIN_SESSION_MENTION_AGENT_LABELS = [\n \"Claude Code\",\n \"Nexight\",\n \"Codex\"\n] as const;\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: [...(defaultSchema.protocols?.href ?? []), \"mention\"]\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 onLinkClick?: (href: string) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n workspaceLinkContext?: AgentMessageMarkdownWorkspaceLinkContext | null;\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n collapsible?: boolean;\n expandLabel?: string;\n className?: string;\n inline?: boolean;\n normalizePlainIssueMentionTitle?: boolean;\n deferLongContentRender?: boolean;\n enableImageZoom?: boolean;\n previewMode?: 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 [];\n\ntype MarkdownDomProps<Tag extends keyof JSX.IntrinsicElements> =\n ComponentPropsWithoutRef<Tag> & {\n node?: unknown;\n };\n\nconst MarkdownLinkContext = createContext(false);\n\ntype ReactMarkdownComponents = ComponentPropsWithoutRef<\n typeof ReactMarkdown\n>[\"components\"];\n\nexport function AgentMessageMarkdown({\n content,\n onLinkClick,\n onLinkAction,\n workspaceLinkContext = null,\n workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS,\n collapsible = false,\n expandLabel,\n className,\n inline = false,\n normalizePlainIssueMentionTitle = false,\n deferLongContentRender = false,\n enableImageZoom = false,\n previewMode = false,\n streaming = false\n}: AgentMessageMarkdownProps): JSX.Element {\n \"use memo\";\n const { t } = useTranslation();\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 contentSignature = useMemo(\n () => hashMarkdownProfilerContent(stabilizedContent),\n [stabilizedContent]\n );\n const normalizedContent = useMemo(\n () =>\n linkBareLocalAbsolutePaths(\n normalizeMentionMarkdownLinks(\n normalizePlainIssueMentionTitle\n ? normalizePlainIssueMentionTitleContent(\n normalizePlainSessionMentionTitle(stabilizedContent)\n )\n : normalizePlainSessionMentionTitle(stabilizedContent)\n )\n ),\n [normalizePlainIssueMentionTitle, stabilizedContent]\n );\n const isMentionOnly = isMentionOnlyMarkdownContent(normalizedContent);\n const shouldDeferMarkdownRender =\n deferLongContentRender &&\n !inline &&\n content.length >=\n (streaming\n ? STREAMING_MARKDOWN_EMERGENCY_PLAIN_CHAR_THRESHOLD\n : DEFERRED_LONG_MARKDOWN_CHAR_THRESHOLD) &&\n !isExpanded;\n const markdownRenderReady = useDeferredMarkdownRenderReady(\n contentSignature,\n shouldDeferMarkdownRender\n );\n const handleLinkClick = useCallback(\n (href: string): void => {\n if (workspaceLinkSource && onLinkAction && workspaceRoot) {\n const resolvedHref =\n resolveWorkspaceFileHrefFromMessage(href, stabilizedContent, {\n workspaceRoot,\n basePath\n }) ?? href;\n const action = resolveWorkspaceLinkAction({\n href: resolvedHref,\n workspaceRoot,\n basePath,\n source: workspaceLinkSource\n });\n if (action) {\n onLinkAction(action);\n return;\n }\n }\n onLinkClick?.(href);\n },\n [\n basePath,\n onLinkAction,\n onLinkClick,\n stabilizedContent,\n workspaceLinkSource,\n workspaceRoot\n ]\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 previewMode={previewMode}\n />\n ),\n code: (props: MarkdownDomProps<\"code\">) => (\n <MarkdownCode\n {...props}\n onLinkClick={handleLinkClick}\n workspaceFileLinksEnabled={Boolean(\n workspaceRoot && workspaceLinkSource\n )}\n />\n ),\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 }),\n [\n enableImageZoom,\n handleLinkClick,\n inline,\n previewMode,\n workspaceAppIcons,\n workspaceLinkSource,\n workspaceRoot\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 {markdownRenderReady ? (\n streaming ? (\n <StreamingMarkdownBlocks\n content={normalizedContent}\n components={markdownComponents}\n />\n ) : (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeSanitize, MARKDOWN_SANITIZE_SCHEMA]]}\n urlTransform={markdownUrlTransform}\n components={markdownComponents}\n >\n {normalizedContent}\n </ReactMarkdown>\n )\n ) : (\n <div\n className=\"whitespace-pre-wrap [overflow-wrap:anywhere]\"\n data-workspace-agent-markdown-deferred=\"true\"\n >\n {normalizedContent}\n </div>\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]}\n rehypePlugins={[[rehypeSanitize, MARKDOWN_SANITIZE_SCHEMA]]}\n urlTransform={markdownUrlTransform}\n components={components}\n >\n {content}\n </ReactMarkdown>\n );\n});\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\nfunction 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\nfunction 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\nfunction resolveMarkdownAnchorHref(target: EventTarget | null): 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\nfunction 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\nfunction 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\nfunction 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\nfunction useDeferredMarkdownRenderReady(\n contentSignature: string,\n shouldDefer: boolean\n): boolean {\n const [readySignature, setReadySignature] = useState<string | null>(\n shouldDefer ? null : contentSignature\n );\n const renderReady = !shouldDefer || readySignature === contentSignature;\n\n useEffect(() => {\n if (!shouldDefer) {\n setReadySignature(contentSignature);\n return;\n }\n\n let canceled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let idleCallbackId: number | null = null;\n const markReady = (): void => {\n if (canceled) {\n return;\n }\n startTransition(() => {\n setReadySignature(contentSignature);\n });\n };\n\n if (\"requestIdleCallback\" in window) {\n idleCallbackId = window.requestIdleCallback(markReady, {\n timeout: DEFERRED_LONG_MARKDOWN_IDLE_TIMEOUT_MS\n });\n } else {\n timeoutId = setTimeout(\n markReady,\n DEFERRED_LONG_MARKDOWN_FALLBACK_DELAY_MS\n );\n }\n\n return () => {\n canceled = true;\n if (idleCallbackId !== null) {\n window.cancelIdleCallback(idleCallbackId);\n }\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n };\n }, [contentSignature, shouldDefer]);\n\n return renderReady;\n}\n\nfunction 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\nfunction 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\nfunction MarkdownLink({\n node: _node,\n onClick: _onClick,\n onLinkClick,\n workspaceAppIcons,\n previewMode,\n href,\n ...props\n}: MarkdownDomProps<\"a\"> & {\n onLinkClick?: (href: string) => void;\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\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 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 previewMode={previewMode === true}\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\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 previewMode,\n ...props\n}: AnchorHTMLAttributes<HTMLAnchorElement> & {\n href: string;\n mention: ParsedMentionLink;\n onLinkClick?: (href: string) => void;\n previewMode: boolean;\n}): JSX.Element {\n \"use memo\";\n // 标签截断时,hover 用设计系统 Tooltip 展示完整文本。trigger = 整个 chip(<a>),\n // 截断发生在内部 __main span,故在那上面测溢出。\n const tooltipText =\n mention.kind === \"session\"\n ? `${mention.participant}${mention.summary ? ` ${mention.summary}` : \"\"}`.trim()\n : mention.label;\n const { ref: mainRef, overflowing } =\n useTextOverflow<HTMLSpanElement>(tooltipText);\n const link = (\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={mention.iconUrl}\n data-agent-mention-href={href}\n data-agent-mention-kind={mention.kind}\n aria-label={mention.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 {mention.kind === \"workspace-app\" ||\n mention.kind === \"workspace-reference\" ? (\n <span\n className=\"grid h-4 w-4 shrink-0 place-items-center overflow-hidden rounded-[4px] bg-block\"\n aria-hidden=\"true\"\n data-agent-mention-app-icon=\"true\"\n data-workspace-app-icon=\"true\"\n >\n {mention.iconUrl ? (\n <img\n src={mention.iconUrl}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n ) : (\n <span className=\"tsh-agent-object-token__kind-icon h-4 w-4\" />\n )}\n </span>\n ) : (\n <span className=\"tsh-agent-object-token__kind\" aria-hidden=\"true\">\n <span\n className=\"tsh-agent-object-token__kind-icon\"\n aria-hidden=\"true\"\n />\n </span>\n )}\n {mention.kind === \"session\" ? (\n <span className=\"tsh-agent-object-token__main\" ref={mainRef}>\n <span className=\"tsh-agent-object-token__participant\">\n {mention.participant}\n </span>\n {mention.summary ? (\n <span className=\"tsh-agent-object-token__summary\">\n {\" \"}\n {mention.summary}\n </span>\n ) : null}\n </span>\n ) : (\n <span className=\"tsh-agent-object-token__main\" ref={mainRef}>\n {mention.label}\n </span>\n )}\n </a>\n );\n\n if (previewMode) {\n return link;\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>{link}</TooltipTrigger>\n {overflowing ? (\n <TooltipContent className=\"max-w-[min(420px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\">\n {tooltipText}\n </TooltipContent>\n ) : null}\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nfunction MarkdownCode({\n node: _node,\n children,\n className,\n onLinkClick,\n workspaceFileLinksEnabled = false,\n ...props\n}: MarkdownDomProps<\"code\"> & {\n onLinkClick?: (href: string) => void;\n workspaceFileLinksEnabled?: boolean;\n}): JSX.Element {\n \"use memo\";\n const isInsideLink = useContext(MarkdownLinkContext);\n const text = textFromReactNode(children).trim();\n const isLinkablePath =\n !isInsideLink &&\n onLinkClick &&\n !className &&\n (isLocalAbsolutePath(text) ||\n isHttpUrl(text) ||\n (workspaceFileLinksEnabled && isLikelyWorkspaceRelativeFilePath(text)));\n if (isLinkablePath) {\n return (\n <PathLink href={text} onLinkClick={onLinkClick}>\n {children}\n </PathLink>\n );\n }\n return (\n <code {...props} className={className}>\n {children}\n </code>\n );\n}\n\ntype MarkdownMediaKind = \"image\" | \"video\";\n\ntype MarkdownMediaState =\n | { status: \"loading\" }\n | { kind: MarkdownMediaKind; status: \"ready\"; src: string }\n | {\n status: \"error\";\n reason: \"unsupported\" | \"read-failed\";\n detail?: string;\n };\n\ninterface CachedMarkdownMedia {\n kind: MarkdownMediaKind;\n objectUrl: string;\n refCount: number;\n revokeTimer: ReturnType<typeof setTimeout> | null;\n}\n\nconst cachedMarkdownMedia = new Map<string, CachedMarkdownMedia>();\nconst CACHED_MARKDOWN_MEDIA_REVOKE_DELAY_MS = 250;\n\nexport function resetCachedMarkdownImagesForTests(): void {\n if (process.env.NODE_ENV !== \"test\") {\n return;\n }\n for (const [path, entry] of cachedMarkdownMedia) {\n if (entry.revokeTimer) {\n clearTimeout(entry.revokeTimer);\n }\n URL.revokeObjectURL(entry.objectUrl);\n cachedMarkdownMedia.delete(path);\n }\n}\n\nfunction 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 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 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\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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction resolveMarkdownMediaKind(\n pathOrName: string\n): MarkdownMediaKind | null {\n return resolveMarkdownMediaType(pathOrName)?.kind ?? null;\n}\n\nfunction 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\nfunction peekCachedMarkdownMediaState(path: string): MarkdownMediaState | null {\n const entry = cachedMarkdownMedia.get(path);\n return entry\n ? { kind: entry.kind, status: \"ready\", src: entry.objectUrl }\n : null;\n}\n\nfunction 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\nfunction 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\nfunction releaseCachedMarkdownMedia(path: string, objectUrl: string): 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 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\nfunction isHttpUrl(value: string): boolean {\n const candidate = value.trim();\n if (!candidate || /\\s/.test(candidate)) {\n return false;\n }\n try {\n const url = new URL(candidate);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction resolveWorkspaceFileHrefFromMessage(\n rawPath: string,\n messageContent: string,\n context: {\n workspaceRoot: string;\n basePath: string | null;\n }\n): string | null {\n const path = trimTrailingPathPunctuation(rawPath.trim());\n if (\n !path ||\n isHttpUrl(path) ||\n isLocalAbsolutePath(path) ||\n !isLikelyWorkspaceRelativeFilePath(path)\n ) {\n return null;\n }\n\n const directoryHrefs = extractWorkspaceDirectoryLinkHrefs(messageContent);\n const candidates: string[] = [];\n if (path.includes(\"/\")) {\n candidates.push(path);\n } else {\n for (const directoryHref of directoryHrefs) {\n candidates.push(`${directoryHref}/${path}`);\n }\n candidates.push(path);\n }\n\n for (const candidate of candidates) {\n if (\n resolveWorkspaceFilePathCandidate({\n path: candidate,\n workspaceRoot: context.workspaceRoot,\n basePath: context.basePath\n })\n ) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction extractWorkspaceDirectoryLinkHrefs(content: string): string[] {\n const directories: string[] = [];\n let index = 0;\n while (index < content.length) {\n const linkEnd = markdownLinkEndIndex(content, index);\n if (linkEnd <= index) {\n index += 1;\n continue;\n }\n\n const slice = content.slice(index, linkEnd);\n const match = /^\\[([^\\]]*)\\]\\(([^)]+)\\)$/.exec(slice);\n if (match) {\n const href = match[2]?.trim() ?? \"\";\n if (href && !isRichTextMentionHref(href) && !href.includes(\"://\")) {\n const normalizedHref = href.replace(/\\/+$/g, \"\");\n if (\n href.endsWith(\"/\") ||\n (!normalizedHref.includes(\".\") && !normalizedHref.includes(\" \"))\n ) {\n directories.push(normalizedHref);\n }\n }\n }\n index = linkEnd;\n }\n return [...new Set(directories)];\n}\n\nfunction isLikelyWorkspaceRelativeFilePath(path: string): boolean {\n if (!path || /\\s/.test(path) || path.includes(\"://\")) {\n return false;\n }\n return path.includes(\"/\") || /\\.[A-Za-z0-9][A-Za-z0-9._-]{0,15}$/.test(path);\n}\n\nfunction linkBareLocalAbsolutePaths(content: string): string {\n let out = \"\";\n for (let index = 0; index < content.length; ) {\n const markdownLinkEnd = markdownLinkEndIndex(content, index);\n if (markdownLinkEnd > index) {\n out += content.slice(index, markdownLinkEnd);\n index = markdownLinkEnd;\n continue;\n }\n\n const codeSpanEnd = codeSpanEndIndex(content, index);\n if (codeSpanEnd > index) {\n out += content.slice(index, codeSpanEnd);\n index = codeSpanEnd;\n continue;\n }\n\n if (isLocalPathStart(content, index)) {\n const end = bareLocalPathEndIndex(content, index);\n const rawPath = trimTrailingPathPunctuation(content.slice(index, end));\n const trailing = content.slice(index + rawPath.length, end);\n if (isLocalAbsolutePath(rawPath)) {\n out += `[${escapeMarkdownLinkLabel(rawPath)}](${rawPath})${trailing}`;\n } else {\n out += content.slice(index, end);\n }\n index = end;\n continue;\n }\n\n out += content[index];\n index += 1;\n }\n return out;\n}\n\nfunction normalizePlainIssueMentionTitleContent(content: string): 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\nfunction 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\nfunction 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\nfunction 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\nfunction markdownUrlTransform(value: string): string {\n return isRichTextMentionHref(value) ? value : defaultUrlTransform(value);\n}\n\ntype MentionKind =\n | \"session\"\n | \"workspace-app\"\n | \"workspace-reference\"\n | \"workspace-app-factory\"\n | \"workspace-issue\";\n\ninterface ParsedMentionLink {\n appId?: string;\n kind: MentionKind;\n label: string;\n iconUrl?: string;\n participant: string;\n summary: string;\n /** 引用文件数量(workspace-reference 专用,来自 href 的 count 参数)。 */\n fileCount?: number;\n}\n\nfunction parseMentionLink(\n href: string,\n rawLabel: string,\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[] = [],\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;\n if (\n kind !== \"session\" &&\n kind !== \"workspace-app\" &&\n kind !== \"workspace-reference\" &&\n kind !== \"workspace-app-factory\" &&\n kind !== \"workspace-issue\"\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 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 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 participant: label,\n summary: \"\"\n };\n }\n if (kind === \"workspace-reference\") {\n return {\n kind,\n label,\n iconUrl: mention.scope?.icon?.trim() || undefined,\n fileCount: referenceFileCountFromParam(mention.scope?.count ?? null),\n participant: label,\n summary: \"\"\n };\n }\n if (kind === \"workspace-issue\") {\n return {\n kind,\n label,\n participant: label,\n summary: \"\"\n };\n }\n const sessionLabel = parseSessionMentionLabel(label);\n return {\n kind,\n label,\n participant: sessionLabel.participant,\n summary: sessionLabel.summary\n };\n}\n\nfunction referenceFileCountFromParam(value: string | null): 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\nfunction 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\nfunction parseSessionMentionLabel(label: string): {\n participant: string;\n summary: string;\n} {\n const dottedParts = label\n .split(\"·\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (dottedParts.length >= 3) {\n return {\n participant: `${dottedParts[0]} & ${dottedParts[1]}`,\n summary: dottedParts.slice(2).join(\" \")\n };\n }\n return {\n participant: label,\n summary: \"\"\n };\n}\n\nfunction 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\nfunction 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\nfunction isLocalPathStart(content: string, index: number): boolean {\n if (content[index] !== \"/\" || content[index + 1] === \"/\") {\n return false;\n }\n const previous = content[index - 1];\n return (\n previous === undefined ||\n /\\s/.test(previous) ||\n previous === \"(\" ||\n previous === \"[\"\n );\n}\n\nfunction bareLocalPathEndIndex(content: string, index: number): number {\n let end = index;\n while (end < content.length) {\n const char = content[end];\n if (!char || /[\\s<>[\\](){}\"'`]/.test(char)) {\n break;\n }\n end += 1;\n }\n return end;\n}\n\nfunction trimTrailingPathPunctuation(path: string): string {\n return path.replace(/[.,;:!?,。;:!?]+$/g, \"\");\n}\n\nfunction escapeMarkdownLinkLabel(label: string): string {\n return label.replace(/([\\\\[\\]])/g, \"\\\\$1\");\n}\n\nfunction PathLink({\n href,\n children,\n onLinkClick\n}: {\n href: string;\n children: ReactNode;\n onLinkClick: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n return (\n <a\n className=\"cursor-pointer\"\n data-agent-link-href={href}\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 {children}\n </a>\n );\n}\n\nfunction 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","import {\n cloneElement,\n type ComponentPropsWithoutRef,\n type JSX,\n type ReactElement\n} from \"react\";\nimport Zoom from \"react-medium-image-zoom\";\nimport { useTranslation } from \"../../../i18n/index\";\nimport { cn } from \"../lib/utils\";\n\ninterface ZoomableImageProps extends ComponentPropsWithoutRef<\"img\"> {\n wrapElement?: \"div\" | \"span\";\n}\n\nexport function ZoomableImage({\n className,\n wrapElement = \"div\",\n ...props\n}: ZoomableImageProps): JSX.Element {\n const { t } = useTranslation();\n\n const renderZoomContent = ({\n buttonUnzoom,\n img\n }: {\n buttonUnzoom: ReactElement<HTMLButtonElement>;\n img: ReactElement | null;\n }): JSX.Element => (\n <>\n {img}\n {cloneElement(buttonUnzoom, {\n className: cn(\n buttonUnzoom.props.className,\n \"nodrag tsh-desktop-no-drag\"\n )\n })}\n </>\n );\n\n return (\n <Zoom\n a11yNameButtonZoom={t(\"common.expandImage\")}\n a11yNameButtonUnzoom={t(\"common.minimizeImage\")}\n classDialog=\"tsh-zoom-dialog nodrag tsh-desktop-no-drag\"\n wrapElement={wrapElement}\n zoomMargin={24}\n ZoomContent={renderZoomContent}\n >\n <img\n {...props}\n className={cn(\"nodrag tsh-desktop-no-drag cursor-zoom-in\", className)}\n />\n </Zoom>\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\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\";\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?: \"reveal\" | \"open-directory\";\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 provider?: 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\nexport type WorkspaceLinkAction =\n | OpenWorkspaceFileLinkAction\n | OpenLocalAssetPreviewLinkAction\n | OpenWorkspaceUrlLinkAction\n | OpenAgentSessionLinkAction\n | OpenWorkspaceIssueLinkAction\n | OpenWorkspaceAppLinkAction;\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 (\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 root = normalizeWorkspaceFilePath(workspaceRoot?.trim() ?? \"\");\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 | null {\n const mention = parseRichTextMentionHref(href, \"\");\n if (!mention) {\n return null;\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 return {\n type: \"open-agent-session\",\n workspaceId,\n agentSessionId: targetId,\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 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 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","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 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 messageGroup: \"agent-gui-conversation__message-group\",\n messageCopyButton: \"agent-gui-conversation__message-copy-button\",\n userMessageBubble: \"agent-gui-conversation__user-message-bubble\",\n assistantMarkdown: \"agent-gui-conversation__assistant-markdown\"\n} as const;\n\nexport default styles;\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","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"],"mappings":"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","names":["objectValue","stringValue","startTransition","useEffect","useState","parseRichTextMentionHref","label","Fragment","jsx","jsxs","useState","jsx","jsxs","Fragment","MemoizedMarkdownBlock","useEffect","startTransition","basename","useState","useEffect","jsx","parseRichTextMentionHref","useCallback","useEffect","useRef","jsx","jsxs","useRef","useCallback","useEffect","forwardRef","useCallback","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useEffect","forwardRef","CustomScrollArea"]}
@@ -7,17 +7,17 @@ import {
7
7
  AgentGUIConversation_styles_default,
8
8
  MessageSquareMoreIcon,
9
9
  extractAgentMcpToolTarget
10
- } from "./chunk-AFTAFV2C.js";
10
+ } from "./chunk-CMXRLF64.js";
11
11
  import {
12
12
  Spinner
13
- } from "./chunk-WPWZKKKV.js";
13
+ } from "./chunk-3LEUGNCT.js";
14
14
  import {
15
15
  getOptionalAgentHostApi,
16
16
  useOptionalAgentHostApi
17
- } from "./chunk-SGQ4C7JE.js";
17
+ } from "./chunk-2ADVHCST.js";
18
18
  import {
19
19
  translate
20
- } from "./chunk-RQ3HEF42.js";
20
+ } from "./chunk-KFMD33UD.js";
21
21
 
22
22
  // shared/agentConversation/approvalOptionPresentation.ts
23
23
  function approvalOptionDisplayLabel(option, intent = {}) {
@@ -1120,4 +1120,4 @@ export {
1120
1120
  isPromptRequestIdTitle,
1121
1121
  AgentInteractivePromptSurface
1122
1122
  };
1123
- //# sourceMappingURL=chunk-RDCBACWR.js.map
1123
+ //# sourceMappingURL=chunk-JYH2ITNL.js.map
@@ -97,7 +97,7 @@ var enSettingsPanel = {
97
97
  agent: {
98
98
  title: "Agent",
99
99
  defaultAgentLabel: "Default Agent",
100
- defaultAgentHelp: "The default AI provider for new issues and terminals",
100
+ defaultAgentHelp: "The default AI provider for new tasks and terminals",
101
101
  moveUp: "Move up",
102
102
  moveDown: "Move down",
103
103
  fullAccessLabel: "Full Access Mode",
@@ -453,6 +453,7 @@ var en = {
453
453
  initialPlaceholder: "Type @ to reference sessions, files, tasks, and apps",
454
454
  followupPlaceholder: "Request follow-up changes from {{provider}}",
455
455
  installRequiredPlaceholder: "Install {{provider}} from the dock to send messages",
456
+ installRequiredAction: "Set up",
456
457
  collaboratorSessionReadOnlyPlaceholder: "This session belongs to another user and cannot be replied to directly",
457
458
  send: "Send",
458
459
  modelLabel: "Model",
@@ -605,9 +606,6 @@ var en = {
605
606
  usageTokensLabel: "Tokens",
606
607
  usageLimitsLabel: "Limits",
607
608
  usageCompactAction: "Compact",
608
- usageAlertWarnMessage: "Context is {{percent}}% full. Consider compacting the conversation.",
609
- usageAlertCriticalMessage: "Context is {{percent}}% full. Compact now to keep the session going.",
610
- usageAlertDismiss: "Dismiss",
611
609
  planCardTitle: "Plan",
612
610
  planCardCopy: "Copy plan",
613
611
  planCardExpand: "Expand plan",
@@ -668,6 +666,7 @@ var en = {
668
666
  empty: "What can {{provider}} help you with?",
669
667
  conversations: "Sessions",
670
668
  newConversation: "New session",
669
+ agentEnvSetup: "Environment check",
671
670
  noConversations: "No sessions yet",
672
671
  emptyProjectConversations: "No chats yet",
673
672
  batchRunnerStandaloneTitle: "Agent GUI batch runner",
@@ -784,6 +783,7 @@ var en = {
784
783
  authRequired: "Authentication required",
785
784
  authLogin: "Sign in",
786
785
  activatingSession: "Connecting session...",
786
+ cancellingSession: "Cancelling...",
787
787
  retryActivation: "Retry",
788
788
  continueInNewConversation: "New session",
789
789
  goalLabel: "Goal",
@@ -805,6 +805,18 @@ var en = {
805
805
  visibleErrorRuntimeUnavailable: "{{provider}} could not start because the runtime is unavailable",
806
806
  visibleErrorQuotaOrRateLimit: "{{provider}} request failed because a quota or rate limit was reached",
807
807
  visibleErrorDetails: "View details",
808
+ visibleErrorRawDetails: "Raw error",
809
+ visibleErrorCliNotFound: "{{provider}} CLI wasn't found, so it couldn't run. Set it up to continue.",
810
+ visibleErrorVersionUnsupported: "{{provider}}'s installed version is unsupported for this request. Upgrade to continue.",
811
+ visibleErrorNetwork: "{{provider}} couldn't reach the network to complete this request.",
812
+ visibleErrorConfigTimeout: "{{provider}} couldn't apply session settings before the request timed out. Try again in a moment.",
813
+ visibleErrorStreamDisconnected: "{{provider}}'s response was interrupted before it completed. Try again in a moment.",
814
+ visibleErrorConcurrencyLimit: "{{provider}} is handling too many requests right now. Try again after another task finishes.",
815
+ visibleErrorActionInstall: "Set up",
816
+ visibleErrorActionUpgrade: "Upgrade",
817
+ visibleErrorActionRelogin: "Sign in",
818
+ visibleErrorActionCheckNetwork: "Check network",
819
+ visibleErrorActionDetect: "Open setup",
808
820
  systemNoticeTransportRetry: "Codex connection interrupted. Reconnecting...",
809
821
  systemNoticeTransportFallback: "Codex switched to HTTPS transport",
810
822
  systemNoticeWarning: "Codex warning",
@@ -975,7 +987,7 @@ var en = {
975
987
  referencesLabel: "References",
976
988
  requirementNoOtherOutputDir: "3. Do not write final deliverables to any other directory.",
977
989
  requirementStayInWorkspace: "1. Work under {{workspaceRoot}}; do not switch to unrelated directories.",
978
- requirementSummaryOutput: "2. Unless the user specifies another location, write at least docs/tutti/issue_summary_{{issueId}}.md with the result, changes, and conclusion.",
990
+ requirementSummaryOutput: "2. Unless the user specifies another location, write at least docs/tutti/task_summary_{{issueId}}.md with the result, changes, and conclusion.",
979
991
  taskContentLabel: "Task content",
980
992
  taskTitleLabel: "Task title"
981
993
  },
@@ -1684,7 +1696,7 @@ var en = {
1684
1696
  taskCompletedCount: "{{count}} completed",
1685
1697
  issueStatusNotStarted: "To run",
1686
1698
  issueStatusRunning: "Running",
1687
- issueStatusInProgress: "Progress started",
1699
+ issueStatusInProgress: "Running",
1688
1700
  issueStatusPendingAcceptance: "Pending acceptance",
1689
1701
  issueStatusCompleted: "Completed",
1690
1702
  issueStatusFailed: "Failed",
@@ -2844,6 +2856,7 @@ var zhCN = {
2844
2856
  initialPlaceholder: "\u8F93\u5165 @ \u5F15\u7528\u4F1A\u8BDD\u3001\u6587\u4EF6\u3001\u4EFB\u52A1\u548C\u5E94\u7528",
2845
2857
  followupPlaceholder: "\u8981\u6C42 {{provider}} \u7EE7\u7EED\u540E\u7EED\u53D8\u66F4",
2846
2858
  installRequiredPlaceholder: "\u8BF7\u5148\u4ECE Dock \u5B89\u88C5 {{provider}}\uFF0C\u7136\u540E\u518D\u53D1\u9001\u6D88\u606F",
2859
+ installRequiredAction: "\u8BBE\u7F6E",
2847
2860
  collaboratorSessionReadOnlyPlaceholder: "\u975E\u5F53\u524D\u7528\u6237\u4F1A\u8BDD\uFF0C\u4E0D\u53EF\u76F4\u63A5\u5BF9\u8BDD",
2848
2861
  send: "\u53D1\u9001",
2849
2862
  modelLabel: "\u6A21\u578B",
@@ -2996,9 +3009,6 @@ var zhCN = {
2996
3009
  usageTokensLabel: "Token \u7528\u91CF",
2997
3010
  usageLimitsLabel: "\u9650\u989D",
2998
3011
  usageCompactAction: "\u538B\u7F29",
2999
- usageAlertWarnMessage: "\u4E0A\u4E0B\u6587\u5DF2\u4F7F\u7528 {{percent}}%\uFF0C\u5EFA\u8BAE\u538B\u7F29\u4F1A\u8BDD\u3002",
3000
- usageAlertCriticalMessage: "\u4E0A\u4E0B\u6587\u5DF2\u4F7F\u7528 {{percent}}%\uFF0C\u8BF7\u7ACB\u5373\u538B\u7F29\u4EE5\u7EE7\u7EED\u4F1A\u8BDD\u3002",
3001
- usageAlertDismiss: "\u5173\u95ED\u63D0\u9192",
3002
3012
  planCardTitle: "\u8BA1\u5212",
3003
3013
  planCardCopy: "\u590D\u5236\u8BA1\u5212",
3004
3014
  planCardExpand: "\u5C55\u5F00\u65B9\u6848",
@@ -3059,6 +3069,7 @@ var zhCN = {
3059
3069
  empty: "\u9700\u8981 {{provider}} \u5E2E\u4F60\u505A\u4E9B\u4EC0\u4E48\uFF1F",
3060
3070
  conversations: "\u4F1A\u8BDD",
3061
3071
  newConversation: "\u65B0\u5EFA\u4F1A\u8BDD",
3072
+ agentEnvSetup: "\u73AF\u5883\u68C0\u6D4B",
3062
3073
  noConversations: "\u8FD8\u6CA1\u6709\u4F1A\u8BDD",
3063
3074
  emptyProjectConversations: "\u6682\u65E0\u5BF9\u8BDD",
3064
3075
  batchRunnerStandaloneTitle: "Agent GUI \u6279\u91CF\u6267\u884C\u9762\u677F",
@@ -3175,6 +3186,7 @@ var zhCN = {
3175
3186
  authRequired: "\u9700\u8981\u8BA4\u8BC1",
3176
3187
  authLogin: "\u767B\u5F55",
3177
3188
  activatingSession: "\u6B63\u5728\u8FDE\u63A5\u4F1A\u8BDD...",
3189
+ cancellingSession: "\u6B63\u5728\u53D6\u6D88\u4E2D...",
3178
3190
  retryActivation: "\u91CD\u8BD5",
3179
3191
  continueInNewConversation: "\u53BB\u65B0\u4F1A\u8BDD",
3180
3192
  goalLabel: "\u76EE\u6807",
@@ -3196,6 +3208,18 @@ var zhCN = {
3196
3208
  visibleErrorRuntimeUnavailable: "{{provider}} \u56E0\u8FD0\u884C\u73AF\u5883\u4E0D\u53EF\u7528\u800C\u65E0\u6CD5\u542F\u52A8",
3197
3209
  visibleErrorQuotaOrRateLimit: "{{provider}} \u8BF7\u6C42\u5931\u8D25\uFF1A\u989D\u5EA6\u6216\u9891\u7387\u9650\u5236\u5DF2\u89E6\u53D1",
3198
3210
  visibleErrorDetails: "\u67E5\u770B\u8BE6\u60C5",
3211
+ visibleErrorRawDetails: "\u539F\u59CB\u9519\u8BEF",
3212
+ visibleErrorCliNotFound: "\u672A\u68C0\u6D4B\u5230 {{provider}} CLI\uFF0C\u65E0\u6CD5\u8FD0\u884C\u3002\u8BF7\u5148\u5B8C\u6210\u5B89\u88C5\u3002",
3213
+ visibleErrorVersionUnsupported: "\u5F53\u524D {{provider}} \u7248\u672C\u8FC7\u65E7\uFF0C\u4E0D\u652F\u6301\u6B64\u8BF7\u6C42\u3002\u8BF7\u5148\u5347\u7EA7\u3002",
3214
+ visibleErrorNetwork: "{{provider}} \u65E0\u6CD5\u8FDE\u63A5\u7F51\u7EDC\u4EE5\u5B8C\u6210\u6B64\u8BF7\u6C42\u3002",
3215
+ visibleErrorConfigTimeout: "{{provider}} \u5728\u8BF7\u6C42\u8D85\u65F6\u524D\u672A\u80FD\u5E94\u7528\u4F1A\u8BDD\u8BBE\u7F6E\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",
3216
+ visibleErrorStreamDisconnected: "{{provider}} \u7684\u54CD\u5E94\u5728\u5B8C\u6210\u524D\u88AB\u4E2D\u65AD\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",
3217
+ visibleErrorConcurrencyLimit: "{{provider}} \u5F53\u524D\u5904\u7406\u7684\u8BF7\u6C42\u8FC7\u591A\u3002\u8BF7\u5728\u5176\u4ED6\u4EFB\u52A1\u5B8C\u6210\u540E\u518D\u8BD5\u3002",
3218
+ visibleErrorActionInstall: "\u53BB\u5B89\u88C5",
3219
+ visibleErrorActionUpgrade: "\u53BB\u5347\u7EA7",
3220
+ visibleErrorActionRelogin: "\u767B\u5F55",
3221
+ visibleErrorActionCheckNetwork: "\u68C0\u6D4B\u7F51\u7EDC",
3222
+ visibleErrorActionDetect: "\u6253\u5F00\u68C0\u6D4B",
3199
3223
  systemNoticeTransportRetry: "Codex \u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8FDE",
3200
3224
  systemNoticeTransportFallback: "Codex \u5DF2\u5207\u6362\u5230 HTTPS \u4F20\u8F93",
3201
3225
  systemNoticeWarning: "Codex \u8B66\u544A",
@@ -3366,7 +3390,7 @@ var zhCN = {
3366
3390
  referencesLabel: "\u5F15\u7528\u8D44\u6599",
3367
3391
  requirementNoOtherOutputDir: "3. \u4E0D\u8981\u628A\u6700\u7EC8\u4EA7\u7269\u5199\u5230\u5176\u4ED6\u76EE\u5F55\u3002",
3368
3392
  requirementStayInWorkspace: "1. \u5728 {{workspaceRoot}} \u4E0B\u5DE5\u4F5C\uFF0C\u4E0D\u8981\u5207\u6362\u5230\u5176\u4ED6\u65E0\u5173\u76EE\u5F55\u3002",
3369
- requirementSummaryOutput: "2. \u5982\u679C\u7528\u6237\u6CA1\u6709\u53E6\u884C\u6307\u5B9A\u4F4D\u7F6E\uFF0C\u81F3\u5C11\u8F93\u51FA docs/tutti/issue_summary_{{issueId}}.md\uFF0C\u8BF4\u660E\u5904\u7406\u7ED3\u679C\u3001\u6539\u52A8\u4E0E\u7ED3\u8BBA\u3002",
3393
+ requirementSummaryOutput: "2. \u5982\u679C\u7528\u6237\u6CA1\u6709\u53E6\u884C\u6307\u5B9A\u4F4D\u7F6E\uFF0C\u81F3\u5C11\u8F93\u51FA docs/tutti/task_summary_{{issueId}}.md\uFF0C\u8BF4\u660E\u5904\u7406\u7ED3\u679C\u3001\u6539\u52A8\u4E0E\u7ED3\u8BBA\u3002",
3370
3394
  taskContentLabel: "\u4EFB\u52A1\u5185\u5BB9",
3371
3395
  taskTitleLabel: "\u4EFB\u52A1\u6807\u9898"
3372
3396
  },
@@ -4074,7 +4098,7 @@ var zhCN = {
4074
4098
  taskCompletedCount: "{{count}} \u4E2A\u5DF2\u5B8C\u6210",
4075
4099
  issueStatusNotStarted: "\u672A\u542F\u52A8",
4076
4100
  issueStatusRunning: "\u6267\u884C\u4E2D",
4077
- issueStatusInProgress: "\u5DF2\u63A8\u8FDB",
4101
+ issueStatusInProgress: "\u6267\u884C\u4E2D",
4078
4102
  issueStatusPendingAcceptance: "\u5F85\u9A8C\u6536",
4079
4103
  issueStatusCompleted: "\u5DF2\u5B8C\u6210",
4080
4104
  issueStatusFailed: "\u5931\u8D25",
@@ -4896,4 +4920,4 @@ export {
4896
4920
  AgentGuiI18nProvider,
4897
4921
  useTranslation
4898
4922
  };
4899
- //# sourceMappingURL=chunk-RQ3HEF42.js.map
4923
+ //# sourceMappingURL=chunk-KFMD33UD.js.map