agent-relay-server 0.56.1 → 0.57.0

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 (133) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +1 -1
  3. package/public/assets/MessageBubble-DmZIqnga.js +2 -0
  4. package/public/assets/MessageBubble-DmZIqnga.js.map +1 -0
  5. package/public/assets/{PlanGraphPanel-t6z17_F-.js → PlanGraphPanel-DpTMkCBs.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-t6z17_F-.js.map → PlanGraphPanel-DpTMkCBs.js.map} +1 -1
  7. package/public/assets/activity-D_3n1maA.js +2 -0
  8. package/public/assets/activity-D_3n1maA.js.map +1 -0
  9. package/public/assets/{agent-profiles-CJHcCleo.js → agent-profiles-Bp-KhfLJ.js} +2 -2
  10. package/public/assets/{agent-profiles-CJHcCleo.js.map → agent-profiles-Bp-KhfLJ.js.map} +1 -1
  11. package/public/assets/agents-CHG09FED.js +2 -0
  12. package/public/assets/{agents-BczawaJ7.js.map → agents-CHG09FED.js.map} +1 -1
  13. package/public/assets/{analytics-51jcEZ4R.js → analytics-DadE7J8c.js} +3 -3
  14. package/public/assets/{analytics-51jcEZ4R.js.map → analytics-DadE7J8c.js.map} +1 -1
  15. package/public/assets/{automation-BRl5BbIl.js → automation-Da7hPlwY.js} +2 -2
  16. package/public/assets/{automation-BRl5BbIl.js.map → automation-Da7hPlwY.js.map} +1 -1
  17. package/public/assets/{badge-D6yb-Kia.js → badge-DBZY8x3C.js} +2 -2
  18. package/public/assets/{badge-D6yb-Kia.js.map → badge-DBZY8x3C.js.map} +1 -1
  19. package/public/assets/branch-state-badge-BIFdTVFP.js +2 -0
  20. package/public/assets/{branch-state-badge-DkCwWKxU.js.map → branch-state-badge-BIFdTVFP.js.map} +1 -1
  21. package/public/assets/{button-B-w6a1Ng.js → button-ClDtrv2m.js} +2 -2
  22. package/public/assets/{button-B-w6a1Ng.js.map → button-ClDtrv2m.js.map} +1 -1
  23. package/public/assets/card-Du4YivOo.js +2 -0
  24. package/public/assets/{card-j6bjYxys.js.map → card-Du4YivOo.js.map} +1 -1
  25. package/public/assets/{channels-DjZE9UAA.js → channels-CTkaNTj3.js} +2 -2
  26. package/public/assets/{channels-DjZE9UAA.js.map → channels-CTkaNTj3.js.map} +1 -1
  27. package/public/assets/chat-EaifCGGe.js +2 -0
  28. package/public/assets/chat-EaifCGGe.js.map +1 -0
  29. package/public/assets/{connectors-C6NqJ7b9.js → connectors-CIMZt48i.js} +2 -2
  30. package/public/assets/{connectors-C6NqJ7b9.js.map → connectors-CIMZt48i.js.map} +1 -1
  31. package/public/assets/{copy-button-CJDmQ9UB.js → copy-button-DXWhNsIl.js} +2 -2
  32. package/public/assets/{copy-button-CJDmQ9UB.js.map → copy-button-DXWhNsIl.js.map} +1 -1
  33. package/public/assets/display-D6H3VZ53.js +3 -0
  34. package/public/assets/{display-CXhnBwGf.js.map → display-D6H3VZ53.js.map} +1 -1
  35. package/public/assets/{dist-DLc4vQoq.js → dist-AopAI8S8.js} +2 -2
  36. package/public/assets/{dist-DLc4vQoq.js.map → dist-AopAI8S8.js.map} +1 -1
  37. package/public/assets/{dist-1iqvQR2q.js → dist-B7p3TbNs.js} +2 -2
  38. package/public/assets/{dist-1iqvQR2q.js.map → dist-B7p3TbNs.js.map} +1 -1
  39. package/public/assets/dist-BX1qUU9z.js +2 -0
  40. package/public/assets/{dist-D1g0W-kO.js.map → dist-BX1qUU9z.js.map} +1 -1
  41. package/public/assets/{dist-HMkrkMzb.js → dist-BafqksRv.js} +2 -2
  42. package/public/assets/{dist-HMkrkMzb.js.map → dist-BafqksRv.js.map} +1 -1
  43. package/public/assets/{dist-CLUvHFPE.js → dist-C0PA00sq.js} +2 -2
  44. package/public/assets/{dist-CLUvHFPE.js.map → dist-C0PA00sq.js.map} +1 -1
  45. package/public/assets/{dist-BtFzbpiK.js → dist-C6ROz7Mo.js} +2 -2
  46. package/public/assets/{dist-BtFzbpiK.js.map → dist-C6ROz7Mo.js.map} +1 -1
  47. package/public/assets/dist-DEYe1tib.js +2 -0
  48. package/public/assets/{dist-MX7mVzej.js.map → dist-DEYe1tib.js.map} +1 -1
  49. package/public/assets/{dist-Cl4PfJEy.js → dist-DhkQna4j.js} +2 -2
  50. package/public/assets/{dist-Cl4PfJEy.js.map → dist-DhkQna4j.js.map} +1 -1
  51. package/public/assets/{dist-BNF6RqQf.js → dist-GEKfMylz.js} +2 -2
  52. package/public/assets/{dist-BNF6RqQf.js.map → dist-GEKfMylz.js.map} +1 -1
  53. package/public/assets/dist-T7h6jNA1.js +2 -0
  54. package/public/assets/{dist-fe-f7EIl.js.map → dist-T7h6jNA1.js.map} +1 -1
  55. package/public/assets/{dist-Bg5mAaEO.js → dist-edv2cbLj.js} +2 -2
  56. package/public/assets/{dist-Bg5mAaEO.js.map → dist-edv2cbLj.js.map} +1 -1
  57. package/public/assets/{es2015-4dO99MHc.js → es2015-DwZxGtk9.js} +2 -2
  58. package/public/assets/{es2015-4dO99MHc.js.map → es2015-DwZxGtk9.js.map} +1 -1
  59. package/public/assets/{formatted-body-impl-Di5UKdAK.js → formatted-body-impl-CDwuhxYD.js} +2 -2
  60. package/public/assets/{formatted-body-impl-Di5UKdAK.js.map → formatted-body-impl-CDwuhxYD.js.map} +1 -1
  61. package/public/assets/index-DG_cFJIA.js +21 -0
  62. package/public/assets/{index-BkTS7n6i.js.map → index-DG_cFJIA.js.map} +1 -1
  63. package/public/assets/index-wugqmbGk.css +2 -0
  64. package/public/assets/{input-EazHb1Bc.js → input-DFZRjj8b.js} +2 -2
  65. package/public/assets/{input-EazHb1Bc.js.map → input-DFZRjj8b.js.map} +1 -1
  66. package/public/assets/{insights-yGNR7sFf.js → insights-DqaWxMEv.js} +2 -2
  67. package/public/assets/{insights-yGNR7sFf.js.map → insights-DqaWxMEv.js.map} +1 -1
  68. package/public/assets/{integrations-D4kxSEy-.js → integrations-g0NS0UqB.js} +2 -2
  69. package/public/assets/{integrations-D4kxSEy-.js.map → integrations-g0NS0UqB.js.map} +1 -1
  70. package/public/assets/{lib-C7poqE0I.js → lib-Kn4-gfGD.js} +3 -3
  71. package/public/assets/{lib-C7poqE0I.js.map → lib-Kn4-gfGD.js.map} +1 -1
  72. package/public/assets/lucide-react-C3j5Huiw.js +9 -0
  73. package/public/assets/{lucide-react-Dr0-sUx6.js.map → lucide-react-C3j5Huiw.js.map} +1 -1
  74. package/public/assets/{maintenance-98rdI-6s.js → maintenance-B1ipDm3t.js} +2 -2
  75. package/public/assets/{maintenance-98rdI-6s.js.map → maintenance-B1ipDm3t.js.map} +1 -1
  76. package/public/assets/{managed-agents-Blqf_rE8.js → managed-agents-DHft-J93.js} +2 -2
  77. package/public/assets/{managed-agents-Blqf_rE8.js.map → managed-agents-DHft-J93.js.map} +1 -1
  78. package/public/assets/{markdown-preview-impl-Clu1Hd9b.js → markdown-preview-impl-Dk0jta-N.js} +2 -2
  79. package/public/assets/{markdown-preview-impl-Clu1Hd9b.js.map → markdown-preview-impl-Dk0jta-N.js.map} +1 -1
  80. package/public/assets/memory-Cc_14vr4.js +2 -0
  81. package/public/assets/{memory-ChZ_PZcL.js.map → memory-Cc_14vr4.js.map} +1 -1
  82. package/public/assets/{messages-CyBHlH3X.js → messages-gSUwhZbt.js} +2 -2
  83. package/public/assets/{messages-CyBHlH3X.js.map → messages-gSUwhZbt.js.map} +1 -1
  84. package/public/assets/{orchestrators-CXheJry0.js → orchestrators-D7RL2Vdm.js} +2 -2
  85. package/public/assets/{orchestrators-CXheJry0.js.map → orchestrators-D7RL2Vdm.js.map} +1 -1
  86. package/public/assets/{overview-CexxD3i_.js → overview-PP2eD4_Y.js} +2 -2
  87. package/public/assets/{overview-CexxD3i_.js.map → overview-PP2eD4_Y.js.map} +1 -1
  88. package/public/assets/{pairs-CyWA2hgv.js → pairs-DhF9MXdu.js} +2 -2
  89. package/public/assets/{pairs-CyWA2hgv.js.map → pairs-DhF9MXdu.js.map} +1 -1
  90. package/public/assets/{react-dom-CQSYEHV9.js → react-dom-2FP7-B7N.js} +2 -2
  91. package/public/assets/{react-dom-CQSYEHV9.js.map → react-dom-2FP7-B7N.js.map} +1 -1
  92. package/public/assets/{security-DPmii6iO.js → security-CwMaW5CQ.js} +2 -2
  93. package/public/assets/{security-DPmii6iO.js.map → security-CwMaW5CQ.js.map} +1 -1
  94. package/public/assets/{select-DoUMYuss.js → select-CifGD5oc.js} +2 -2
  95. package/public/assets/{select-DoUMYuss.js.map → select-CifGD5oc.js.map} +1 -1
  96. package/public/assets/{settings-BY5NKG12.js → settings-Cc8EgRR7.js} +4 -4
  97. package/public/assets/{settings-BY5NKG12.js.map → settings-Cc8EgRR7.js.map} +1 -1
  98. package/public/assets/store-DKtaJZyC.js +9 -0
  99. package/public/assets/store-DKtaJZyC.js.map +1 -0
  100. package/public/assets/tasks-Boji1e5w.js +2 -0
  101. package/public/assets/{tasks-CaLlDeQp.js.map → tasks-Boji1e5w.js.map} +1 -1
  102. package/public/assets/{teams-CwQWfJmq.js → teams-DJVSjs4x.js} +2 -2
  103. package/public/assets/{teams-CwQWfJmq.js.map → teams-DJVSjs4x.js.map} +1 -1
  104. package/public/assets/{terminal-viewer-impl-55yoIVx1.js → terminal-viewer-impl-DdbGJg-X.js} +3 -3
  105. package/public/assets/{terminal-viewer-impl-55yoIVx1.js.map → terminal-viewer-impl-DdbGJg-X.js.map} +1 -1
  106. package/public/assets/{use-keyboard-viewport-Iaz6IT4p.js → use-keyboard-viewport-BUkrw3Gx.js} +2 -2
  107. package/public/assets/{use-keyboard-viewport-Iaz6IT4p.js.map → use-keyboard-viewport-BUkrw3Gx.js.map} +1 -1
  108. package/public/assets/work-queue-BKsEKdR7.js +2 -0
  109. package/public/assets/{work-queue-DH_hp0Gu.js.map → work-queue-BKsEKdR7.js.map} +1 -1
  110. package/public/assets/{workspaces-XuAhwZ6W.js → workspaces-BTJ2O87P.js} +3 -3
  111. package/public/assets/{workspaces-XuAhwZ6W.js.map → workspaces-BTJ2O87P.js.map} +1 -1
  112. package/public/index.html +22 -22
  113. package/src/db/message-reads.ts +49 -0
  114. package/src/services/register-agent.ts +6 -3
  115. package/public/assets/activity-anAr97B0.js +0 -2
  116. package/public/assets/activity-anAr97B0.js.map +0 -1
  117. package/public/assets/agents-BczawaJ7.js +0 -2
  118. package/public/assets/branch-state-badge-DkCwWKxU.js +0 -2
  119. package/public/assets/card-j6bjYxys.js +0 -2
  120. package/public/assets/chat-CFMbtVhP.js +0 -2
  121. package/public/assets/chat-CFMbtVhP.js.map +0 -1
  122. package/public/assets/display-CXhnBwGf.js +0 -3
  123. package/public/assets/dist-D1g0W-kO.js +0 -2
  124. package/public/assets/dist-MX7mVzej.js +0 -2
  125. package/public/assets/dist-fe-f7EIl.js +0 -2
  126. package/public/assets/index-BkTS7n6i.js +0 -21
  127. package/public/assets/index-D7FDcoef.css +0 -2
  128. package/public/assets/lucide-react-Dr0-sUx6.js +0 -9
  129. package/public/assets/memory-ChZ_PZcL.js +0 -2
  130. package/public/assets/store-DcxNQduq.js +0 -9
  131. package/public/assets/store-DcxNQduq.js.map +0 -1
  132. package/public/assets/tasks-CaLlDeQp.js +0 -2
  133. package/public/assets/work-queue-DH_hp0Gu.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"formatted-body-impl-Di5UKdAK.js","names":[],"sources":["../../dashboard/src/components/shared/formatted-body-impl.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize'\nimport remarkGfm from 'remark-gfm'\nimport { CodePreview } from './code-preview'\nimport { cn } from '@/lib/utils'\nimport { parseJsonBody } from '@/lib/display'\n\nexport interface FormattedBodyProps {\n text: string\n rawBody?: string\n className?: string\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n}\n\nconst LINK_RE = /(https?:\\/\\/[^\\s`'\")\\]]+)|((?:\\/[\\w.@+-][^\\s`'\")\\]]*|(?:\\.{1,2}\\/|[\\w.@+-]+\\/)[^\\s`'\")\\]]*))/g\nconst TRAILING_PUNCTUATION = /[.,;:!?]+$/\nconst KNOWN_PROJECT_DIRS = new Set(['src', 'app', 'apps', 'lib', 'server', 'client', 'dashboard', 'orchestrator', 'runner', 'sdk', 'codex', 'claude', 'public', 'docs', 'test', 'tests', 'scripts', 'config', 'configs'])\n\nconst markdownSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [\n ...(defaultSchema.attributes?.code || []),\n ['className', /^language-[\\w-]+$/],\n ],\n },\n}\n\nfunction looksLikeFilePath(path: string): boolean {\n if (path === '/api' || path.startsWith('/api/')) return false\n if (path.startsWith('/')) return true\n if (path.startsWith('./') || path.startsWith('../')) return true\n const segments = path.split('/').filter(Boolean)\n const first = segments[0] ?? ''\n const last = segments[segments.length - 1] ?? ''\n if (first.startsWith('.')) return true\n if (KNOWN_PROJECT_DIRS.has(first)) return true\n return last.includes('.')\n}\n\nfunction linkParts(text: string): Array<{ text: string; path?: string; url?: string; line?: number }> {\n const parts: Array<{ text: string; path?: string; url?: string; line?: number }> = []\n let cursor = 0\n for (const match of text.matchAll(LINK_RE)) {\n const rawUrl = match[1]\n const rawPath = match[2]\n const raw = rawUrl || rawPath\n const index = match.index ?? 0\n if (!raw || index < cursor) continue\n\n if (rawUrl) {\n const url = rawUrl.replace(TRAILING_PUNCTUATION, '')\n const trimmed = rawUrl.slice(url.length)\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: url, url })\n if (trimmed) parts.push({ text: trimmed })\n cursor = index + rawUrl.length\n continue\n }\n\n if (!raw.includes('/')) continue\n let path = raw.replace(TRAILING_PUNCTUATION, '')\n const trimmed = raw.slice(path.length)\n const lineMatch = path.match(/^(.*):(\\d+)$/)\n const line = lineMatch ? Number(lineMatch[2]) : undefined\n if (lineMatch) path = lineMatch[1]!\n if (!looksLikeFilePath(path)) continue\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: path, path, line: Number.isFinite(line) ? line : undefined })\n if (trimmed) parts.push({ text: trimmed })\n cursor = index + raw.length\n }\n if (cursor < text.length) parts.push({ text: text.slice(cursor) })\n return parts\n}\n\nfunction TextWithLinks({\n text,\n onOpenPath,\n onPreviewPath,\n onPreviewPathEnd,\n isPathLinkable,\n resolvePathTitle,\n}: {\n text: string\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n}) {\n const parts = linkParts(text)\n if (parts.length === 1 && !parts[0]?.path && !parts[0]?.url) return <>{text}</>\n return (\n <>\n {parts.map((part, index) => {\n if (part.url) {\n return (\n <a\n key={`${part.url}-${index}`}\n href={part.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"underline decoration-dotted underline-offset-2 hover:text-primary\"\n onClick={(e) => e.stopPropagation()}\n >\n {part.text}\n </a>\n )\n }\n if (part.path && onOpenPath) {\n if (isPathLinkable && !isPathLinkable(part.path, part.line)) return <span key={`${part.path}-${index}`}>{part.text}{part.line ? `:${part.line}` : ''}</span>\n const resolvedTitle = resolvePathTitle?.(part.path, part.line)\n return (\n <button\n key={`${part.path}-${index}`}\n type=\"button\"\n className=\"rounded-sm font-mono underline decoration-dotted underline-offset-2 hover:text-primary\"\n onClick={(e) => { e.stopPropagation(); onOpenPath(part.path!, part.line) }}\n onMouseEnter={(e) => onPreviewPath?.(part.path!, part.line, e.currentTarget.getBoundingClientRect())}\n onFocus={(e) => onPreviewPath?.(part.path!, part.line, e.currentTarget.getBoundingClientRect())}\n onMouseLeave={() => onPreviewPathEnd?.()}\n onBlur={() => onPreviewPathEnd?.()}\n title={resolvedTitle ? `Open ${resolvedTitle}` : 'Open file'}\n >\n {part.text}{part.line ? `:${part.line}` : ''}\n </button>\n )\n }\n return <span key={index}>{part.text}</span>\n })}\n </>\n )\n}\n\nfunction processTextChildren(\n children: React.ReactNode,\n onOpenPath?: (path: string, line?: number) => void,\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void,\n onPreviewPathEnd?: () => void,\n isPathLinkable?: (path: string, line?: number) => boolean,\n resolvePathTitle?: (path: string, line?: number) => string | undefined,\n): React.ReactNode {\n return React.Children.map(children, (child) =>\n typeof child === 'string'\n ? <TextWithLinks text={child} onOpenPath={onOpenPath} onPreviewPath={onPreviewPath} onPreviewPathEnd={onPreviewPathEnd} isPathLinkable={isPathLinkable} resolvePathTitle={resolvePathTitle} />\n : child\n )\n}\n\nexport function FormattedBody({ text, rawBody, className, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle }: FormattedBodyProps) {\n const parsed = useMemo(() => parseJsonBody(rawBody || ''), [rawBody])\n const content = unescapeNewlines(parsed ? parsed.text : text)\n\n const components = useMemo(() => ({\n p({ children }: { children?: React.ReactNode }) {\n return <p>{processTextChildren(children, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle)}</p>\n },\n li({ children }: { children?: React.ReactNode }) {\n return <li>{processTextChildren(children, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle)}</li>\n },\n a({ href, children }: { href?: string; children?: React.ReactNode }) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" onClick={(e) => e.stopPropagation()}>\n {children}\n </a>\n )\n },\n code({ className: codeClass, children }: { className?: string; children?: React.ReactNode }) {\n const match = /language-([\\w-]+)/.exec(codeClass || '')\n const code = String(children).replace(/\\n$/, '')\n if (match) {\n return <CodePreview content={code} path={`.${match[1]}`} languageHint={match[1]} compact />\n }\n return <code className={codeClass}>{children}</code>\n },\n }), [onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle])\n\n return (\n <div className={className}>\n <div className=\"chat-markdown\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[[rehypeSanitize, markdownSchema]]} components={components}>\n {content}\n </ReactMarkdown>\n </div>\n {parsed && parsed.meta.length > 0 && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {parsed.meta.map(([k, v]) => (\n <span key={k} className=\"inline-flex text-[10px] leading-tight bg-muted px-1.5 py-0.5 rounded text-muted-foreground font-mono\">\n {k}: {v}\n </span>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction unescapeNewlines(text: string): string {\n if (!text.includes('\\\\n')) return text\n return text.replace(/\\\\n/g, '\\n')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"formatted-body-impl-CDwuhxYD.js","names":[],"sources":["../../dashboard/src/components/shared/formatted-body-impl.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize'\nimport remarkGfm from 'remark-gfm'\nimport { CodePreview } from './code-preview'\nimport { cn } from '@/lib/utils'\nimport { parseJsonBody } from '@/lib/display'\n\nexport interface FormattedBodyProps {\n text: string\n rawBody?: string\n className?: string\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n}\n\nconst LINK_RE = /(https?:\\/\\/[^\\s`'\")\\]]+)|((?:\\/[\\w.@+-][^\\s`'\")\\]]*|(?:\\.{1,2}\\/|[\\w.@+-]+\\/)[^\\s`'\")\\]]*))/g\nconst TRAILING_PUNCTUATION = /[.,;:!?]+$/\nconst KNOWN_PROJECT_DIRS = new Set(['src', 'app', 'apps', 'lib', 'server', 'client', 'dashboard', 'orchestrator', 'runner', 'sdk', 'codex', 'claude', 'public', 'docs', 'test', 'tests', 'scripts', 'config', 'configs'])\n\nconst markdownSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [\n ...(defaultSchema.attributes?.code || []),\n ['className', /^language-[\\w-]+$/],\n ],\n },\n}\n\nfunction looksLikeFilePath(path: string): boolean {\n if (path === '/api' || path.startsWith('/api/')) return false\n if (path.startsWith('/')) return true\n if (path.startsWith('./') || path.startsWith('../')) return true\n const segments = path.split('/').filter(Boolean)\n const first = segments[0] ?? ''\n const last = segments[segments.length - 1] ?? ''\n if (first.startsWith('.')) return true\n if (KNOWN_PROJECT_DIRS.has(first)) return true\n return last.includes('.')\n}\n\nfunction linkParts(text: string): Array<{ text: string; path?: string; url?: string; line?: number }> {\n const parts: Array<{ text: string; path?: string; url?: string; line?: number }> = []\n let cursor = 0\n for (const match of text.matchAll(LINK_RE)) {\n const rawUrl = match[1]\n const rawPath = match[2]\n const raw = rawUrl || rawPath\n const index = match.index ?? 0\n if (!raw || index < cursor) continue\n\n if (rawUrl) {\n const url = rawUrl.replace(TRAILING_PUNCTUATION, '')\n const trimmed = rawUrl.slice(url.length)\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: url, url })\n if (trimmed) parts.push({ text: trimmed })\n cursor = index + rawUrl.length\n continue\n }\n\n if (!raw.includes('/')) continue\n let path = raw.replace(TRAILING_PUNCTUATION, '')\n const trimmed = raw.slice(path.length)\n const lineMatch = path.match(/^(.*):(\\d+)$/)\n const line = lineMatch ? Number(lineMatch[2]) : undefined\n if (lineMatch) path = lineMatch[1]!\n if (!looksLikeFilePath(path)) continue\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: path, path, line: Number.isFinite(line) ? line : undefined })\n if (trimmed) parts.push({ text: trimmed })\n cursor = index + raw.length\n }\n if (cursor < text.length) parts.push({ text: text.slice(cursor) })\n return parts\n}\n\nfunction TextWithLinks({\n text,\n onOpenPath,\n onPreviewPath,\n onPreviewPathEnd,\n isPathLinkable,\n resolvePathTitle,\n}: {\n text: string\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n}) {\n const parts = linkParts(text)\n if (parts.length === 1 && !parts[0]?.path && !parts[0]?.url) return <>{text}</>\n return (\n <>\n {parts.map((part, index) => {\n if (part.url) {\n return (\n <a\n key={`${part.url}-${index}`}\n href={part.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"underline decoration-dotted underline-offset-2 hover:text-primary\"\n onClick={(e) => e.stopPropagation()}\n >\n {part.text}\n </a>\n )\n }\n if (part.path && onOpenPath) {\n if (isPathLinkable && !isPathLinkable(part.path, part.line)) return <span key={`${part.path}-${index}`}>{part.text}{part.line ? `:${part.line}` : ''}</span>\n const resolvedTitle = resolvePathTitle?.(part.path, part.line)\n return (\n <button\n key={`${part.path}-${index}`}\n type=\"button\"\n className=\"rounded-sm font-mono underline decoration-dotted underline-offset-2 hover:text-primary\"\n onClick={(e) => { e.stopPropagation(); onOpenPath(part.path!, part.line) }}\n onMouseEnter={(e) => onPreviewPath?.(part.path!, part.line, e.currentTarget.getBoundingClientRect())}\n onFocus={(e) => onPreviewPath?.(part.path!, part.line, e.currentTarget.getBoundingClientRect())}\n onMouseLeave={() => onPreviewPathEnd?.()}\n onBlur={() => onPreviewPathEnd?.()}\n title={resolvedTitle ? `Open ${resolvedTitle}` : 'Open file'}\n >\n {part.text}{part.line ? `:${part.line}` : ''}\n </button>\n )\n }\n return <span key={index}>{part.text}</span>\n })}\n </>\n )\n}\n\nfunction processTextChildren(\n children: React.ReactNode,\n onOpenPath?: (path: string, line?: number) => void,\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void,\n onPreviewPathEnd?: () => void,\n isPathLinkable?: (path: string, line?: number) => boolean,\n resolvePathTitle?: (path: string, line?: number) => string | undefined,\n): React.ReactNode {\n return React.Children.map(children, (child) =>\n typeof child === 'string'\n ? <TextWithLinks text={child} onOpenPath={onOpenPath} onPreviewPath={onPreviewPath} onPreviewPathEnd={onPreviewPathEnd} isPathLinkable={isPathLinkable} resolvePathTitle={resolvePathTitle} />\n : child\n )\n}\n\nexport function FormattedBody({ text, rawBody, className, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle }: FormattedBodyProps) {\n const parsed = useMemo(() => parseJsonBody(rawBody || ''), [rawBody])\n const content = unescapeNewlines(parsed ? parsed.text : text)\n\n const components = useMemo(() => ({\n p({ children }: { children?: React.ReactNode }) {\n return <p>{processTextChildren(children, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle)}</p>\n },\n li({ children }: { children?: React.ReactNode }) {\n return <li>{processTextChildren(children, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle)}</li>\n },\n a({ href, children }: { href?: string; children?: React.ReactNode }) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" onClick={(e) => e.stopPropagation()}>\n {children}\n </a>\n )\n },\n code({ className: codeClass, children }: { className?: string; children?: React.ReactNode }) {\n const match = /language-([\\w-]+)/.exec(codeClass || '')\n const code = String(children).replace(/\\n$/, '')\n if (match) {\n return <CodePreview content={code} path={`.${match[1]}`} languageHint={match[1]} compact />\n }\n return <code className={codeClass}>{children}</code>\n },\n }), [onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle])\n\n return (\n <div className={className}>\n <div className=\"chat-markdown\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[[rehypeSanitize, markdownSchema]]} components={components}>\n {content}\n </ReactMarkdown>\n </div>\n {parsed && parsed.meta.length > 0 && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {parsed.meta.map(([k, v]) => (\n <span key={k} className=\"inline-flex text-[10px] leading-tight bg-muted px-1.5 py-0.5 rounded text-muted-foreground font-mono\">\n {k}: {v}\n </span>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction unescapeNewlines(text: string): string {\n if (!text.includes('\\\\n')) return text\n return text.replace(/\\\\n/g, '\\n')\n}\n"],"mappings":"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"}