@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.
- package/README.md +5 -0
- package/dist/{AgentMessageMarkdown-Cp70W-Z2.d.ts → AgentMessageMarkdown-0sV8Biv3.d.ts} +53 -5
- package/dist/agent-conversation/index.d.ts +4 -4
- package/dist/agent-conversation/index.js +5 -5
- package/dist/agent-message-center/index.d.ts +2 -2
- package/dist/agent-message-center/index.js +29 -8
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentConversationVM-BElW2LNR.d.ts → agentConversationVM-xuzmD5IL.d.ts} +2 -0
- package/dist/app/renderer/agentactivity.css +54 -128
- package/dist/{chunk-SGQ4C7JE.js → chunk-2ADVHCST.js} +2 -1
- package/dist/chunk-2ADVHCST.js.map +1 -0
- package/dist/{chunk-WPWZKKKV.js → chunk-3LEUGNCT.js} +2 -2
- package/dist/{chunk-AFTAFV2C.js → chunk-CMXRLF64.js} +85 -13
- package/dist/chunk-CMXRLF64.js.map +1 -0
- package/dist/{chunk-RDCBACWR.js → chunk-JYH2ITNL.js} +5 -5
- package/dist/{chunk-RQ3HEF42.js → chunk-KFMD33UD.js} +36 -12
- package/dist/chunk-KFMD33UD.js.map +1 -0
- package/dist/{chunk-ZWYHKGQ7.js → chunk-NCS7X3XY.js} +11 -9
- package/dist/{chunk-ZWYHKGQ7.js.map → chunk-NCS7X3XY.js.map} +1 -1
- package/dist/{chunk-GSZPMKFW.js → chunk-O56P2KSZ.js} +237 -26
- package/dist/chunk-O56P2KSZ.js.map +1 -0
- package/dist/{chunk-ERRANBGS.js → chunk-U3D7YI47.js} +7 -11
- package/dist/chunk-U3D7YI47.js.map +1 -0
- package/dist/{chunk-OOQIJXCA.js → chunk-UN4XGHLQ.js} +3 -2
- package/dist/{chunk-A4KUAXE5.js → chunk-VPC55T7P.js} +2 -2
- package/dist/context-mention-palette/index.js +6 -6
- package/dist/i18n/index.d.ts +34 -10
- package/dist/i18n/index.js +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1012 -477
- package/dist/index.js.map +1 -1
- package/dist/plan-decision-ops.d.ts +1 -1
- package/dist/workbench/contribution.js +1 -1
- package/dist/workbench/index.js +1 -1
- package/dist/workspace-agent-generated-files.js +2 -2
- package/dist/{workspaceLinkActions-CqWZaCY4.d.ts → workspaceLinkActions-C6POH38D.d.ts} +7 -1
- package/package.json +12 -12
- package/dist/chunk-AFTAFV2C.js.map +0 -1
- package/dist/chunk-ERRANBGS.js.map +0 -1
- package/dist/chunk-GSZPMKFW.js.map +0 -1
- package/dist/chunk-RQ3HEF42.js.map +0 -1
- package/dist/chunk-SGQ4C7JE.js.map +0 -1
- /package/dist/{chunk-WPWZKKKV.js.map → chunk-3LEUGNCT.js.map} +0 -0
- /package/dist/{chunk-RDCBACWR.js.map → chunk-JYH2ITNL.js.map} +0 -0
- /package/dist/{chunk-OOQIJXCA.js.map → chunk-UN4XGHLQ.js.map} +0 -0
- /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-
|
|
10
|
+
} from "./chunk-CMXRLF64.js";
|
|
11
11
|
import {
|
|
12
12
|
Spinner
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-3LEUGNCT.js";
|
|
14
14
|
import {
|
|
15
15
|
getOptionalAgentHostApi,
|
|
16
16
|
useOptionalAgentHostApi
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-2ADVHCST.js";
|
|
18
18
|
import {
|
|
19
19
|
translate
|
|
20
|
-
} from "./chunk-
|
|
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-
|
|
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
|
|
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/
|
|
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: "
|
|
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/
|
|
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: "\
|
|
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-
|
|
4923
|
+
//# sourceMappingURL=chunk-KFMD33UD.js.map
|