@tutti-os/agent-gui 0.0.32 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +5 -0
  2. package/dist/{AgentMessageMarkdown-Cp70W-Z2.d.ts → AgentMessageMarkdown-CU6gRvTm.d.ts} +53 -2
  3. package/dist/agent-conversation/index.d.ts +4 -4
  4. package/dist/agent-conversation/index.js +5 -5
  5. package/dist/agent-message-center/index.d.ts +2 -2
  6. package/dist/agent-message-center/index.js +29 -8
  7. package/dist/agent-message-center/index.js.map +1 -1
  8. package/dist/{agentConversationVM-BElW2LNR.d.ts → agentConversationVM-xuzmD5IL.d.ts} +2 -0
  9. package/dist/app/renderer/agentactivity.css +53 -76
  10. package/dist/{chunk-SGQ4C7JE.js → chunk-2ADVHCST.js} +2 -1
  11. package/dist/chunk-2ADVHCST.js.map +1 -0
  12. package/dist/{chunk-MFWZKYZ4.js → chunk-I5GHWK6X.js} +7 -11
  13. package/dist/chunk-I5GHWK6X.js.map +1 -0
  14. package/dist/{chunk-ZWYHKGQ7.js → chunk-NCS7X3XY.js} +11 -9
  15. package/dist/{chunk-ZWYHKGQ7.js.map → chunk-NCS7X3XY.js.map} +1 -1
  16. package/dist/{chunk-FG66NW5M.js → chunk-PVEFWBH6.js} +15 -2
  17. package/dist/chunk-PVEFWBH6.js.map +1 -0
  18. package/dist/{chunk-WPWZKKKV.js → chunk-RUO6SDNC.js} +2 -2
  19. package/dist/{chunk-OOQIJXCA.js → chunk-SV4UKLJO.js} +3 -2
  20. package/dist/{chunk-RDCBACWR.js → chunk-TCKH7GZ6.js} +5 -5
  21. package/dist/{chunk-RQ3HEF42.js → chunk-TQFYX7KY.js} +36 -6
  22. package/dist/chunk-TQFYX7KY.js.map +1 -0
  23. package/dist/{chunk-AFTAFV2C.js → chunk-XPVYQUFK.js} +78 -12
  24. package/dist/chunk-XPVYQUFK.js.map +1 -0
  25. package/dist/{chunk-J2DMJREM.js → chunk-ZR2LZVN6.js} +229 -21
  26. package/dist/chunk-ZR2LZVN6.js.map +1 -0
  27. package/dist/context-mention-palette/index.js +6 -6
  28. package/dist/i18n/index.d.ts +34 -4
  29. package/dist/i18n/index.js +1 -1
  30. package/dist/index.d.ts +5 -4
  31. package/dist/index.js +892 -199
  32. package/dist/index.js.map +1 -1
  33. package/dist/plan-decision-ops.d.ts +1 -1
  34. package/dist/workbench/contribution.js +1 -1
  35. package/dist/workbench/index.js +1 -1
  36. package/dist/workspace-agent-generated-files.js +2 -2
  37. package/dist/{workspaceLinkActions-CqWZaCY4.d.ts → workspaceLinkActions-C6POH38D.d.ts} +7 -1
  38. package/package.json +12 -12
  39. package/dist/chunk-AFTAFV2C.js.map +0 -1
  40. package/dist/chunk-FG66NW5M.js.map +0 -1
  41. package/dist/chunk-J2DMJREM.js.map +0 -1
  42. package/dist/chunk-MFWZKYZ4.js.map +0 -1
  43. package/dist/chunk-RQ3HEF42.js.map +0 -1
  44. package/dist/chunk-SGQ4C7JE.js.map +0 -1
  45. /package/dist/{chunk-WPWZKKKV.js.map → chunk-RUO6SDNC.js.map} +0 -0
  46. /package/dist/{chunk-OOQIJXCA.js.map → chunk-SV4UKLJO.js.map} +0 -0
  47. /package/dist/{chunk-RDCBACWR.js.map → chunk-TCKH7GZ6.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getOptionalAgentHostApi,
3
3
  useOptionalAgentHostApi
4
- } from "./chunk-SGQ4C7JE.js";
4
+ } from "./chunk-2ADVHCST.js";
5
5
  import {
6
6
  useTranslation
7
- } from "./chunk-RQ3HEF42.js";
7
+ } from "./chunk-TQFYX7KY.js";
8
8
  import {
9
9
  resolveAgentWorkspaceFileVisualKind
10
10
  } from "./chunk-PJP5BUU6.js";
@@ -312,16 +312,20 @@ function resolveWebsiteNavigationUrl(rawUrl) {
312
312
  // actions/workspaceLinkActions.ts
313
313
  import { parseRichTextMentionHref } from "@tutti-os/ui-rich-text/core";
314
314
  var URL_LIKE_LINK_PATTERN = /^[a-zA-Z][a-zA-Z\d+.-]*:|^#/;
315
+ var LOCAL_ASSET_ROOT = "/var/cache/tsh/local-assets";
315
316
  function resolveWorkspaceFilePathCandidate({
316
317
  path,
317
318
  workspaceRoot,
318
319
  basePath
319
320
  }) {
320
321
  const rawPath = decodeWorkspaceLinkPath(path.trim());
321
- if (!rawPath || isUrlLikeWorkspaceFilePath(rawPath)) {
322
+ if (!rawPath || isUrlLikeWorkspaceFilePath(rawPath) || isUncWorkspaceFilePath(rawPath)) {
322
323
  return null;
323
324
  }
324
325
  const normalizedPath = normalizeWorkspaceFilePath(rawPath);
326
+ if (isUnsupportedSpecialWorkspaceFilePath(normalizedPath)) {
327
+ return null;
328
+ }
325
329
  if (isAbsoluteLocalPath(normalizedPath) && (isDirectAgentGeneratedMediaPath(normalizedPath) || isDirectWorkspaceAppDataPath(normalizedPath))) {
326
330
  const directoryPath = dirname(normalizedPath);
327
331
  return {
@@ -334,6 +338,14 @@ function resolveWorkspaceFilePathCandidate({
334
338
  if (!root) {
335
339
  return null;
336
340
  }
341
+ if (isAbsoluteLocalPath(normalizedPath)) {
342
+ const directoryPath = dirname(normalizedPath);
343
+ return {
344
+ path: normalizedPath,
345
+ directoryPath,
346
+ workspaceRoot: root
347
+ };
348
+ }
337
349
  const base = normalizeWorkspaceFilePath(basePath?.trim() || root);
338
350
  const resolvedPath = isAbsoluteLocalPath(normalizedPath) ? normalizedPath : normalizeWorkspaceFilePath(`${base}/${normalizedPath}`);
339
351
  if (!isInsideOrEqual(resolvedPath, root) && !isDirectAgentGeneratedMediaPath(resolvedPath)) {
@@ -367,6 +379,28 @@ function resolveWorkspaceFileLinkAction({
367
379
  source
368
380
  };
369
381
  }
382
+ function resolveLocalAssetPreviewLinkAction({
383
+ path,
384
+ source
385
+ }) {
386
+ const rawPath = decodeWorkspaceLinkPath(path.trim());
387
+ if (!rawPath || isUrlLikeWorkspaceFilePath(rawPath)) {
388
+ return null;
389
+ }
390
+ const resolvedPath = normalizeWorkspaceFilePath(rawPath);
391
+ if (resolvedPath === LOCAL_ASSET_ROOT || !isInsideOrEqual(resolvedPath, LOCAL_ASSET_ROOT)) {
392
+ return null;
393
+ }
394
+ if (resolvedPath.endsWith(".metadata.json")) {
395
+ return null;
396
+ }
397
+ return {
398
+ type: "open-local-asset-preview",
399
+ path: resolvedPath,
400
+ name: basename(resolvedPath),
401
+ source
402
+ };
403
+ }
370
404
  function resolveWorkspaceUrlLinkAction({
371
405
  url,
372
406
  source
@@ -451,6 +485,9 @@ function resolveWorkspaceLinkAction({
451
485
  workspaceRoot,
452
486
  basePath,
453
487
  source
488
+ }) ?? resolveLocalAssetPreviewLinkAction({
489
+ path: href,
490
+ source
454
491
  }) ?? resolveWorkspaceUrlLinkAction({ url: href, source });
455
492
  }
456
493
  function normalizeWorkspaceFilePath(path) {
@@ -492,6 +529,32 @@ function isAbsoluteLocalPath(path) {
492
529
  function isWindowsAbsolutePath(path) {
493
530
  return /^[A-Za-z]:\//.test(path);
494
531
  }
532
+ function isUncWorkspaceFilePath(path) {
533
+ return /^(?:\\\\|\/\/)[^/\\]+[/\\][^/\\]+/.test(path);
534
+ }
535
+ function isUnsupportedSpecialWorkspaceFilePath(path) {
536
+ const comparisonPath = cleanWorkspaceFilePathForComparison(path);
537
+ return comparisonPath === "/dev/null" || comparisonPath.split("/").some((segment) => {
538
+ const normalized = segment.trim().replace(/[. ]+$/g, "");
539
+ const deviceName = normalized.split(".", 1)[0]?.toUpperCase();
540
+ return deviceName === "NUL";
541
+ });
542
+ }
543
+ function cleanWorkspaceFilePathForComparison(path) {
544
+ const normalized = path.replace(/\/+/g, "/");
545
+ const parts = [];
546
+ for (const part of normalized.split("/")) {
547
+ if (!part || part === ".") {
548
+ continue;
549
+ }
550
+ if (part === "..") {
551
+ parts.pop();
552
+ continue;
553
+ }
554
+ parts.push(part);
555
+ }
556
+ return normalized.startsWith("/") ? `/${parts.join("/")}` : parts.join("/");
557
+ }
495
558
  function decodeWorkspaceLinkPath(path) {
496
559
  if (!path.includes("%")) {
497
560
  return path;
@@ -509,6 +572,9 @@ function dirname(path) {
509
572
  }
510
573
  return path.slice(0, index);
511
574
  }
575
+ function basename(path) {
576
+ return path.split("/").filter(Boolean).at(-1) ?? path;
577
+ }
512
578
  function isInsideOrEqual(path, root) {
513
579
  if (root === "/") {
514
580
  return path.startsWith("/");
@@ -1369,8 +1435,8 @@ function resolveWorkspaceFileMentionEntryKind(path, label, explicitKind) {
1369
1435
  if (resolveWorkspaceFileExtension(path)) {
1370
1436
  return "file";
1371
1437
  }
1372
- const basename = basenameWorkspacePath(path);
1373
- return basename === label ? "directory" : "file";
1438
+ const basename2 = basenameWorkspacePath(path);
1439
+ return basename2 === label ? "directory" : "file";
1374
1440
  }
1375
1441
  function parseWorkspaceFileMentionLink(href, rawLabel) {
1376
1442
  const label = rawLabel.trim();
@@ -1638,7 +1704,7 @@ function MarkdownMedia({
1638
1704
  playsInline: true,
1639
1705
  preload: "metadata",
1640
1706
  className: cn(
1641
- "block max-h-[360px] max-w-full rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)]",
1707
+ "mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)]",
1642
1708
  className
1643
1709
  )
1644
1710
  }
@@ -1680,7 +1746,7 @@ function MarkdownMedia({
1680
1746
  playsInline: true,
1681
1747
  preload: "metadata",
1682
1748
  className: cn(
1683
- "block max-h-[360px] max-w-full rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)]",
1749
+ "mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)]",
1684
1750
  className
1685
1751
  )
1686
1752
  }
@@ -1695,7 +1761,7 @@ function MarkdownMedia({
1695
1761
  alt,
1696
1762
  title,
1697
1763
  className: cn(
1698
- "block max-h-[360px] max-w-full rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] object-contain",
1764
+ "mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)] object-contain",
1699
1765
  className
1700
1766
  )
1701
1767
  }
@@ -1709,20 +1775,20 @@ function MarkdownMedia({
1709
1775
  alt,
1710
1776
  title,
1711
1777
  className: cn(
1712
- "block max-h-[360px] max-w-full rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] object-contain",
1778
+ "mt-2 block max-h-[360px] max-w-full rounded-[8px] bg-[var(--transparency-block)] object-contain",
1713
1779
  className
1714
1780
  ),
1715
1781
  wrapElement: "span"
1716
1782
  }
1717
1783
  );
1718
1784
  }
1719
- return /* @__PURE__ */ jsx2("span", { className: "flex min-h-[160px] w-full items-center justify-center rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] px-5 py-5 text-center text-[13px] leading-5 text-[var(--text-tertiary)]", children: state?.status === "error" ? state.reason === "unsupported" ? t("agentHost.workspaceFileManager.previewUnsupported") : t("agentHost.workspaceFileManager.previewReadFailed", {
1785
+ return /* @__PURE__ */ jsx2("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)]", children: state?.status === "error" ? state.reason === "unsupported" ? t("agentHost.workspaceFileManager.previewUnsupported") : t("agentHost.workspaceFileManager.previewReadFailed", {
1720
1786
  message: state.detail ?? ""
1721
1787
  }) : t("agentHost.workspaceFileManager.previewLoading") });
1722
1788
  }
1723
1789
  function UnsupportedMarkdownMediaPreview() {
1724
1790
  const { t } = useTranslation();
1725
- return /* @__PURE__ */ jsx2("span", { className: "flex min-h-[160px] w-full items-center justify-center rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] px-5 py-5 text-center text-[13px] leading-5 text-[var(--text-tertiary)]", children: t("agentHost.workspaceFileManager.previewUnsupported") });
1791
+ return /* @__PURE__ */ jsx2("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)]", children: t("agentHost.workspaceFileManager.previewUnsupported") });
1726
1792
  }
1727
1793
  var MARKDOWN_ORDERED_LIST_STYLE = {
1728
1794
  listStylePosition: "outside",
@@ -2668,4 +2734,4 @@ export {
2668
2734
  CustomScrollArea,
2669
2735
  MessageSquareMoreIcon
2670
2736
  };
2671
- //# sourceMappingURL=chunk-AFTAFV2C.js.map
2737
+ //# sourceMappingURL=chunk-XPVYQUFK.js.map
@@ -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 (\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 resolveWorkspaceFileLinkAction({\n path: href,\n workspaceRoot,\n basePath,\n source\n }) ??\n resolveLocalAssetPreviewLinkAction({\n path: href,\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\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"]}